Cod sursa(job #602200)

Utilizator vendettaSalajan Razvan vendetta Data 9 iulie 2011 17:51:34
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <cstdio>
#include <algorithm>
#define NMAX 1000000

using namespace std;

int n, m, i, T[NMAX], rang[NMAX] ;

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;
}