Cod sursa(job #657624)

Utilizator elfusFlorin Chirica elfus Data 6 ianuarie 2012 21:35:19
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <stdio.h>
#define NMAX 100100

int dad[NMAX], R[NMAX];

inline int getFather (int root)
{
    int node = root;

    while (root != dad[root])
        root = dad[root];
    while (node != root)
        dad[node] = root, node = dad[node];

    return root;
}

int main ()
{
    int N, M, i, x, y, tip;

    freopen ("nor.in", "r", stdin);
    freopen ("nor.out", "w", stdout);

    scanf ("%d%d", &N, &M);

    for (i = 1; i <= N; i ++)
        dad[i] = i, R[i] = 1;
    for (i = 1; i <= M; i ++)
    {
        scanf ("%d%d%d", &tip, &x, &y);
        x = getFather (x);
        y = getFather (y);
        if (tip == 2)
        {
            if (x == y)
                printf ("DA\n");
            else
                printf ("NU\n");
            continue;
        }
        if (R[x] < R[y])
        {
            R[y] = R[y] + R[x];
            R[x] = 0;
            dad[x] = y;
        }
        else
        {
            R[x] = R[x] + R[y];
            R[y] = 0;
            dad[y] = x;
        }
    }

    return 0;
}