Cod sursa(job #2112109)

Utilizator SagunistuStrimbu Alexandru Sagunistu Data 23 ianuarie 2018 00:14:50
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <iostream>
#include <cstdio>
#define nmax 100005

using namespace std;

int p[nmax], r[nmax], n, m;

int find_set(int x) {
    if(p[x] == x)
        return x;
    p[x] = find_set(p[x]);
    return p[x];
}

void unite(int x, int y) {
    int sx = find_set(x);
    int sy = find_set(y);
    if(r[sx] < r[sy])
        p[sx] = sy;
    else
    if(r[sx] > r[sy])
        p[sy] = sx;
    else {
        p[sx] = sy;
        r[sx]++;
    }
}

int main() {
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
    cin >> n >> m;
    for(int i = 1;i <= n; ++i)
        p[i] = i;
    int x, op, y;
    for(int i = 0; i < m; ++i) {
        cin >> op >> x >> y;
        if(op == 1)
            unite(x,y);
        else
            if(find_set(x) == find_set(y))
                cout << "DA\n";
            else
                cout << "NU\n";
    }
    return 0;
}