Cod sursa(job #1345640)

Utilizator roxana.aeleneiAelenei Roxana roxana.aelenei Data 17 februarie 2015 19:34:54
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <cstdio>
using namespace std;
const int NMAX=100000;
int h[NMAX+1], t[NMAX+1];

inline int FindSet (int x)
{
    while (x!=t[x])
        x=t[x];
    return x;
}

inline void UnionSet (int x, int y)
{
    if(h[x]==h[y])
    {
        h[x]++;
        t[y]=x;
    }
    else if(h[x]>h[y])
        t[y]=x;
    else
        t[x]=y;
}


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

    int n,m,i, op, a, b, ca, cb;

    scanf("%d%d", &n, &m);

    for(i=1; i<=n; i++)
        h[i]=1, t[i]=i;

    for(i=1; i<=m; i++)
    {
        scanf("%d%d%d", &op, &a, &b);

        ca=FindSet(a);
        cb=FindSet(b);

        if(op == 1)
        {
            if(ca != cb)
                UnionSet(ca,cb);
        }

        else
        {
            if(ca== cb)
                printf("DA\n");
            else
                printf("NU\n");
        }

    }
    return 0;
}