Cod sursa(job #602199)

Utilizator vendettaSalajan Razvan vendetta Data 9 iulie 2011 17:48:24
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <cstdio>
#include <algorithm>

using namespace std;

pair < int,int> Ml[100000];
int n, m, i, j, x, y, T[100000], rang[100000] ;

int multime (int i){
    if (T[i]==i) return i;
    else multime(T[i]);
}

void reuneste(int i, int j){
    i = multime(i);
    j = multime(j);
    if (i==j) return;
    if (rang[i]>rang[j]) T[j]=i;
    else T[i]=j;
    if(rang[i]==rang[j]) ++rang[i];
}

int main(){
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    scanf("%d%d",&n,&m);

    for (i=1;i<=n;i++) rang[i]=0,T[i]=i;

    for(i=1;i<=m;i++){
        int tip, x, y;
        scanf("%d%d%d",&tip,&x,&y);
        if (tip==1) reuneste(x,y);
        if (tip==2){ if(multime(x)==multime(y)) printf("DA\n"); else printf("NU\n");}
    }
    return 0;
}