Pagini recente » Cod sursa (job #818842) | Cod sursa (job #378411) | Cod sursa (job #2932348) | Cod sursa (job #2834281) | Cod sursa (job #228660)
Cod sursa(job #228660)
//paduri de multimi disjuncte
#include <cstdio>
#define N 100010
#define reuneste(a,b) uneste(gaseste(a),gaseste(b))
int P[N],rang[N],n,i,m,nr,a,b;
int gaseste(int x)
{
/*
se gaseste multimea in care se afla numarul x
urcand in arbore pana la radacina (adica x==P[x])
*/
if (x!=P[x]) P[x]=gaseste(P[x]);
return P[x];
}
void uneste(int x, int y)
{
/*
se uneste mulimea in care se afla x cu cea in care se afla y,
folosind reuniunea dupa rang, adica radacina arborelui
mai mic este legata de cea a arborelui mai mare.
daca rangurile sunt egale, se incrementeaza arbitrar unul dintre ei.
*/
if (rang[x]<rang[y]) P[x]=y;
else
{
P[y]=x;
if (rang[x]==rang[y]) rang[x]++;
}
}
int main()
{
freopen("disjoint.in","r",stdin);
freopen("disjoint.out","w",stdout);
scanf("%d %d",&n,&m);
for (i=0; i<=n; i++) P[i]=i;
for (i=1; i<=m; i++)
{ //1 - reuneste, 2 - query
scanf("%d %d %d",&nr,&a,&b);
if (nr==1) reuneste(a,b);
else
if (gaseste(a)==gaseste(b)) printf("DA\n");
else printf("NU\n");
}
return 0;
}