Cod sursa(job #2948826)

Utilizator iulitaalpetriIulita Alpetri iulitaalpetri Data 28 noiembrie 2022 15:23:47
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>
using namespace std;

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

vector<int> v;
vector<int> rang;
int n,m,i,operatie,x,y;

int radacina(int nod){// functia de gasire a reprezentantului
    if(v[nod] == 0)
        return nod;
    else{

        v[nod]=radacina(v[nod]);
        return v[nod];
    }
}

void op_1(int x, int y){// operatia de reuniune
    int rad1=radacina(x);
    int rad2=radacina(y);
    if(rad1 != rad2){
        if(rang[rad1] > rang[rad2])
            v[rad2]=rad1;
        else{
            v[rad1]=rad2;
            if(rang[rad1] == rang[rad2])
                rang[rad2]++;// atribuim rangul radacinii corespunzator arborelui cu cele mai multe noduri
        }
    }
}

void op_2(int x, int y){// determinam daca 2 pcte apartin aceluiasi arbore
    if(radacina(x) == radacina(y))
        g<<"DA"<<'\n';
    else
        g<<"NU"<<'\n';
}

int main() {


    f >> n >> m;
    v.assign(n + 1, 0);
    rang.assign(n+1,0);

    for(i=1;i<=m;i++){
        f >> operatie >> x >> y;
        if(operatie==1)
            op_1(x, y);
        else
            op_2(x,y);
    }

}