Cod sursa(job #1611871)

Utilizator BrandonChris Luntraru Brandon Data 24 februarie 2016 15:32:16
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>

using namespace std;

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

int vert_nr, edge_nr, op, x, y, father[100005], dsu_depth[100005];

void merge_dsu(int node_1, int node_2);
int find_root(int node);

void read() {
    cin >> vert_nr >> edge_nr;

    for(int i = 1; i <= vert_nr; ++i) {
        father[i] = i;
    }

    for(int i = 1; i <= edge_nr; ++i) {
        cin >> op >> x >> y;

        if(op == 1) {
            merge_dsu(x, y);
        }
        else {
            if(find_root(x) == find_root(y)) {
                cout << "DA\n";
            }
            else {
                cout << "NU\n";
            }
        }
    }

}

int find_root(int node) {
    if(father[node] == node) {
        return node;
    }

    return find_root(father[node]);
}

void merge_dsu(int node_1, int node_2) {
    int root_1 = find_root(node_1);
    int root_2 = find_root(node_2);

    if(dsu_depth[root_1] < dsu_depth[root_2]) {
        father[root_1] = root_2;
    }
    else if(dsu_depth[root_1] > dsu_depth[root_2]) {
        father[root_2] = root_1;
    }
    else {
        father[root_2] = root_1;
        ++dsu_depth[root_2];
    }
}

int main() {
    read();
    return 0;
}