Cod sursa(job #364565)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 16 noiembrie 2009 12:16:46
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<stdio.h>
int tata[100005],grad[100005],n,m,tip,n1,n2,t1,t2;
int cautta (int nod)
{
    int ta;
    if(tata[nod]==nod)
        return nod;
    ta=cautta(tata[nod]);
    tata[nod]=ta;
    return ta;

}
int main ()
{
    int i;
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        grad[i]=1;
        tata[i]=i;
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&tip,&n1,&n2);
        t1=cautta(n1);
        t2=cautta(n2);
        if(tip==2)
        {
            if(n1==n2)
            {
                printf("NU\n");
                continue;
            }
            if(t1==t2)
                printf("DA\n");
            else
                printf("NU\n");
            continue;
        }

        if(t1==t2)
            continue;
        if(grad[t1]<grad[t2])
        {

            tata[n1]=n2;
            grad[t2]+=grad[t1];

        }
        else
        {
            tata[n2]=n1;
            grad[t1]+=grad[t2];

        }
    }
        
    return 0;
}