Pagini recente » Cod sursa (job #2774571) | Cod sursa (job #3192759) | Cod sursa (job #2518784) | Cod sursa (job #2518822) | Cod sursa (job #3218479)
#include <fstream>
#define NMAX 100003
using namespace std;
ifstream fin ("disjoint.in");
ofstream fout("disjoint.out");
int t[NMAX],n;
int high[NMAX];///inaltimea arborelor pentru a il lega pe cel mai mic la cel mai mare
///radacina arborelui nu o sa mai aiba tatal 0 ci pe ea insasi t[radacina]=radacina;
void initializare()
{
fin>>n;
for(int i=1;i<=n;i++)
{
t[i]=i;
high[i]=1;
}
}
int Find(int x)
{
int radacina=x;
/// din ce multime face parte x = radacina arborelui in care e x
///radacina arborelui este singura cu proprietatea ca t[i]=i;
while(t[radacina]!=radacina)
radacina=t[radacina];
///am gasit radacina
while(t[x]!=radacina)
{
/// de la x la radacina toti parintii nodurilor = radacina
int aux=t[x];
t[x]=radacina;
x=aux;
}
return radacina; ///returnam radacina
}
void Union(int x, int y)
{
int rx=Find(x);
int ry=Find(y);
if(rx!=ry)
{
if(high[rx]<high[ry]) ///unim arborele mic la cel mare rx la ry
t[rx]=ry;
else
{
if(high[ry]<high[rx]) ///ry la rx
t[ry]=rx;
else ///sunt egale
{
t[rx]=ry;
high[ry]++;
}
}
}
}
int main()
{
initializare();
int m,cerinta,a,b;
fin>>m;
for(int i=1;i<=m;i++)
{
fin>>cerinta>>a>>b;
if(cerinta==1) Union(a,b);
else
{
if(Find(a)==Find(b)) fout<<"DA";
else fout<<"NU";
fout<<'\n';
}
}
return 0;
}