Cod sursa(job #2403263)

Utilizator Marius92roMarius Marius92ro Data 11 aprilie 2019 13:26:00
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb
#include <iostream>
#include <fstream>

using namespace std;

int vectorTati[100050];
int rang[100050];

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

void compresieDrumuri(int nod, int radacina){

    while ( vectorTati[nod] != nod ){ //actualizez vectorul de tati cu radacina gasita
         int aux = vectorTati[nod];
         vectorTati[nod] = radacina;
         nod = aux;
    }
}

int radacina(int nod){

    int k = nod;

    while ( vectorTati[k] != k ) //caut radacina nodului
            k = vectorTati[k];

    return k;

}

void unire(int x, int y){ //leg radacinile a  doua componente conexe

    int radacinaX = radacina(x);
    int radacinaY = radacina(y);

    if ( radacinaX != radacinaY ){ //in caz ca radacinile sunt diferite -> avem doua submultimi ( componente conexe ) diferite

            if(rang[radacinaX] > rang[radacinaY]){  //unesc multimea cu rang mai mic de cea cu rang mai mare
                        vectorTati[radacinaY] = radacinaX;
                        compresieDrumuri(y,radacinaX);
            }

            else{
                vectorTati[radacinaX] = radacinaY;
                compresieDrumuri(x,radacinaY);
            }


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

}


int main(){

    int nrNoduri , nrOperatii , x , y , cod;

    fin >> nrNoduri >> nrOperatii;

    for ( int i = 1; i <= nrNoduri; i++){ // intitial fiecare nod este un nod izolat
        vectorTati[i] = i;
        rang[i] = 1;
    }

    for (int i = 1; i <= nrOperatii; i++){

        fin >> cod >> x >> y;

        if ( cod == 1 )
                    unire(x,y);

        else {
            if ( radacina(x) == radacina(y) )
                            fout<<"DA"<<endl;
            else
                fout<<"NU"<<endl;

        }
    }

     // for ( int i = 1; i <= nrNoduri; i++)
         //cout << vectorTati[i] << " ";


    return 0;

}