Cod sursa(job #927477)

Utilizator taigi100Cazacu Robert taigi100 Data 25 martie 2013 20:22:44
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<stdio.h>

#define max 100002
int n,m,f[max],r[max];

void Unite(int x,int y)
{
	if(r[x]<=r[y])
		f[x]=y;
	else
		f[y]=x;
}
void Op1(int x,int y)
{
	int xr,yr;
	for(xr=f[x];xr!=f[xr];xr=f[x]);
	for(yr=f[y];yr!=f[yr];yr=f[y]);

	Unite(xr,yr);
}
int Find(int x)
{
	int rad,aux;
	for(rad=f[x];rad!=f[rad];rad=f[rad]);
	while( x!=f[x])
	{
		aux=f[x];
		f[x]=rad;
		x=aux;
	}
	return rad;
}
void Op2(int x,int y)
{
	if( Find(x)==Find(y) )
		printf("DA\n");
	else
		printf("NU\n");
}
void Solve()
{
	scanf("%d%d",&n,&m);

	int cod,x,y;
	for(int i=1;i<=n;i++)
	{
		f[i]=i;
		r[i]=1;
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&cod,&x,&y);
		switch(cod)
		{
		case 1:
			Op1(x,y);
			break;
		case 2:
			Op2(x,y);
			break;
		}
	}
}

int main()
{
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);

    Solve();

	return 0;
}