Cod sursa(job #346372)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 7 septembrie 2009 15:57:32
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<stdio.h>

int op;
int x;
int y;
int p[100005];
int r[100005];
int N;
int M;


int FindSet(int x)
{
    if (p[x] != x)
     p[x] = FindSet(p[x]);

    return p[x];
}
void Union(int x, int y)
{
    int r1 = FindSet(x);
    int r2 = FindSet(y);

    if (r[r1] > r[r2])
     p[r2] = r1;
    else
    {
     if (r[r1] == r[r2]) r[r2]++;
     p[r1] = r2;
    }


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

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

        while (M)
        {
            scanf("%d %d %d", &op, &x, &y);
            if (op == 1)
            {
                Union(x, y);
            }
            if (op == 2)
            {
                if (FindSet(x) == FindSet(y))
                 printf("DA\n");
                else
                 printf("NU\n");
            }

            M--;
        }
        return 0;
}