Cod sursa(job #2936632)

Utilizator soda-popClinciu Diana soda-pop Data 9 noiembrie 2022 02:22:00
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#include <vector>

using namespace std;

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

void MakeSet(int u, int parent[], int h[]) {
    parent[u] = 0;
    h[u] = 0;
}

int Find(int u, int parent[]) {
    if (parent[u] == 0) return u;
    parent[u] = Find(parent[u], parent);
    return parent[u];
}

void Union(int u, int v, int parent[], int h[]) {
    int repU = Find(u, parent);
    int repV = Find(v, parent);
    if (h[repU] > h[repV]) {
        parent[repV] = repU;
    } else {
        parent[repU] = repV;
        if (h[repU] == h[repV]) h[repV]++;
    }
}

int main() {
    int parent[100001] = {0}, h[100001] = {0};
    int m, n, x, y, code;

    in >> n >> m;

    for (int i = 1; i <= n; i++)
        MakeSet(i, parent, h);

    for (int i = 1; i <= m; i++) {
        in >> code >> x >> y;
        if (code == 1) {
            Union(x, y, parent, h);
        } else {
            if (Find(x, parent) == Find(y, parent))
                out << "DA\n";
            else
                out << "NU\n";
        }
    }

    return 0;
}