Cod sursa(job #1051665)

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

	//Compresia de drumuri
	for (; x!=i; parent[x]=i, x=parent[x]);
	for (; y!=j; parent[y]=j, y=parent[y]);

	//RETURN
	return (i==j);
}
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(x,y);
		}
		else
		{
			if (find(x,y))
				printf("DA\n");
			else
				printf("NU\n");
		}

	}
	return 0;
}