Cod sursa(job #1142359)

Utilizator torckySuciu Victor torcky Data 13 martie 2014 18:57:01
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <cstdio>
using namespace std;
int h[100005],t[100005];
int find(int x){
    while(x!=t[x]){
        x=t[x];
    }
    return x;
}
void unifica(int x,int y){
    ///x si y sunt radacinile arborilor
    if(h[x]>h[y]){
        t[y]=x;
    }
    else{
        if(h[x]>h[y]){
            t[x]=y;
        }
        else{
            h[x]++;
            t[y]=x;
        }
    }
}
int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    int n,m,x,y,tx,ty,r;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        t[i]=i;
        h[i]=1;
    }
    for(int i=1;i<=m;i++){
        scanf("%d",&r);
        if(r==1){
            scanf("%d%d",&x,&y);
            tx=find(x);
            ty=find(y);
            if(tx!=ty){
                unifica(tx,ty);
            }
        }
        else{
            scanf("%d%d",&x,&y);
            if(find(x)==find(y)){
                printf("DA\n");
            }
            else{
                printf("NU\n");
            }
        }
    }
    return 0;
}