Cod sursa(job #360172)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 30 octombrie 2009 11:17:57
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <stdio.h>
#define N 1<<17
int n,m,tip,x,y;
int parinte[N],grd[N];
void init()
{
	int i;
	for (i=1; i<=n; i++)
	{
		parinte[i]=i;
		grd[i]=1;
	}
}
int rad(int x)
{
	int i,nod=x,y;
	while (parinte[nod]!=nod)
		nod=parinte[nod];
	while (parinte[x]!=x)
	{
		y=parinte[x];
		parinte[x]=nod;
		x=y;
	}
	return nod;
}
void uneste(int x,int y)
{
	if (grd[x]<grd[y])
		parinte[x]=y;
	else
		parinte[y]=x;
	if (grd[x]==grd[y])
		grd[x]++;
}
int main()
{
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	scanf("%d%d",&n,&m);
	int i;
	init();
	for (i=1; i<=m; i++)
	{
		scanf("%d%d%d",&tip,&x,&y);
		tip--;
		if (tip)
			if (rad(x)==rad(y))
				printf("DA\n");
			else
				printf("NU\n");
		else
			uneste(rad(x),rad(y));
	}
	return 0;
}