Pagini recente » Cod sursa (job #3322064) | Cod sursa (job #1027234) | Cod sursa (job #3321642) | Cod sursa (job #3296622) | Cod sursa (job #2422970)
#include <fstream>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int t[100000], grad[100000], n, m;
int root (int k)
{
if (t[k] == k)
return k;
else
{
int answer = root(t[k]);
t[k] = answer;
return answer;
}
}
void unire (int k, int p)
{
int rk = root(k), rp = root(p);
if(rk != rp) //sunt in comp diferite
{
if (grad[rk] > grad[rp])
{
t[rp] = rk;
grad[rk] += grad[rp];
}
else
{
t[rk] = rp;
grad[rp] += grad[rk];
}
}
}
int main ()
{
f>>n; //nr multimi
for(int i=1; i<=n; i++)
{
t[i] = i;
grad[i] = 1;
}
f>>m; //nr operatii efectuate
for(int i=1; i<=m; i++)
{
int cod, x, y; //tipul operatiei + 2 nr in [1,n]
f>>cod>>x>>y;
if(cod == 1)
unire(x, y);
else if (cod == 2)
{
if(root(x) != root(y)) //se afla in aceeasi multime
g<<"NU\n";
else
g<<"DA\n";
}
}
}