Cod sursa(job #261898)

Utilizator vladbBogolin Vlad vladb Data 18 februarie 2009 20:46:33
Problema Arbore partial de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<fstream.h>
#include<limits.h>

ofstream fout("apm.out");

long long n,m,e,u,c[1000],t[1000],p=1;
int a[1000][1000],q[1000];

void citire()
{       int z;
	long x,y,i;
	ifstream fin("apm.in");
	fin>>n>>m;
	for(i=1;i<=m;i++)
	{	fin>>x>>y>>z;
		a[x][y]=z;
		a[y][x]=z;
	}
	fin.close();
}

int vf()
{	long min,x,i,j;
	min=LONG_MAX;
	for(i=1;i<=n;i++)
		if(q[i]==1) for(j=1;j<=n;j++)
				if(q[j]==0) if(a[i][j]<min&&a[i][j]!=0){ min=a[i][j];
									 x=i;
									}
	q[x]=0;
	p++;
	return x;
}

int main()
{       long i;
	citire();
	for(i=2;i<=n;i++)
	{	q[i]=1;
		c[i]=32000;
	}
	c[1]=0;
	t[1]=-1;
	while(p<=n)
	{	if(p>1)	u=vf();
		else{ u=1;
		      p++;
		    }
		for(i=1;i<=n;i++)
			if(q[i]==1&&a[u][i]<c[i]&&a[u][i]!=0)
			{	t[i]=u;
				c[i]=a[u][i];
			}
	}
	for(i=1;i<=n;i++)
	      if(t[i]==0) e+=a[1][i];
	      else if(t[i]>0) e+=a[i][t[i]];
	fout<<e<<"\n"<<n-1<<"\n";
	for(i=1;i<=n;i++)
		if(t[i]==0) fout<<1<<" "<<i<<"\n";
			else if(t[i]>0) fout<<i<<" "<<t[i]<<"\n";
	fout.close();
	return 0;
}