Cod sursa(job #558842)

Utilizator tm_raduToma Radu tm_radu Data 17 martie 2011 14:35:24
Problema Paduri de multimi disjuncte Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.82 kb
#include <stdio.h>

int h[100001];
int t[100001];
int n, m;
int i, j, k, o;

void Union(int a, int b);
int Parent(int a);

int main()
{
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for ( i = 1; i <= n; i++ ) h[i] = 1, t[i] = i;
    
    for ( k = 1; k <= m; k++ )
    {
        scanf("%d %d %d", &o, &i, &j);
        if ( o == 1 ) if ( Parent(i) != Parent(j) ) Union(t[i], t[j]);
        if ( o == 2 ) printf("%s\n", (Parent(i) == Parent(j) ? "DA" : "NU"));
    }
    return 0;
}

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

int Parent(int a)
{
    if ( t[a] != a ) t[a] = Parent(t[a]);
    return t[a];
}