Cod sursa(job #227537)

Utilizator filipbFilip Cristian Buruiana filipb Data 4 decembrie 2008 20:54:48
Problema Paduri de multimi disjuncte Scor Ascuns
Compilator cpp Status done
Runda Marime 0.95 kb
#include <stdio.h>
#include <assert.h>

#define NMax 100005

int N, M;
int rang[NMax], up[NMax];

int find(int x)
{
    if (x != up[x])
       up[x] = find(up[x]);
    return up[x];
}

int _union(int x, int y)
{
    if (rang[x] > rang[y])
       up[y] = x;
    else
    {
        up[x] = y;
        rang[y] += (rang[x] == rang[y]);
    }
}

int main()
{
    int i, j, k, i1, i2;
    
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
  
    scanf("%d %d", &N, &M);
    assert(1 <= N && N <= 100000 && 1 <= M && M <= 100000);
    for (i = 1; i <= N; ++i)
        rang[i] = 1, up[i] = i;
    for (; M; --M)
    {
        scanf("%d %d %d", &i, &j, &k);
        i1 = find(j);
        i2 = find(k);
        if (i == 1)
        {
            assert(i1 != i2);
            _union(i1, i2);
            continue;
        }
        printf("%s\n", i1 == i2 ? "DA" : "NU");
    }
    
    return 0;
}