Pagini recente » Cod sursa (job #911219) | Cod sursa (job #2412244)
#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;
}