Cod sursa(job #355521)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 11 octombrie 2009 13:41:21
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include<stdio.h>
#include<vector>
#include<list>
using namespace std;
int n,m;
vector <int> Tree,Rang;
int Find(int N)
{
	int root,aux;
	for(root=N;Tree[root]!=root;root=Tree[root]);
	while(Tree[N]!=N)
	{
		aux=Tree[N];
		Tree[N]=root;
		N=aux;
	}
	return root;
}
void combine(int x,int y)
{
	if(Rang[x]<Rang[y])
		Tree[x]=y;
	else
		if(Rang[x]>Rang[y])
			Tree[y]=x;
	if(Rang[x]==Rang[y])
	{
		Tree[x]=y;
		Rang[y]++;
	}
}
int main()
{
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	scanf("%d%d",&n,&m);
	Tree.resize(n+1);
	Rang.resize(n+1,1);
	for(int i=1;i<=n;i++)
	{
		Tree[i]=i;
	}
	for(int i=0;i<m;i++)
	{
		int op,x,y;
		scanf("%d%d%d",&op,&x,&y);
		if(op==1)
		{
			combine(Find(x),Find(y));
		}
		else
		{
			Find(x)==Find(y) ? printf("DA\n") : printf("NU\n");
		}
	}
	return 0;
}