Cod sursa(job #2946769)

Utilizator catalin28Gheorghe Catalin catalin28 Data 25 noiembrie 2022 02:51:13
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

int n, m, parent[100005], c, x, y, rnk[100005];

int getParent(int n){
    if(n != parent[n])
        return getParent(parent[n]);
    else
        return n;
}

void unite(int p, int x){
    while(x != parent[x]) {
        int temp = parent[x];
        parent[x] = p;
        x = temp;
    }
    parent[x] = p;
}

int main() {
    f >> n >> m;
    for(int i = 1; i <= n; i ++){
        parent[i] = i;
        rnk[i] = 1;
    }
    for (int i = 1; i <= m; i ++){
        f >> c >> x >> y;
        int p1 = getParent(x);
        int p2 = getParent(y);
        if (c == 1){
            if(rnk[p1] < rnk[p2]){
                unite(p2, x);
                rnk[p2] += rnk[p1];
            }
            else {
                unite(p1, y);
                rnk[p1] += rnk[p2];
            }
        }
        else{
            if(getParent(x) == getParent(y)) g << "DA\n";
            else g << "NU\n";
        }
    }
    return 0;
}