Pagini recente » Cod sursa (job #2877990) | Cod sursa (job #2967074) | Cod sursa (job #2377145) | Cod sursa (job #2704591) | Cod sursa (job #1918757)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
const int NMAX = 200007;
const int MMAX = 400007;
ifstream cin("apm.in");
ofstream cout("apm.out");
struct apm {
int x;
int y;
int c;
};
apm a[MMAX];
vector < int > sol;
int n, m;
int T[NMAX], H[NMAX];
int father(int node) {
if(node == T[node]) {
return node;
}
return father(T[node]);
}
void unite(int a, int b) {
if(H[a] > H[b]) {
T[b] = a;
}
else {
if(H[b] < H[a]) {
T[a] = b;
}
else{
++H[a];
T[b] = a;
}
}
}
int cmp(apm a, apm b) {
return a.c < b.c;
}
int main() {
cin >> n >> m;
for(int i = 1; i <= n; ++i) {
T[i] = i;
H[i] = 1;
}
for(int i = 1; i <= m; ++i) {
int X, Y, C;
cin >> X >> Y >> C;
a[i].x = X;
a[i].y = Y;
a[i].c = C;
}
sort(a + 1, a + m + 1, cmp);
int ans = 0;
for(int i = 1; i <= m; ++i) {
int Tx = father(a[i].x);
int Ty = father(a[i].y);
if(Tx != Ty && sol.size() < n) {
ans += a[i].c;
unite(Tx, Ty);
sol.push_back(i);
}
}
cout << ans << "\n" << sol.size() << "\n";
for(int i = 0; i < sol.size(); ++i) {
cout << a[sol[i]].x << " " << a[sol[i]].y << "\n";
}
return 0;
}