Cod sursa(job #235268)

Utilizator stinkyStinky si Grasa stinky Data 23 decembrie 2008 11:16:20
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include<stdio.h>
#define N 100005

int m,n,h[N],t[N];

void init()
{
	for(int i=1;i<=n;++i)
	{
		h[i]=0;
		t[i]=i;
	}
}

void compresie(int x,int r)
{
	int aux;
	while(t[x]!=x)
	{
		aux=t[x];
		t[x]=r;
		x=aux;
	}
}

int rad(int x)
{
	int r=x;
	for(;t[r]!=r;r=t[r]);
	compresie(x,r);
	return r;
}

void uneste(int x,int y)
{
	int rx=rad(x),ry=rad(y);
	if(h[rx]<h[ry])
		t[rx]=ry;
	else
		t[ry]=rx;
	if(h[rx]==h[ry])
		++h[rx];
}

int main()
{
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	int cod,x,y;
	scanf("%d%d",&n,&m);
	init();
	while(m--)
	{
		scanf("%d%d%d",&cod,&x,&y);
		if(cod==1)
			uneste(x,y);
		else
			if(rad(x)==rad(y))
				printf("DA\n");
			else
				printf("NU\n");
	}
	return 0;
}