Cod sursa(job #3264361)

Utilizator alexsimedreaAlexandru Simedrea alexsimedrea Data 20 decembrie 2024 18:12:02
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <vector>

std::vector<int> parent;
std::vector<int> rank;

int find(const int x) {
    if (parent[x] != x) {
        parent[x] = find(parent[x]);
    }
    return parent[x];
}

void unite(const int x, const int y) {
    const int rootX = find(x);
    const int rootY = find(y);

    if (rootX == rootY)
        return;

    if (rank[rootX] > rank[rootY]) {
        parent[rootY] = rootX;
    } else {
        parent[rootX] = rootY;
        if (rank[rootX] == rank[rootY]) {
            rank[rootY]++;
        }
    }
}

int main() {
    std::ifstream fin("disjoint.in");
    std::ofstream fout("disjoint.out");

    int N, M;
    fin >> N >> M;

    parent.resize(N + 1);
    rank.resize(N + 1, 1);

    for (int i = 1; i <= N; i++) {
        parent[i] = i;
    }

    for (int i = 1; i <= M; i++) {
        int command, x, y;
        fin >> command >> x >> y;

        if (command == 2) {
            fout << (find(x) == find(y) ? "DA" : "NU") << '\n';
        } else {
            if (find(x) == find(y)) {
                return 0;
            }
            unite(x, y);
        }
    }
    return 0;
}