Cod sursa(job #1607577)

Utilizator eustatiuDima Eustatiu eustatiu Data 21 februarie 2016 13:44:52
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <stdio.h>

using namespace std;
long S[200001],F[200001],n,m,k,x,y,i;
int Father(int x)
{
    int y=x,t;
    while (F[y]!=y)
        y=F[y];
    while (F[x]!=x)
    {
        t=F[x];
        F[x]=y;
        x=t;
    }
    return y;
}
int Size(int x)
{
    return S[Father(x)];
}
void Join(int x, int y)//size(x)>=size(y) , join y->x
{
    int t1,t2;
    t1=Father(x);
    t2=Father(y);
    if (S[t1]>=S[t2])
    {
        F[t2]=t1;
        S[t1]+=S[t2];
        S[t2]=0;
    }
    else
    {
        F[t1]=t2;
        S[t2]+=S[t1];
        S[t1]=0;
    }
}
int main()
{
    freopen ("disjoint.in","r",stdin);
    freopen ("disjoint.out","w",stdout);
    scanf ("%ld%ld",&n,&m);
    for (i=1;i<=n;i++)
        F[i]=i,S[i]=1;
    for (i=1;i<=m;i++)
        {
            scanf ("%ld %ld %ld",&k,&x,&y);
            if (k==2)
                if (Father(x)==Father(y))
                    printf ("DA\n");
                else
                    printf ("NU\n");
            else
                Join(x,y);
        }
    return 0;
}