Cod sursa(job #1533536)

Utilizator greenadexIulia Harasim greenadex Data 22 noiembrie 2015 17:50:44
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
#include <algorithm>
#include <utility>
#include <vector>
#include <iostream>

using namespace std;

ifstream fin("apm.in");
ofstream fout("apm.out");

const int MAX = 2e5 + 5;

pair<int, pair<int, int>> edges[MAX];
vector<pair<int, int>> sol;

int n, m, total_cost;
int father[MAX];

int find_root(int a) {
	if (father[a] != a) 
		father[a] = find_root(father[a]);
	return father[a];
}

void unite(int a, int b) {
	father[find_root(a)] = find_root(b);
}

int main() {
	fin >> n >> m;
	
	for (int i = 1; i <= n; i++)
		father[i] = i;

	for (int i = 0; i < m; i++)
		fin >> edges[i].second.first >> edges[i].second.second >> edges[i].first;

	sort(edges, edges + m);

	for (int i = 0; i < m; i++) {
		int cost = edges[i].first, a = edges[i].second.first, b = edges[i].second.second;
		if (find_root(a) != find_root(b)) {
			unite(a, b);
			sol.push_back(edges[i].second);
			total_cost += cost;
		}
	}
	fout << total_cost << '\n' << sol.size() << '\n';
	for (auto iter: sol) 
		fout << iter.first << ' ' << iter.second << '\n';
	return 0;
}