Pagini recente » Cod sursa (job #564689) | Cod sursa (job #237481) | Cod sursa (job #2710271) | Cod sursa (job #2942073) | Cod sursa (job #1890881)
#include <stdio.h>
#define MAX_N 100000
int p[MAX_N], h[MAX_N];
void init(int n) {
for (int i = 0; i < n; ++i) {
p[i] = i;
h[i] = 1;
}
}
int find(int x) {
int r = x;
while (p[r] != r) {
r = p[r];
}
while (p[x] != r) {
int tmp = p[x];
p[x] = r;
x = tmp;
}
return r;
}
void _union(int x, int y) {
int rx = find(x), ry = find(y);
if (rx != ry) {
if (h[rx] > h[ry]) {
p[ry] = rx;
} else if (h[ry] > h[rx]) {
p[rx] = ry;
} else {
p[rx] = ry;
h[ry]++;
}
}
}
int main(void) {
FILE *fin, *fout;
int n, m, j, k, i, m1, m2;
fin = fopen("disjoint.in", "r");
fout = fopen("disjoint.out", "w");
fscanf(fin, "%d%d", &n, &m);
init(n);
for (; m > 0; --m) {
fscanf(fin, "%d%d%d", &i, &j, &k);
m1 = find(j);
m2 = find(k);
if (i == 1) {
_union(m1, m2);
} else {
fprintf(fout, "%s\n", m1 == m2 ? "DA" : "NU");
}
}
fclose(fin);
fclose(fout);
return 0;
}