Cod sursa(job #573539)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 6 aprilie 2011 12:52:53
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.73 kb
#include<cstdio>

int i,n,m,t[100010],r[100010];

int gas(int x)
{
	int rad;
	
	for(rad=x;rad!=t[rad];rad=t[rad]);
	
	while(x!=t[x])
	{
		int aux=t[x];
		t[x]=rad;
		x=aux;
	}
	
	return rad;
}

void uneste(int x,int y)
{
	if(r[x]<r[y])
		t[x]=y;
	else 
		t[y]=x;
	
	if(r[x]==r[y]) r[x]++;
}

int main()
{
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	
	scanf("%d%d",&n,&m);
	
	for(i=1;i<=n;++i)
	{
		t[i]=i;
		r[i]=1;
	}
	
	for(i=1;i<=m;++i)
	{
		int tip,x,y;
		scanf("%d%d%d",&tip,&x,&y);
		
		if(tip==1)	uneste(gas(x),gas(y));
		else
		{
			if(gas(x)==gas(y)) printf("DA\n");
			else printf("NU\n");
		}
	}
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}