Cod sursa(job #714976)

Utilizator Sm3USmeu Rares Sm3U Data 16 martie 2012 13:36:38
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>
#define nMax 100010

using namespace std;

int n;
int rad[nMax];
int nivMax[nMax];

int radacina(int x)
{
    int r = x;
    while (rad[r] != r){
        r = rad[r];
    }
    int y;
    while (rad[x] != x)
    {
        y = rad[x];
        rad[x] = r;
        x = y;
    }
    return r;
}

void reuniune (int x, int y)
{
    if (nivMax[x] > nivMax[y]){
        rad[y] = x;
        return;
    }
    if (nivMax[x] < nivMax[y]){
        rad[x] = y;
        return;
    }
    rad[y] = x;
    nivMax[x] ++;
}

void citire()
{
    int m;
    scanf ("%d %d", &n, &m);
    for (int i = 1; i <= n; ++ i){
        rad[i] = i;
        nivMax[i] = 1;
    }
    while (m --){
        int caz;
        int x;
        int y;
        scanf ("%d %d %d", &caz, &x, &y);
        if (caz == 1){
            reuniune (radacina(x), radacina(y));
        }else{
            if (radacina(x) != radacina(y)){
                printf ("NU\n");
            }else{
                printf ("DA\n");
            }
        }
    }
}

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

    citire();

    return 0;
}