Cod sursa(job #2778281)

Utilizator radu.z5Zamfirescu Radu Ioan radu.z5 Data 1 octombrie 2021 02:10:50
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>

using namespace std;

void disjoint(ifstream &in, ofstream &out) {
    int n, m, i, code, x, y;
    in >> n >> m;

    // p[i] = parintele lui i;
    // size[i] = nr de elemente detinute de arborele cu radacina i
    int p[n], size[n];
    for (i = 0; i < n; i++)
        p[i] = i, size[i] = 1;

    for (i = 0; i < m; i++) {
        in >> code >> x >> y;

        int r1 = x - 1, r2 = y - 1;
        while (r1 != p[r1]) r1 = p[r1];
        while (r2 != p[r2]) r2 = p[r2];

        if (code == 1) {
            if (size[r1] <= size[r2]) {
                p[r1] = r2;
                size[r2] += size[r1];
                size[r1] = 0;
            } else {
                p[r2] = r1;
                size[r1] += size[r2];
                size[r2] = 0;
            }
        } else {
            (r1 == r2) ? (out << "DA") : (out << "NU");
            out << '\n';
        }
    }
}

int main(void) {
    ifstream in("disjoint.in");
    ofstream out("disjoint.out");

    disjoint(in, out);
    in.close();
    out.close();
    return 0;
}