Pagini recente » Cod sursa (job #1342114) | Cod sursa (job #3238197) | Cod sursa (job #803316) | Cod sursa (job #926115) | Cod sursa (job #2647956)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("disjoint.in");
ofstream fout ("disjoint.out");
int tt[100001];
int rg[100001];
int find (int x)
{
int r, y;
//merg in sus in arbore pana gasesc un nod care pointeaza catre el insusi
r=x;
while(tt[r]!=r)
{
r=tt[r];
}
//cout<<"r= "<<r<<"\n";
//for(r=x; tt[r] !=r ; r=tt[r]) ;
//aplic compresia drumurilor
while(tt[x]!=x)
{
y=tt[x];
tt[x]=r;
x=y;
}
/*for(; tt[x] !=x; )
{
y=tt[x];
tt[x]=r;
x=y;
}*/
return r;
}
void unite (int x, int y)
{
//unesc multimea cu rand mai mic de cea cu rang mai mare
if(rg[y]<rg[x])
{
tt[y]=x;
}
else tt[x]=y;
//in caz ca rangurile erau egale atunci cresc rangul noii multimi
if(rg[x]==rg[y]) rg[y]++;
}
int main()
{
int n, m, i, cod, x, y;
fin>>n>>m;
//initial fiecare nod pointeaza catre el insusi si fiecare arbore are rang 1
for(i=1; i<=n; i++)
{
tt[i]=i;
rg[i]=1;
}
for(i=1; i<=m; i++)
{
fin>>cod>>x>>y;
if(cod==1)
{
unite ( find(x), find(y) );
}
else
{
//cout<<"x= "<<x<<"\nfind("<<x<<")= "<<find(x)<<"\ny= "<<y<<"\nfind("<<y<<")= "<<find(y)<<"\n\n";
if(find(x)==find(y)) fout<<"DA\n";
else fout<<"NU\n";
}
}
}