Cod sursa(job #2235991)

Utilizator lupulescu2001Lupulescu Vlad lupulescu2001 Data 27 august 2018 16:11:10
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include<fstream>

using namespace std;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

int Leg[100005],R[100005],N,M;

int Find(int X){
    int K,i;
    for(i=X;i!=Leg[i];i=Leg[i]);
    while(Leg[X]!=X){
        K=Leg[X];
        Leg[X]=i;
        X=K;
    }
    return i;
}

int Unire(int X,int Y){
    if(R[X]>R[Y])
        Leg[Y]=X;
    else
        Leg[X]=Y;
    if(R[X]==R[Y])
        R[Y]++;
}

int main(){
    fin>>N>>M;
    for(int i=1;i<=N;i++){
        R[i]=1;
        Leg[i]=i;
    }
    for(int i=1;i<=M;i++){
        int X,Y,Z;
        fin>>X>>Y>>Z;
        if(X==1){
            if(Find(Y)!=Find(Z))
            Unire(Find(Y),Find(Z));
        }
        else{
            if(Find(Y)==Find(Z))
                fout<<"DA\n";
            else
                fout<<"NU\n";
        }
    }
}