Pagini recente » Cod sursa (job #1916739) | Cod sursa (job #1370029) | Istoria paginii runda/vot/voteaza_miruna/clasament | Cod sursa (job #936434) | Cod sursa (job #936909)
Cod sursa(job #936909)
#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;
}