Cod sursa(job #379717)

Utilizator GotenAmza Catalin Goten Data 3 ianuarie 2010 15:57:07
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.69 kb
#include<fstream.h>

int padre[101000],rango[101000];

int busca(int x)
{
	int t=x,temp[101000],k=0;
	while(t!=padre[t])
	{
		temp[++k]=t;
		t=padre[t];
	}
	for(x=1;x<=k;x++)
		padre[temp[x]]=t;
	return t;
}

void unificar(int x, int y)
{
	if(rango[x]>rango[y])
		padre[y]=x;
	else
		padre[x]=y;
	if(rango[x]==rango[y])
		rango[y]++;
}

int main()
{
	int n,m,i,op,x,y;
	ifstream f("disjoint.in");
	ofstream g("disjoint.out");
	f>>n>>m;
	for(i=1;i<=n;i++)
	{
		padre[i]=i;
		rango[i]=1;
	}
	for(i=1;i<=m;i++)
	{
		f>>op>>x>>y;
		if(op==1)
			unificar(busca(x),busca(y));
		else
			if(busca(x)==busca(y))
				g<<"DA\n";
			else
				g<<"NU\n";
	}
	return 0;
}