Cod sursa(job #269604)

Utilizator mihai0110Bivol Mihai mihai0110 Data 3 martie 2009 09:09:43
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<stdio.h>
#define MAXN 100001

int i,n,a,b,x,y,m,c;
int tata[MAXN],rang[MAXN];

int rad(int x)
{
    int z,y=x;
    while(y!=tata[y])
        y=tata[y];
    while(x!=tata[x])
    {
        z=tata[x];
        tata[x]=y;
        x=z;
    }
    return y;
}

int main(void)
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        tata[i]=i, rang[i]=1;
    while(m--)
    {
        scanf("%d%d%d",&c,&x,&y);
        if(c==1)
        {
            a=rad(x);
            b=rad(y);
            if(rang[a]<rang[b])
                tata[a]=b;
            else
                tata[b]=a;

            if(rang[a]==rang[b])
                rang[a]++;
        }
        else
        {
            a=rad(x);
            b=rad(y);
            if(a==b)
                printf("DA\n");
            else
                printf("NU\n");
        }
    }
    return 0;
}