Pagini recente » Cod sursa (job #468479) | Cod sursa (job #1021202) | Cod sursa (job #2853017) | Cod sursa (job #2412234)
#include <stdio.h>
#define NMAX 100020
int vectorTati[NMAX], rang[NMAX];
int nrNoduri, nrCoduri;
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
int aux = vectorTati[nod];
vectorTati[nod] = radacinaNod;
nod = aux;
}
return radacinaNod;
}
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;
}
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(){
freopen("disjoint.in", "r", stdin);
freopen("disjoint.out", "w", stdout);
scanf("%d %d ", &nrNoduri, &nrCoduri);
int x, y, cod;
for (int i = 1; i <= nrNoduri; i++)
{
vectorTati[i] = i;
rang[i] = 1;
}
for (int i = 1; i <= nrCoduri; i++)
{
scanf("%d %d %d", &cod, &x, &y);
if (cod == 2){
if (radacina(x) == radacina(y)) printf("DA\n");
else printf("NU\n");
}
else
{
unire(x,y);
}
}
return 0;
}