Pagini recente » Cod sursa (job #110990) | Cod sursa (job #2470889) | Cod sursa (job #1308884) | Cod sursa (job #557842) | Cod sursa (job #370735)
Cod sursa(job #370735)
/*
paduri de multimi disjunte.
Se dau n elemente, initial fiecare in propria multime. si m operatii
1 x y - multimile din care fac parte x si y se reunesc
2 x y - se verifica daca x si y fac parte din aceesai multime.
Implementarea cu structuri arborescente:
x,y fac parte din acceasi multime daca sunt in aclasi arbore, adica radacina arborelui lui x este identica cu radacina arborelui lui y
In aceasta varianta aplicam o euristica numita
compresia drumurilor:
la fiecare cautare a radacinii, parcurg inca o data drumul spre radacina si leg nodul curent direct de aceasta.
*/
using namespace std;
#include <fstream>
#define MAX 100010
int tata[MAX], n;
void uneste(int , int);
int verifica(int , int);
int radacina(int v);
int main(){
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int m,op,x,y;
fin>>n>>m;
for(; m ; --m){
fin>>op>>x>>y;
if(op==1)
uneste(x,y);
else
if(verifica(x,y))
fout<<"DA\n";
else
fout<<"NU\n";
}
return 0;
}
void uneste(int x , int y){
int rx = radacina(x);
int ry = radacina(y);
tata[rx] = ry;
}
int verifica(int x, int y){
return radacina(x) == radacina(y);
}
int radacina(int x){
int y=x,tmp;
while(tata[x])
x = tata[x];
while(y-x)
tmp = tata[y], tata[y] = x, y = tmp;
return x;
}