Cod sursa(job #2646075)

Utilizator Ionut2791Voicila Ionut Marius Ionut2791 Data 30 august 2020 19:06:31
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <stdio.h>
#include <fstream>
#include <iostream>
using namespace std;

const int NLIM = 100005;

int graf[NLIM], rang[NLIM];
int n, m;

int findd(int nod){

    int nextnod, y;
    //cout << nextnod << " " << graf[nextnod] << "\n";
    for(nextnod = nod; graf[nextnod] != nextnod; nextnod = graf[nextnod]){
       // cout << nextnod << " " << graf[nextnod] << "\n";
    }

    for(; graf[nod] != nod;){

        y = graf[nod];
        graf[nod] = nextnod;
        nod = y;
    }

    return nextnod;
}

void unit(int x, int y){

    if(rang[x] > rang[y])
        graf[y] = x;
    else
        graf[x] = y;

    if(rang[x] == rang[y])
        ++rang[y];
}

int main() {
    //ifstream fin("date.in");
    ifstream fin("disjoint.in");
    ofstream fout("disjoint.out");
    fin >> n >> m;

    for(int i = 1; i <= n; ++i){
        graf[i] = i;
        rang[i] = 1;
    }

    for(int i = 1; i <= m; ++i){
        int cod, x, y;
        fin >> cod >> x >> y;

        if(cod == 1){
            if(findd(x) != findd(y))
                unit(findd(x), findd(y));
        }
        else{
            if(findd(x) == findd(y))
                fout << "DA" << "\n";
            else
                fout << "NU" << "\n";
        }

        /*for(int i =1; i <= n; ++i)
            cout << graf[i] << " ";
        cout << "\n";
        for(int i =1; i <= n; ++i)
            cout << rang[i] << " ";
        cout << "\n";*/


    }


    return 0;
}