Cod sursa(job #665202)

Utilizator lianaliana tucar liana Data 21 ianuarie 2012 19:18:41
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <stdio.h>
#include <vector>
#include <set>
#include <utility>
using namespace std;
#define nmax 200005
#define inf 500000005
long i, n, m, a, b, c, d[nmax], pozan, rez;
pair<long, long> vfin[nmax];
pair <long, long> el1, el2, el;
vector <pair <long, long> > ma[nmax];
vector <pair <long, long> >::iterator it;
bool fol[nmax];
set <pair<long, long> > v;

void citire()
{
	scanf("%ld %ld",&n, &m);
	for (i=1;i<=m;i++)
	{
		scanf("%ld %ld %ld",&a, &b, &c);	
		el1.second=b;	el1.first=c;	ma[a].push_back(el1);	
		el2.second=a;	el2.first=c;	ma[b].push_back(el2);	
	}
	for (i=1;i<=n;i++)
		d[i]=inf;
}

void rezolvare()
{
	fol[1]=1;	pozan=1;
	for (i=1;i<=n-1;i++)
	{
		for (it=ma[pozan].begin();it!=ma[pozan].end();it++)
		{
			el=*it;
			if(!fol[el.second])
				if (d[el.second]>el.first)
				{
					if (d[el.second]!=inf)
					{	el1.second=el.second;	el1.first=d[el.second];	v.erase(el1);	}
					d[el.second]=el.first;
					v.insert(el);
				}
		}
		el=*v.begin();	v.erase(v.begin());
		vfin[i].first=el.second;	vfin[i].second=pozan;
		fol[el.second]=1;	rez+=el.first;	pozan=el.second;
	}
	printf("%ld\n",rez);
}

int main()
{
	freopen("apm.in","r",stdin);
	freopen("apm.out","w",stdout);
	citire();
	printf("%ld\n",n-1);
	rezolvare();
	for (i=1;i<n;i++)
		printf("%ld %ld\n",vfin[i].first,vfin[i].second);
	return 0;
}