Pagini recente » Cod sursa (job #1495527) | Cod sursa (job #11530) | Cod sursa (job #1340267) | Cod sursa (job #1862821) | Cod sursa (job #1428036)
#include <iostream>
#include <fstream>
using namespace std;
//pentru a tine seturile ne folosim de arbori
//pastram arborii prin vector de tati
//let's do it!
const int NMAX = 100020;
const char iname[] = "disjoint.in";
const char oname[] = "disjoint.out";
int tata[NMAX], rg[NMAX];
void MakeSet(int n)
{
for(int i = 0 ; i < n; i++)
{
tata[i] = i;
rg[i] = 0;
}
}
int find(int x)
{
//ma deplasez in sus pe arbore pana dau de un nod care e propriul tata
int R, y;
for(R = x; tata[R] != R; R = tata[R]);
//fac compresie de drumuri
while(tata[x] != x)
{
y = tata[x];
tata[x] = R;
x = y;
}
return R;
}
void unite(int x, int y)
{
if(x == y)
return;
if(rg[x] > rg[y])
tata[y] = x;
else
tata[x] = y;
if(rg[x] == rg[y])
rg[y]++;
}
void solve()
{
ifstream f(iname);
ofstream g(oname);
int n, m;
f>>n>>m;
MakeSet(n);
for(int i = 0 ; i < m; i++)
{
int c,x,y;
f>>c>>x>>y;
if(c == 1)
unite(find(x), find(y));
else
if(find(x) != find(y))
g<<"NU\n";
else
g<<"DA\n";
}
f.close();
g.close();
}
int main()
{
solve();
return 0;
}