Pagini recente » Cod sursa (job #1583177) | Cod sursa (job #1806878) | preoji2014_0 | Cod sursa (job #850512) | Cod sursa (job #2403262)
#include <iostream>
#include <fstream>
using namespace std;
int vectorTati[100005];
int rang[100005];
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;
}