Pagini recente » Cod sursa (job #1757757) | Cod sursa (job #1472041) | Cod sursa (job #1996874) | Cod sursa (job #703750) | Cod sursa (job #3175020)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("disjoint.in");
ofstream fout ("disjoint.out");
const int NMAX = 100005;
int n, m, dad[NMAX], rang[NMAX]; /// dad[i] = tatal (ascendentul direct) i in arbore
int do_find(int nod)
{
if (nod != dad[nod])
{
int repr = do_find(dad[nod]);
dad[nod] = repr;
return repr;
}
else return nod;
}
void do_union(int x, int y)
{
if (rang[x] < rang[y])
dad[x] = y;
else if (rang[x] > rang[y])
dad[y] = x;
else if (rang[x] == rang[y])
{
dad[x] = y;
rang[y]++;
}
}
int main()
{
fin >> n >> m;
for(int i = 1; i <= n; i++)
{
dad[i] = i;
rang[i] = 1;
}
for(int i = 1; i <= m; i++)
{
int c, x, y;
fin >> c >> x >> y;
int repr_x = do_find(x);
int repr_y = do_find(y);
if(c == 1)
{
/// reuniunea lui x cu y
do_union(x, y);
}
else if(c == 2)
{
if(repr_x == repr_y)
fout << "DA\n";
else fout << "NU\n";
}
}
return 0;
}