Cod sursa(job #508694)

Utilizator siminescuPaval Cristi Onisim siminescu Data 9 decembrie 2010 13:51:57
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<fstream>
using namespace std;

ifstream f("apm.in");
ofstream g("apm.out");

# define maxM 400002

int cn,m,c[maxM],a[2][maxM],t[200002],cost;

void citire()
{
	int i;
	f>>cn>>m;
	for(i=1;i<=m;++i)
		f>>a[0][i]>>a[1][i]>>c[i];
}
void swap(int i,int j)
{
	int a1=a[0][i],a2=a[1][i],ac=c[i];
	a[0][i]=a[0][j];a[1][i]=a[1][j];c[i]=c[j];
	a[0][j]=a1;a[1][j]=a2;c[j]=ac;
}
void sift(int n,int k)
{
	int son;
	do{
		son=0;
		if(2*k<=n)
		{
			son=2*k;
			if(son<n && c[son]<c[son+1]) son++;
			if(c[son]>c[k])
			{
				swap(son,k);
				k=son;
			}
			else son=0;
		}
	}while(son);
}
void HeapSort(int n)
{
	int i;
	for(i=n/2;i;--i)
		sift(n,i);
	for(i=n;i>1;--i)
	{
		swap(i,1);
		sift(i-1,1);
	}
}
int pad(int i,int j,int k)
{
	int p;
	p=i;
	while(t[i]!=i) i=t[i];
	t[p]=i;p=j;
	while(t[j]!=j) j=t[j];
	if(i!=j)
	{		
		t[i]=j;
		cost+=c[k];
		return 1;
	}
	return 0;
}
int main()
{
	int i,k=0;
	citire();
	HeapSort(m);
	for(i=1;i<=cn;i++)
		t[i]=i;
	for(i=1;i<=m;i++)
		if(pad(a[0][i],a[1][i],i))
		{
			a[0][++k]=a[0][i];
			a[1][k]=a[1][i];
		}
	g<<cost<<'\n'<<cn-1<<'\n';
	for(i=1;i<cn;i++) g<<a[0][i]<<" "<<a[1][i]<<'\n';		
}