Cod sursa(job #572562)

Utilizator AndrewTheGreatAndrei Alexandrescu AndrewTheGreat Data 5 aprilie 2011 13:44:27
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <stdio.h>

using namespace std;

const int nmax = 100010;
int RG[nmax], TT[nmax];

void Unite(int a, int b)
{
    if(RG[a] > RG[b])
        TT[b] = a;
    else TT[a] = b;

    if(RG[a] == RG[b]) RG[b]++;
}

int find(int x)
{
    int t = x, R;

    while(x != TT[x])
        x = TT[x];

    while(t != TT[t])
    {
        R = TT[t];
        TT[t] = x;
        t = R;
    }

    return x;
}


void read()
{
    freopen ("disjoint.in", "r", stdin);
    freopen ("disjoint.out", "w", stdout);

    int N, M, i, a, b, q;
    scanf("%d %d", &N, &M);
    for(i = 1; i <= N; i++)
        RG[i] = 1, TT[i] = i;
    while(M--)
    {
        scanf("%d %d %d", &q, &a, &b);
        if(q == 1)
            Unite(find(a), find(b));
        else
        {
            if(find(a) == find(b))
                printf("DA\n");
            else printf("NU\n");
        }
    }
}
int main()
{
    read();
    return 0;
}