Cod sursa(job #3233270)

Utilizator MirceaDonciuLicentaLicenta Mircea Donciu MirceaDonciuLicenta Data 2 iunie 2024 21:12:02
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

ifstream infile("disjoint.in");
ofstream outfile("disjoint.out");

class DisjointSet {
public:
    DisjointSet(int n) {
        parent.resize(n + 1);
        rank.resize(n + 1, 0);
        for (int i = 1; i <= n; ++i) {
            parent[i] = i;
        }
    }

    int find(int u) {
        if (u != parent[u]) {
            parent[u] = find(parent[u]); // Path compression
        }
        return parent[u];
    }

    void unite(int u, int v) {
        int root_u = find(u);
        int root_v = find(v);
        if (root_u != root_v) {
            if (rank[root_u] > rank[root_v]) {
                parent[root_v] = root_u;
            } else if (rank[root_u] < rank[root_v]) {
                parent[root_u] = root_v;
            } else {
                parent[root_v] = root_u;
                rank[root_u]++;
            }
        }
    }

private:
    vector<int> parent;
    vector<int> rank;
};

int main() {
    int N, M;
    infile >> N >> M;

    DisjointSet dsu(N);

    for (int i = 0; i < M; ++i) {
        int cod, x, y;
        infile >> cod >> x >> y;
        if (cod == 1) {
            dsu.unite(x, y);
        } else if (cod == 2) {
            if (dsu.find(x) == dsu.find(y)) {
                outfile << "DA\n";
            } else {
                outfile << "NU\n";
            }
        }
    }

    infile.close();
    outfile.close();
    return 0;
}