Pagini recente » Cod sursa (job #1552028) | Cod sursa (job #2674057) | Cod sursa (job #158860) | Cod sursa (job #1116580) | Cod sursa (job #2941631)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
vector <int> tata, rang;
int n,m,tip,x,y;
int radacina(int nod)
{
//daca nodul nu este radacina o caut la tatal acestuia
if(nod!=tata[nod])
{
return radacina(tata[nod]);
}
return nod;
}
int main()
{
int radx,rady;
fin>>n>>m;
tata.resize(n+1);
//recomandare de eficienta din cerinta
rang.resize(n+1,1);
for(int i=0;i<n;i++)
{
tata[i]=i;
}
for(int j=0;j<m;j++)
{
fin>>tip>>x>>y;
if(tip==1)
{
//verific care din cei doi arbori au mai putine elemente si pe respectivul il leg la celalalt prin tata
radx=radacina(x);
rady=radacina(y);
if(rang[radx]>rang[rady])
{
tata[rady]=radx;
}
else if (rang[radx]<rang[rady])
{
tata[radx]=rady;
}
//daca sunt egale trebuie sa maresc rangul caci se mai adauga un nivel
else
{
rang[radx]++; rang[rady]++;
tata[radx]=rady;
}
}
else
{
if(radacina(x)==radacina(y))
{
fout<<"DA";
}
else fout<<"NU";
fout<<endl;
}
}
return 0;
}