Cod sursa(job #2806754)

Utilizator HatersMcCristian Ioan HatersMc Data 22 noiembrie 2021 22:56:06
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <vector>

using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
vector<int> rad(100000);
vector<int> rang(100000);

int find(int x) {
    int i, y;

    //merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi
    i=x;
    while(rad[i]!=i){
        i=rad[i];
    }

    //aplic compresia drumurilor
   while(rad[x]!=x) {
        y = rad[x];
        rad[x] = i;
        x = y;
    }
    return i;
}

void unite(int x, int y) {
    //unesc multimea cu rang mai mic de cea cu rang mai mare
    if (rang[x] > rang[y])
        rad[y] = x;
    else rad[x] = y;

    //in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
    if (rang[x] == rang[y]) rang[y]++;
}

int main() {
    int n, m;
    f >> n >> m;
    for(int i = 1 ; i <= n ; ++i){
        rang[i]=1;
        rad[i]=i;
    }
    for (int i = 0; i < m; ++i) {
        int x, y, z;
        f >> x >> y >> z;
        if (x == 1) {
            int r1,r2;
            r1=find(y);
            r2=find(z);
            if(r1!=r2)
            unite(r2, r1);
        }
        else {
            if (x == 2) {
                if (find(y) == find(z)) {
                    g << "DA" << '\n';
                } else {
                    g << "NU" << '\n';
                }

            }
        }
    }
    return 0;
}