Cod sursa(job #376062)

Utilizator cristikIvan Cristian cristik Data 20 decembrie 2009 15:53:23
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <stdio.h>
#define max 100010
int tata[max],rang[max],i,n,j,m,op;
int find(int x)
{
    int r=x,y=x,aux;
    while(tata[r]) r=tata[r];//mergem pana la radacina
    while(y!=r)
    {
        aux=tata[y];
        tata[y]=r;
        y=aux;
    }
    return r;
}
void unite(int x,int y)
{
    if(rang[x]>rang[y]) tata[y]=x;
    else
    {
        tata[x]=y;
        if(rang[x]==rang[y]) rang[y]++;
    }
}
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]=1,tata[i]=i;
    for(; m>0; m--)
    {
        scanf("%d%d%d",&op,&i,&j);
        if(op==1) unite(i,j);
        else
         if(find(i)==find(j)) printf("DA\n");
         else printf("NU\n");
    }
    return 0;
}