Cod sursa(job #732285)

Utilizator Marius_mFMI-M2 Marius Melemciuc Marius_m Data 10 aprilie 2012 01:01:02
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<cstdio>
#include<iostream>

using namespace std;

const int Nmax = 200002;

int n,m,v_nr,V[Nmax];   // v_nr reprezinta numarul de elemente din vectorul v          
typedef struct muchie {int x,y,c;}MUCHIE;
MUCHIE a[Nmax],v[Nmax];                                   // v reprezinta muchiile arborelui
FILE *in,*out;

int solve()
{
	int i,j,z,cost;                // z reprezinta indicele componentei conexe
	MUCHIE aux;
	for(i=1;i<m;i++)
		for(j=i+1;j<=m;j++)
			if(a[i].c>a[j].c)
			{
				aux=a[i];
				a[i]=a[j];
				a[j]=aux;
			}   //  for(i=1;i<=m;i++) cout<<a[i].x<<" "<<a[i].y<<" "<<a[i].c<<endl;
	v_nr=1;               
	v[v_nr]=a[1];
	z=-1;//a[1].x;
	V[a[1].x]=z;
	V[a[1].y]=z;
	cost=v[v_nr].c;
	j=1;
	while( v_nr < n-1 )
	{
		j++;
		if(V[a[j].x]!=z || V[a[j].y]!=z)
		{
			v_nr++;
			v[v_nr]=a[j];  cout<<j<<" ";
			V[a[j].x]=z;
			V[a[j].y]=z;
			cost=cost+v[v_nr].c;               
		}
	}      // for(i=1;i<=v_nr;i++) cout<<v[i].x<<" "<<v[i].y<<" "<<v[i].c<<endl;
	return cost;
}

int main()
{
	int i;
	in=fopen("apm.in","r");
	out=fopen("apm.out","w");
	fscanf(in,"%d %d",&n,&m);
	for(i=1;i<=n;i++)
		V[i]=i;
	for(i=1;i<=m;i++)
		fscanf(in,"%d %d %d",&a[i].x,&a[i].y,&a[i].c); 
	fprintf(out,"%d\n%d",solve(),v_nr);                 
	for(i=1;i<=v_nr;i++) 
		fprintf(out,"\n%d %d",v[i].x,v[i].y); 
	fclose(in);
	fclose(out);
	return 0;
}