Cod sursa(job #1345835)

Utilizator andreismara97Smarandoiu Andrei andreismara97 Data 17 februarie 2015 21:40:44
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<cstdio>
using namespace std;

#define Nmax 100005

int TT[Nmax], RG[Nmax];
int N, M;

int find(int x)
{
    int R, y;

    R=x;
    while(TT[R]!=R)
        R=TT[R];

    for(; TT[x]!=x;)
    {
        x=TT[x];
        TT[x]=R;
        y=x;
    }
    return R;
}

int unite(int x, int y)
{
    if( RG[x] > RG[y])
        TT[y]=x;
        else
            TT[x]=y;

    if( RG[x] == RG[y])
        RG[y]++;
}

int main ()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);

    scanf("%d %d",&N,&M);
    for(int i=1; i<=N; i++)
    {
        TT[i]=i;
        RG[i]=1;
    }

    int x, y, op;

    for(int i=1; i<=M; i++)
    {
        scanf("%d %d %d\n",&op, &x, &y);

        if(op==2)
        {
            if( find(x) == find(y) )   printf("DA\n");
            else                       printf("NU\n");
        }
        else
            {
                if (find(x) == find(y))  {fprintf(stderr,"%d ", i);return 0;}
                unite(find(x), find(y));
            }
    }

    return 0;
}