Cod sursa(job #563825)

Utilizator cdascaluDascalu Cristian cdascalu Data 26 martie 2011 09:08:53
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.74 kb
#include<fstream>
#define MAX 100001
using namespace std;
int T[MAX],R[MAX],N,M;
void compress(int x,int father)
{
	int aux;
	while(T[x]!=x)
	{
		aux = x;
		x = T[x];
		T[aux] = father;
	}
}
void reunion(int x,int y)
{
	if(R[x]>=R[y])
	{
		T[y] = x;
		R[x] += R[y];
	}
	else
	{
		T[x] = y;
		R[y] += R[x];
	}
}
int find(int x)
{
	int init = x;
	while(T[x]!=x)
		x = T[x];
	compress(init,x);
	return x;
}
int main()
{
	ifstream f("disjoint.in");
	f>>N>>M;
	int x,y,c,i;
	for(i=1;i<=N;++i)
	{T[i]=i;R[i]=1;}
	ofstream g("disjoint.out");
	while(M--)
	{
		f>>c>>x>>y;
		if(c==1)
			reunion(find(x),find(y));
		else if(find(x) == find(y))g<<"DA\n";
			 else g<<"NU\n";
	}
	f.close();
	g.close();
	return 0;
}