Pagini recente » Cod sursa (job #1445124) | Cod sursa (job #2882454) | Cod sursa (job #3289296) | Cod sursa (job #3001339) | Cod sursa (job #3179456)
#include <stdio.h>
#include <vector>
#include <algorithm>
#define MAX_N 200000
struct Edge {
int c, x, y;
};
std::vector<Edge> web, tree;
int par[MAX_N];
int root(int node) {
int r = node;
while (r != par[r])
r = par[r];
while (node != r) {
par[node] = r;
node = par[node];
}
return r;
}
int root2(int node) {
if (node == par[node])
return node;
par[node] = root2(par[node]);
return par[node];
}
bool unite(int x, int y) {
x = root2(x);
y = root2(y);
if (x == y)
return false;
par[x] = y;
return true;
}
bool cmp(Edge x, Edge y) {
return x.c < y.c;
}
int main() {
FILE *fin, *fout;
int n, m, x, y, c;
int i, k, res;
fin = fopen("apm.in", "r");
fscanf(fin, "%d%d", &n, &m);
for (i = 0; i < m; i++) {
fscanf(fin, "%d%d%d", &x, &y, &c);
web.push_back({c, x, y});
}
fclose(fin);
for (i = 1; i <= n; i++)
par[i] = i;
std::sort(web.begin(), web.end(), cmp);
res = 0;
k = n - 1;
for (i = 0; (i < m) && k; i++) {
x = web[i].x;
y = web[i].y;
if (unite(x, y)) {
res = res + web[i].c;
k--;
} else {
web[i].x = 0;
}
}
fout = fopen("apm.out", "w");
fprintf(fout, "%d\n%d\n", res, (n - 1));
for (Edge edge : web)
if (edge.x != 0)
fprintf(fout, "%d %d\n", edge.x, edge.y);
fclose(fout);
return 0;
}