Cod sursa(job #1029203)

Utilizator invincibleInvincibilul invincible Data 15 noiembrie 2013 09:47:43
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include<stdio.h>

#define NMAX 100007

int n, m, Tip, a, b, Ta, Tb;
int t[NMAX], h[NMAX];

inline int father(int x){
    if(x == t[x])
        return x;
    return father(t[x]);
}

void unite(int a, int b){
    if(h[a] == h[b]){
        t[b] = a;
        ++ h[a];
    }
    if(h[a] > h[b])
        t[b] = a;
    if(h[a] < h[b])
        t[a] = b;
}

int main(){
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= n; ++ i){
        t[i] = i;
        h[i] = 1;
    }
    for(int i = 1; i <= m; ++ i){
        scanf("%d %d %d", &Tip, &a, &b);
        Ta = father(a);
        Tb = father(b);
        if(Tip == 1)
            if(Ta != Tb)
                unite(Ta, Tb);
        if(Tip == 2)
            if(Ta != Tb)
                printf("NU\n");
            else
                printf("DA\n");
    }
    return 0;
}