Cod sursa(job #936909)

Utilizator forgetHow Si Yu forget Data 9 aprilie 2013 01:42:36
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

vector<int> parent, rank;

int find(int i)
{
	return (parent[i]? parent[i] = find(parent[i]) : i);
}

void merge(pair<int,int> a)
{
	int root1 = find(a.first), root2 = find(a.second);
	if (rank[root1] < rank[root2]) parent[root1] = root2;
	else if (rank[root1] > rank[root2]) parent[root2] = root1;
	else {parent[root2] = root1; ++rank[root1];}
}

int main() {
	ifstream fin("apm.in");
	ofstream fout("apm.out");
	int n, m;
	fin >> n >> m;
	parent.resize(n+1);
	rank.resize(n+1);
	pair<int,int> edge[m], weight[m];
	for (int i = 0; i < m; ++i) {
		fin >> edge[i].first >> edge[i].second >> weight[i].first;
		weight[i].second = i;
	}
	sort(weight, weight+m);

	int ans = 0;
	vector<int> mst;
	mst.reserve(n-1);
	for (int i = 0; i < m; ++i) {
		int k = weight[i].second;
		if (find(edge[k].first) != find(edge[k].second)) {
			merge(edge[k]);
			ans += weight[i].first;
			mst.push_back(k);
		}
	}
	fout << ans << '\n';
	fout << n-1 << '\n';
	for (int i = 0; i < n-1; ++i)
		fout << edge[mst[i]].first << ' ' << edge[mst[i]].second << '\n';
	return 0;
}