Cod sursa(job #496437)

Utilizator vlad.maneaVlad Manea vlad.manea Data 29 octombrie 2010 00:07:00
Problema Arbore partial de cost minim Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb


#include <fstream>
#include <set>
#include <vector>
#include <limits>
using namespace std;

#define NMax 50001

int N, M;
vector< pair<int, int> > W[NMax];
vector<int> D;
vector<bool> V;
vector< pair<int, int> > F;
set< pair<int, int> > H;

void read()
{
	int u, v, c;
	ifstream fin;
	fin.open("apm.in", fstream::in);
	fin >> N >> M;
	while (M--)
	{
		fin >> u >> v >> c;
		W[u].push_back(pair<int, int>(v, c));
		W[v].push_back(pair<int, int>(u, c));
	}
	fin.close();
}

void solve()
{
	int u, v, c;
	for (int i = 0; i <= N; ++i)
	{
		D.push_back(INT_MAX);
		F.push_back(pair<int, int>(0, INT_MAX));
		V.push_back(false);
	}
	D[1] = 0;
	F[1] = pair<int, int>(0, 0);
	V[1] = true;
	H.insert(pair<int, int>(0, 1));
	while(!H.empty())
	{
		u = H.begin()->second;
		V[u] = true;
		H.erase(*H.begin());
		for (vector< pair<int, int> >::iterator i = W[u].begin(); i != W[u].end(); ++i)
		{
			v = i->first;
			if (V[v] == false)
			{
				c = i->second;
				if (D[v] > c)
				{
					D[v] = c;
					F[v] = pair<int, int>(u, c);
					H.insert(pair<int, int>(D[v], v));
				}
			}
		}
	}
}

void write()
{
	ofstream fout("apm.out");
	int S = 0;
	for (int i = 1; i <= N; ++i)
		S += F[i].second;
	fout << S << '\n';
	fout << N - 1 << '\n';
	for (int i = 1; i <= N; ++i)
		if (F[i].first > 0)
			fout << i << ' ' << F[i].first << '\n';
	fout.close();
}

int main()
{
	read();
	solve();
	write();
	return 0;
}