Cod sursa(job #320916)

Utilizator TyberFMI Dogan Adrian Ioan Lucian Tyber Data 6 iunie 2009 09:52:00
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include<stdio.h>
#define nmax 100010
int arb[nmax],rank[nmax],n,m;
int find(int);
void unite(int,int);
int main()
{
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	scanf("%d %d",&n,&m);
	int i,x,y,k;
	for(i=1;i<=n;i++)
	{
		arb[i]=i;
		rank[i]=1;
	}
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d",&k,&x,&y);
		if(k==2)
		{
			if(find(x)==find(y))printf("DA\n");
			else printf("NU\n");
		}
		else
		{
			if(find(x)==find(y))
			{
				fprintf(stderr,"%d",i);
				return 0;
			}
			unite(find(x),find(y));
		}
	}
	return 0;
}
int find(int x)
{
	int i,y;
	for(i=x;arb[i]!=i;i=arb[i]);
	while(arb[x]!=x)
	{
		y=arb[x];
		arb[x]=i;
		x=y;
	}
	return i;
}
void unite(int x,int y)
{
	if(rank[x]>rank[y])
		arb[y]=x;
	else
		arb[x]=y;
	if(rank[x]==rank[y])
		rank[y]++;
}