Pagini recente » Cod sursa (job #2511170) | Cod sursa (job #2301567) | Cod sursa (job #1519957) | Cod sursa (job #2785441) | Cod sursa (job #1694218)
#include <cstdio>
#include <algorithm>
#include <vector>
#define VMAX 200009
#define EMAX 400009
using namespace std;
struct edge {
int x, y, c;
edge(int _x, int _y, int _c) : x(_x), y(_y), c(_c) {
}
bool operator<(const edge& other) const{
return c < other.c;
}
};
int V, E, T[VMAX],cost;
vector<edge> v;
vector<int> sol;
int gr(const int& x) {
if(T[x] != x) {
T[x] = gr(T[x]);
}
return T[x];
}
void reunion(const int& x, const int& y) {
T[gr(x)] = gr(y);
}
int main() {
freopen("apm.in", "r", stdin);
freopen("apm.out", "w", stdout);
scanf("%d%d", &V, &E);
for (int i = 0; i < E; ++i) {
int x, y, c;
scanf("%d%d%d", &x, &y, &c);
v.push_back(edge(x, y, c));
}
sort(v.begin(), v.end());
for (int i = 1; i <= V; ++i) {
T[i] = i;
}
int i = 0;
for (auto e = v.begin(); e != v.end(); ++e, ++i) {
if (gr(e->x) != gr(e->y)) {
cost += e->c;
sol.push_back(i);
reunion(e->x, e->y);
}
}
printf("%d\n%d\n", cost, sol.size());
for (auto e = sol.begin(); e != sol.end(); ++e) {
printf("%d %d\n", v[*e].x, v[*e].y);
}
return 0;
}