Pagini recente » Cod sursa (job #2847751) | Cod sursa (job #2829482) | Cod sursa (job #3041090) | Cod sursa (job #2798943) | Cod sursa (job #2073202)
#include <stdio.h>
#include <stdlib.h>
#define NMAX 100001
int n, m, tab[NMAX], len[NMAX];
FILE *f, *g;
int root(int a)
{
while(tab[a] != a) {
a = tab[a];
}
return a;
}
void unite(int a, int b)
{
int root1 = root(a), root2 = root(b);
// if(root1 != root2) {
// tab[root1] = root2;
// }
if(root1 != root2) {
if(len[root1] > len[root2]) {
tab[root1] = root2;
len[root2] = len[root1];
} else {
tab[root2] = root1;
len[root1] = len[root2];
}
}
}
void query(int a, int b)
{
int root1 = root(a), root2 = root(b);
if(root1 != root2) {
fprintf(g, "NU\n");
} else {
fprintf(g, "DA\n");
}
}
int main()
{
f = fopen("disjoint.in", "r");
g = fopen("disjoint.out", "w");
if(f == NULL) { return -1; }
if(g == NULL) { return -1; }
fscanf(f, "%d %d\n", &n, &m);
for(int i = 0; i < n; ++i) {
tab[i] = i;
len[i] = 1;
}
for(int i = 0; i < m; ++i) {
int a, b, c;
fscanf(f, "%d %d %d\n", &a, &b, &c);
if(a == 1) { unite(b, c); }
if(a == 2) { query(b, c); }
}
fclose(f);
fclose(g);
return 0;
}