Cod sursa(job #1051680)

Utilizator mircea.dobreanuMircea Dobreanu mircea.dobreanu Data 10 decembrie 2013 13:31:23
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include<cstdio>
using namespace std;
const int MAXN=100005;
int n,m;
int parent[MAXN],rang[MAXN];
bool find(int x)
{
	int i,j;
	//ITEREZ PANA LA RADACINI
	for (i=x; parent[i]!=i; i=parent[i]);

	//Compresia de drumuri
	for (; x!=i; parent[x]=i, x=j);
	{
		j=parent[x];
	}
	return i;
}
void unite(int x,int y)
{
	if (rang[x]>rang[y])
		parent[y]=x;
	else
		parent[x]=y;


	if (rang[x]==rang[y])
		++rang[y];
}
int main()
{
	int cmd,x,y,i,k;
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	scanf("%d%d",&n,&m);
	//INITIALIZARE
	for (i=1; i<=n; rang[i]=1, parent[i]=i, ++i);
	//PARSARE
	for (k=1; k<=m; ++k)
	{
		scanf("%d%d%d",&cmd,&x,&y);
		if (cmd==1)
		{
			unite(find(x),find(y));
		}
		else
		{
			if (find(x)==find(y))
				printf("DA\n");
			else
				printf("NU\n");
		}

	}
	return 0;
}