Cod sursa(job #2890291)

Utilizator ArmandNMArmand Nicolicioiu ArmandNM Data 15 aprilie 2022 10:47:26
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>

using namespace std;


class DisjointSet {
    unordered_set <int> parents;
    unordered_map<int, int> parent;
    unordered_map<int, int> size;
    unordered_map<int, int> rank;

public:
    int find(int v) {
        if (parent[v] == v) {
            return v;
        }

        // path compression
        parent[v] = find(parent[v]);

        return parent[v];
    }

    void add(int v) {
        if (parent.find(v) != parent.end()) {
            return;  // element already exists
        }

        parent[v] = v;
        parents.insert(v);
        size[v] = 1;
        rank[v] = 1;
    }

    void unite(int u, int v) {
        u = find(u);
        v = find(v);

        if (rank[u] < rank[v]) {
            parent[u] = v;
            size[v] += size[u];
        } else if (rank[v] < rank[u]) {
            parent[v] = u;
            size[u] += size[v];
        } else {
            parent[u] = v;
            size[v] += size[u];
            rank[v]++;
        }
    }
};


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

    int n, m;
    DisjointSet dj_set;

    cin >> n >> m;

    for (int i = 1; i <= n; ++i) {
        dj_set.add(i);
    }

    int op_type, x, y;
    while(m--) {
        cin >> op_type >> x >> y;
        if (op_type == 1) {
            dj_set.unite(x, y);
        } else {
            cout << (dj_set.find(x) == dj_set.find(y) ? "DA\n" : "NU\n");
        }
    }

    return 0;
}