Pagini recente » Cod sursa (job #447727) | Cod sursa (job #2168372) | Cod sursa (job #3189145) | Cod sursa (job #3153048) | Cod sursa (job #1764428)
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
int n, m, op, x, y;
vector<int> parent(100001), rang(100001);
int find(int x) {
int sol = x, aux;
while (sol != parent[sol]) // gasirea capului
sol = parent[sol];
while (x != parent[x]) {
aux = parent[x]; // compresia drumurilor
parent[x] = sol;
x = aux;
}
return sol;
}
void unite(int x, int y) {
if (rang[x] > rang[y])
parent[y] = x;
else parent[x] = y; // unesc multimea de rang mai mic cu cea de rang mai mare
if (rang[x] == rang[y])
rang[y] ++;
}
// https://www.youtube.com/watch?v=ID00PMy0-vE
int main() {
freopen("disjoint.in", "r", stdin);
freopen("disjoint.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i ++) {
parent[i] = i;
rang[i] = 0;
}
for (int i = 1; i <= m; i ++) {
scanf("%d %d %d", &op, &x, &y);
if (op == 1)
unite(find(x), find(y));
else {
if (find(x) == find(y))
printf("DA\n");
else printf("NU\n");
}
}
return 0;
}