Pagini recente » Cod sursa (job #2469967) | Cod sursa (job #114672) | Cod sursa (job #2960903) | Cod sursa (job #2919480) | Cod sursa (job #2937785)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int N, M;
int* tt;
int* h;
int Find(int node) {
if(tt[node] == 0) {
return node;
}
return tt[node] = Find(tt[node]);
}
void Union(int x, int y) {
// Atunci cand reunim 2 multimi (cea in care se afla X si cea in care se afla Y), ceea ce avem de facut este sa legam arborele mai mare la arborele mai mic (arborii din care fac parte elementul X resp elementul Y)
// Inaltimile arborilor le putem obtine din vectorul h, pe care il actualizam corespunzator dupa fiecare operatie de Union
int tataX = Find(x);
int tataY = Find(y);
// Comparam inaltimea arborilor cu radacinile tataX resp tataY
if(h[tataX] > h[tataY]) {
// In acest caz, atasam la arborele din care face parte X (arborele mai mare) arborele din care face parte Y (arborele mai mic)
tt[tataY] = tataX;
} else if(h[tataX] < h[tataY]) {
// Invers
tt[tataX] = tataY;
} else {
// Nu conteaza pe care dintre arbori il legam la celalalt, insa trebuie sa updatam inaltimea arborelui rezultat si sa o incrementam cu 1
tt[tataY] = tataX;
h[tataX]++;
}
}
bool SameSet(int x, int y) {
return Find(x) == Find(y);
}
int main() {
fin >> N;
fin >> M;
tt = new int[N+1];
h = new int[N+1];
for(int i = 0; i<= N; i++) {
tt[i] = 0;
h[i] = 1;
}
int cod, x, y;
for(int i = 1; i <= M; i++) {
fin >> cod >> x >> y;
if(cod == 1) {
Union(x, y);
}
else if(cod == 2) {
fout << (SameSet(x,y) ? "DA\n" : "NU\n");
}
}
return 0;
}