Pagini recente » Cod sursa (job #1230604) | Cod sursa (job #2772313) | Cod sursa (job #598427) | Cod sursa (job #1060615) | Cod sursa (job #3204068)
#include <fstream>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int c,n,m,x,y,i,j,father[100001];
//root este gasit la tatal suprem si contorul nodurilor din arbore, cu semn negativ pt a fi distins de celelalte father-uri
int findroot(int n)
{
if(father[n] < 0)
return n; // inseamna ca el este father. Numai radacina e negativa
int root = findroot(father[n]);
//Ma asigur ca pe lantul ala i-am pus pe toti cu aelasi root
father[x] = root;
return root;
}
void uniune(int x,int y)
{
int r_x = findroot(x);
int r_y = findroot(y);
//Nici macar n-are rost sa fac cv, deja sunt in aceeasi comp conexa si au ac radacina
if(r_x==r_y) return;
//r_x=1
//father[r_x]=-5
//Voi lipi arborele mic la cel mare, nu invers
if(father[r_y]> father[r_x]) swap(r_x, r_y);
//Il lipesc adc ii dau acelasi tata...
father[r_y]+= father[r_x];
father[r_x] = r_y;
}
int main()
{
fin>>n>>m;
for(i=1;i<=n;i++)
father[i]= -1; //toate-s radacini a unei comp conexe de 1 elem la inceput
while(m--)
{
fin>>c>>x>>y;
if(c==1)
{
uniune(x,y);
}
else
{
if(findroot(x) == findroot(y))
{
fout<<"DA\n";
}
else
{
fout<<"NU\n";
}
}
}
return 0;
}