Cod sursa(job #364150)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 15 noiembrie 2009 12:53:36
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <cstdio>

#define FIN "disjoint.in"
#define FOUT "disjoint.out"

#define N 100002

int n, m, r[N], d[N];

int root(int x)
{
    if (x == r[x])
        return x;

    r[x] = root(r[x]);

    return r[x];
}

void merge(int x, int y)
{
    if (d[x] > d[y])
        r[y] = x;
    else if (d[x] < d[y])
        r[x] = y;
    else if (x != y)
    {
        r[x] = y;

        ++ d[x];
    }
}

int main()
{
    int i, t, x, y;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d%d", &n, &m);

    for (i = 1; i <= n; ++ i)
    {
        r[i] = i;

        d[i] = 1;
    }

    for (i = 1; i <= m; ++ i)
    {
        scanf("%d%d%d", &t, &x, &y);

        if (t == 1)
            merge(root(x), root(y));
        else
            printf(root(x) == root(y) ? "DA\n" : "NU\n");
    }
}