Cod sursa(job #1541395)

Utilizator andreea_zahariaAndreea Zaharia andreea_zaharia Data 3 decembrie 2015 23:35:04
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>

#define NMAX 100005

int p[NMAX], h[NMAX];
int N, M;

void init (int n) {
    for (int i = 1; i <= n; i++) {
        p[i] = i;
        h[i] = 1;
    }
}

int finddj (int x) {
    int r = x;
    while (p[r] != r) {
        r = p[r];
    }
    while (p[x] != r) {
        int tmp = p[x];
        p[x] = r;
        x = tmp;
    }
    return r;
}

void uniondj (int x, int y) {
    int rx = finddj (x), ry = finddj (y);

    if (rx != ry) {
        if (h[rx] < h[ry]) {
            p[rx] = ry;
        }
        else {
            if (h[rx] > h[ry]) {
                p[ry] = rx;
            }
            else {
                p[rx] = ry;
                h[ry]++;
            }
        }
    }
}


int main () {
    freopen ("disjoint.in", "r", stdin);
    freopen ("disjoint.out", "w", stdout);

    scanf ("%d%d", &N, &M);

    init (N);

    int cerinta, x, y;
    while (M--) {
        scanf ("%d%d%d", &cerinta, &x, &y);

        if (cerinta == 1) {
            uniondj (x, y);
        }
        else {
            if (finddj (x) == finddj (y)) {
                printf ("DA\n");
            }
            else {
                printf ("NU\n");
            }
        }
    }

    return 0;
}