Cod sursa(job #404036)

Utilizator GotenAmza Catalin Goten Data 25 februarie 2010 18:36:42
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 kb
#include<fstream.h>
int rang[100100],padre[100100];
void unire(int a, int b)
{
	if(rang[a]==rang[b])
	{
		rang[a]++;
		rang[b]++;
		padre[b]=a;
	}
	else
		if(rang[a]>rang[b])
			padre[b]=a;
		else
			padre[a]=b;
		
}
int query(int x)
{
	int i,temp[100100];	
	while(x!=padre[x])
	{
		temp[++temp[0]]=x;
		x=padre[x];
	}
	for(i=1;i<=temp[0];i++)
		padre[temp[i]]=x;
	return x;
}
int main()
{
	int n,m,a,b,i,op;
	ifstream f("disjoint.in");
	ofstream g("disjoint.out");
	f>>n>>m;
	for(i=1;i<=n;i++)
	{
		rang[i]=1;
		padre[i]=i;
	}
	while(m--)
	{
		f>>op>>a>>b;
		if(op==1)
			unire(a,b);
		else
			if(query(a)==query(b))
				g<<"DA\n";
			else
				g<<"NU\n";
	}
	return 0;
}