Cod sursa(job #2730303)

Utilizator matthriscuMatt . matthriscu Data 26 martie 2021 00:47:57
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
using namespace std;

int Find(int nod, int Father[]) {
    int Rep = nod, temp;
    while(Rep != Father[Rep])
        Rep = Father[Rep];
    while(nod != Father[nod]) {
        temp = Father[nod];
        Father[nod] = Rep;
        nod = temp;
    }
    return Rep;
}

void Union(int x, int y, int Father[], int Rank[]) {
    int RepX = Find(x, Father), RepY = Find(y, Father);
    if(Rank[RepX] > Rank[RepY]) {
        ++Rank[RepX];
        Father[RepY] = RepX;
    }
    else  {
        ++Rank[RepY];
        Father[RepX] = RepY;
    }
}

int main() {
    ifstream fin("disjoint.in");
    ofstream fout("disjoint.out");
    int n, m, q, x, y, Father[100001], Rank[100001] {};
    fin >> n >> m;
    for(int i = 1; i <= n; ++i)
        Father[i] = i;
    while(m--) {
        fin >> q >> x >> y;
        if(q == 1)
            Union(x, y, Father, Rank);
        else
            fout << (Find(x, Father) == Find(y, Father) ? "DA\n" : "NU\n");
    }
}