Cod sursa(job #2137251)

Utilizator sebistetuCucolas Sebastian sebistetu Data 20 februarie 2018 18:07:56
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<fstream>

using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

const int MAX = 100005;

int n, m, father[MAX], level[MAX];

inline int find_root(int x){

    int i, y;

    for(i = x; father[i] != i; i = father[i]);

    while(father[x] != x){

        y = father[x];
        father[x] = i;
        x = y;
    }

    return i;
}

inline void unite(int x, int y){

    if(level[x] > level[y])
        father[y] = x;
    else
        father[x] = y;

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

void solve(){

    int cod, x, y;

    f >> n >> m;

    for(int i = 1; i <= n; i++){

        level[i] = 1;
        father[i] = i;
    }


    while(m--){

        f >> cod >> x >> y;
        if(cod == 2){
            if(find_root(x) == find_root(y))
                g << "DA" << '\n';
            else
                g << "NU" << '\n';

        }
        else{

            unite(find_root(x), find_root(y));
        }
    }
}

int main(){

    solve();
}