Pagini recente » FMI No Stress 3 | Lexicografic | Atasamentele paginii Clasament preoni53b | Rating Ginga Tudor-Adrian (JustGinga) | Cod sursa (job #1534843)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int parent[200001], rk[200001];
int compress(int node) {
return (parent[node] == -1 ? node : parent[node] = compress(parent[node]));
}
int main() {
freopen("apm.in", "r", stdin);
freopen("apm.out", "w", stdout);
int n, m;
scanf("%d%d", &n, &m);
vector < pair < int, pair <int, int> > > edges;
for (int i = 0; i < m; ++i) {
int x, y, w;
scanf("%d %d %d", &x, &y, &w);
edges.push_back(make_pair(w, make_pair(x, y)));
}
sort(edges.begin(), edges.end());
for (int i = 0; i < n; ++i) {
parent[i] = - 1;
rk[i] = 1;
}
int ans = 0;
vector < pair <int, int> > v;
for (int i = 0; i < edges.size(); ++i) {
int rx = compress(edges[i].second.first);
int ry = compress(edges[i].second.second);
if (rx != ry) {
if (rk[rx] > rk[ry]) {
parent[ry] = rx;
rk[rx] += rk[ry];
} else {
parent[rx] = ry;
rk[ry] += rk[rx];
}
v.push_back(edges[i].second);
ans += edges[i].first;
}
}
printf("%d\n%d\n", ans, (int)v.size());
for (int i = 0; i < v.size(); ++i)
printf("%d %d\n", v[i].first, v[i].second);
return 0;
}