Pagini recente » Cod sursa (job #449634) | Cod sursa (job #32429) | Cod sursa (job #878280) | Cod sursa (job #1146000) | Cod sursa (job #1601717)
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXN = 200010;
const int MAXM = 400010;
struct muchie {
int x, y, c;
};
muchie U[MAXM];
int n, m, x, y, c, r[MAXN], t[MAXN], cost;
vector< pair<int, int> > sol;
inline bool comp(muchie a, muchie b) {
return (a.c < b.c);
}
void read() {
if (scanf("%d%d",&n,&m)) ;
for (int i=1; i<=m; ++i)
if (scanf("%d%d%d",&U[i].x,&U[i].y,&U[i].c)) ;
for(int i=1; i<=n; ++i) {
t[i] = i;
r[i] = 1;
}
sort(U+1, U+m+1, comp);
}
void connect(int x, int y) {
if (r[x] > r[y])
t[y] = x;
else t[x] = y;
if (r[x] = r[y])
++r[y];
}
int radacina(int x) {
int r;
for (r = x; r != t[r]; r = t[r])
;
return r;
}
void algKruskal() {
for (int i=1; i<=m; ++i) {
int x = U[i].x;
int y = U[i].y;
int rx = radacina(x);
int ry = radacina(y);
if (rx != ry) {
connect(rx, ry);
sol.push_back(make_pair(U[i].x, U[i].y));
cost += U[i].c;
}
}
}
void write() {
printf("%d\n", cost);
for(vector< pair<int, int> >::iterator i = sol.begin(); i != sol.end(); ++i)
printf("%d %d\n", i->first, i->second);
}
int main() {
if (freopen("apm.in", "rt", stdin)) ;
if (freopen("apm.out", "wt", stdout)) ;
read();
algKruskal();
write();
fclose(stdin);
fclose(stdout);
return 0;
}