Pagini recente » Cod sursa (job #1038318) | Cod sursa (job #3250359) | Cod sursa (job #2853072) | Cod sursa (job #286929) | Cod sursa (job #2006481)
#include <bits/stdc++.h>
using namespace std;
FILE *F=fopen("disjoint.in", "r"), *G=fopen("disjoint.out", "w");
int t[100003], rg[100003], X, Y, cod, x, y, n, m;
int fnd(int x)
{
int r, y;
//caut radacina
for(r = x; t[r] != r; r = t[r]);
for(; t[x] != x;)
{
y = t[x]; // y devine tatal lui x
t[x] = r; // x pointeaza spre rad
x = y; // x devine tatal sau
}
return r;
}
void Unite(int x, int y)
{
if(rg[x] >= rg[y]) // dc x are rangul mai mare decat y
t[y] = x; // y devine copilul lui x
else t[x] = y;
if(rg[x] == rg[y]) rg[x] ++;
}
int main()
{
fscanf(F, "%d %d ", &n, &m);
for(int i = 1; i <= n; ++ i)
t[i] = i, rg[i] = 1;
for(int i = 0; i < m; ++ i)
{
fscanf(F, "%d %d %d ", &cod, &x, &y);
X = fnd(x);
Y = fnd(y);
if(cod == 2)
{
X== Y ? fprintf(G, "DA\n") : fprintf(G, "NU\n");
}
else if(X != Y) Unite(X, Y);
}
return 0;
}