Cod sursa(job #2412244)

Utilizator Marius92roMarius Marius92ro Data 21 aprilie 2019 21:02:45
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.59 kb
#include <iostream>
#include <fstream>
#include <stdlib.h>

using namespace std;

/*
        Cauza pentru care pentru care primeam 40 de pct pe aceeasi sursa este ca la final optam pentru fout << "DA" << endl;
        si trebuia sa optez pentru fout << "DA\n" ;

*/

int *vectorTati, *rang;

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

int radacina(int nod){

    int radacinaNod = nod;

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

    while ( vectorTati[nod] != nod ){ //actualizez vectorul de tati cu radacina gasita ( unesc fiecare nod al multimii curente de radacina -- compresia drumurilor )
         int aux = vectorTati[nod];
         vectorTati[nod] = radacinaNod;
         nod = aux;
    }

    return radacinaNod;

}

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

    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;
            else
                vectorTati[radacinaX] = radacinaY;

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

int main(){

    if ( !fin ){
        cout << "\nEroare la deschiderea fisierului !\n";
        exit(-1);
    }

    int nrNoduri , nrOperatii , x , y , cod;

    fin >> nrNoduri >> nrOperatii;

    vectorTati = NULL;
    rang = NULL;

    vectorTati = new int[nrNoduri + 1];
    rang = new int[nrNoduri + 1];

    if ( !vectorTati || !rang ){
        cout << "\nEroare la alocare dinamica !\n";
        exit(-1);
    }

    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;

        switch(cod){
            case 1: { unire(radacina(x),radacina(y));  break; }

            case 2: {
                        if ( radacina(x) == radacina(y) )
                                                fout<<"DA\n";
                        else
                            fout<<"NU\n";

                        break;
            }

        }
    }

    return 0;

}