Cod sursa(job #736552)

Utilizator Marius96Marius Gavrilescu Marius96 Data 18 aprilie 2012 22:21:24
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.56 kb
#include<cstdio>
int uf[100005];
int r [100005];
int find (int x)
{
	if(uf[x]!=x)
		uf[x]=find (uf[x]);
	return uf[x];
}

void join (int x,int y)
{
	if(x==y)
		return;
	if(r[x]<r[y])
		uf[x]=y;
	else if(r[x]>r[y])
		uf[y]=x;
	else{
		uf[y]=x;
		r[x]++;
	}
}

int main()
{
	freopen ("disjoint.in","r",stdin);
	freopen ("disjoint.out","w",stdout);
	int n,m;
	scanf ("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		uf[i]=i;
	while(m--){
		int o,x,y;
		scanf ("%d%d%d",&o,&x,&y);
		if(o==1)
			join (find (x),find (y));
		if(o==2)
			puts ((find (x)==find (y))?"DA":"NU");
	}
	return 0;
}