Pagini recente » Cod sursa (job #1977118) | Cod sursa (job #2931190) | Borderou de evaluare (job #2178775) | Cod sursa (job #2604778) | Cod sursa (job #2643908)
#include <fstream>
#define N 100020
using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");
int conect[N], rankArbore[N];
int n, m;
int cauta(int x)
{
int radacina, y;
//merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi
radacina = x;
while(conect[radacina] != radacina)
radacina = conect[radacina];
//aplic compresia drumurilor
while(conect[x] != x){
y = conect[x];
conect[x] = radacina;
x = y;
}
return radacina;
}
void uneste(int x, int y)
{
//unesc multimea cu rang mai mic de cea cu rang mai mare
if (rankArbore[x] > rankArbore[y]) conect[y] = x;
else conect[x] = y;
//in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
if (rankArbore[x] == rankArbore[y]) rankArbore[y]++;
}
int main()
{
in>>n>>m;
//initial fiecare nod pointeaza catre el insusi iar rangul fiecarui arbore este 1
for(int i = 1; i <= n; ++i){
conect[i] = i;
rankArbore[i] = 1;
}
for(int i = 1; i <= m; ++i){
int com, x, y;
in>>com>>x>>y;
if(com == 2){
//verific daca radacina arborilor in care se afla x respectiv y este egala
if(cauta(x) == cauta(y)) out<<"DA\n";
else out<<"NU\n";
}
else{
//unesc radacinile arborilor corespunzatori multimilor nodurilor x respectiv y
if(cauta(x) == cauta(y)) return 0;
uneste(cauta(x), cauta(y));
}
}
return 0;
}