Cod sursa(job #2789326)

Utilizator florinrafiliuRafiliu Florin florinrafiliu Data 27 octombrie 2021 13:38:33
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <iostream>
#include <fstream>
using namespace std;

const int maxN = 1e5 + 5;

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

int t[maxN], rang[maxN];

int radacina (int node) {
    if(t[node] == 0)
        return node;

    int root = radacina(t[node]);
    t[node] = root;
    return root;
}

void unire (int x, int y) {
    int root1 = radacina(x);
    int root2 = radacina(y);

    if(root1 != root2) {
        if(rang[root1] > rang[root2])
            t[y] = x;
        else {
            t[x] = y;
            if(rang[x] == rang[y])
                rang[x] ++;
        }
    }

}

int main() {

    int n, m; fin >> n >> m;

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

        if(op == 1) {
            unire(x, y);
        } else {
            int root1 = radacina(x);
            int root2 = radacina(y);

            if(root1 == root2) fout << "DA\n";
            else fout << "NU\n";
        }
    }

    return 0;
}