Cod sursa(job #1803503)

Utilizator Andrei501Clicinschi Andrei Andrei501 Data 11 noiembrie 2016 15:53:11
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <cstdio>

using namespace std;

int v[100001],h[100001];

int Find (int x)
{
    if (x==v[x])
    {
        return x;
    }
    else
    {
        v[x]=Find(v[x]);
        return v[x];
    }
}

void Union (int x,int y)
{
    int ii,jj;
    ii=Find(x);
    jj=Find(y);
    if (h[ii]>h[jj])
    {
        v[jj]=ii;
    }
    else
    {
        if (h[ii]<h[jj])
        {
            v[ii]=jj;
        }
        else
        {
            v[ii]=jj;
            h[jj]++;
        }
    }
}

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

    int n,m,i,t,a,b;
    scanf ("%d %d",&n,&m);

    for (i=1; i<=n; i++)
    {
        v[i]=i;
        h[i]=1;
    }

    for (i=1; i<=m; i++)
    {
        scanf ("%d %d %d",&t,&a,&b);
        if (t==1)
        {
            Union(a,b);
        }
        else
        {
            if (Find(a)==Find(b))
            {
                printf ("DA\n");
            }
            else
            {
                printf ("NU\n");
            }
        }
    }

    return 0;
}