Cod sursa(job #2103613)

Utilizator valorosu_300Cristian Gherman valorosu_300 Data 10 ianuarie 2018 15:47:13
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");
const int N = 100002;
int rang[N], tata[N];
void Union(int x, int y){
    if(rang[x] > rang[y])
        tata[y] = x;
    else
        tata[x] = y;
    if(rang[x] == rang[y])
        rang[y]++;
}
int Find(int x){
    int rad, aux;
    for(rad = x;tata[rad] != rad;rad = tata[rad]);
    for(;tata[x] != x;){
        aux = tata[x];
        tata[x] = rad;
        x = aux;
    }
    return rad;
}
int main()
{
    int n,m,x,y,C,f1,f2;
    in>>n>>m;
    for(int i=1;i<=n;i++){
        rang[i] = 1;
        tata[i] = i;
    }
    for(int i=1;i<=m;i++){
        in>>C>>x>>y;
        if(C == 2){
            if(Find(x) == Find(y))
                out<<"DA\n";
            else
                out<<"NU\n";
        }
        else{
            f1 = Find(x);
            f2 = Find(y);
            if(f1 != f2)
                Union(f1,f2);
        }
    }
    in.close();
    out.close();
    return 0;
}