Cod sursa(job #263600)

Utilizator P1gl3TGilca Mircea Alexandru P1gl3T Data 20 februarie 2009 17:51:17
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.74 kb
#include<stdio.h>
const int N=100002;
int t[N],rang[N];

int multime(int x) //merge recursiv pentru a realiza compresia drumului
{
	if(t[x]!=x) 
		t[x]=multime(t[x]);
	return t[x];
}
void reuneste(int x, int y)
{
	x=multime(x);
	y=multime(y);
	if(rang[x]<rang[y]) 
		t[x]=y;
	else
		t[y]=x;
	if(rang[x]==rang[y]) ++rang[x]; // daca multimile au rang egal maresc rangul pt mult. noua (x)
}
int main()
{
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	int n,m,i,cod,x,y;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i) t[i]=i;
	for(i=0;i<m;++i)
	{
		scanf("%d%d%d",&cod,&x,&y);
		if(cod==1)
			reuneste(x,y);
		else
			if(multime(x)==multime(y)) printf("DA\n");
			else printf("NU\n");
	}
	return 0;
}