Pagini recente » Cod sursa (job #552585) | Cod sursa (job #1249613) | Cod sursa (job #148438) | Cod sursa (job #1138907) | Cod sursa (job #1117130)
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
#define MAXN 200005
struct edge {
int x, y, c;
};
typedef vector<edge>::iterator iter;
FILE* f = fopen("apm.in", "r");
FILE* g = fopen("apm.out", "w");
int n, m;
vector<edge> G, sol;
int tata[MAXN], rang[MAXN];
inline bool cmp(const edge a, const edge b) {
return a.c < b.c;
}
int find(int x)
{
int r = x;
while (r != tata[r]) r = tata[r];
while (x != tata[x]) {
int y = tata[x];
tata[x] = r;
x = y;
}
return r;
}
void unite(int x, int y)
{
x = find(x), y = find(y);
if (rang[x] > rang[y]) {
tata[y] = x;
} else {
tata[x] = y;
}
if (rang[x] == rang[y]) {
rang[x]++;
}
}
int main()
{
fscanf(f, "%d %d\n", &n, &m);
for (int i = 1; i <= n; i++) {
tata[i] = i;
rang[i] = 1;
}
G.resize(m);
for (int i = 0; i < m; i++) {
fscanf(f, "%d %d %d\n", &G[i].x, &G[i].y, &G[i].c);
}
sort(G.begin(), G.end(), cmp);
int cost = 0;
for (iter it = G.begin(); it != G.end(); it++) {
if (find(it->x) != find(it->y)) {
unite(it->x, it->y);
cost += it->c;
sol.push_back(*it);
}
}
fprintf(g, "%d\n%d\n", cost, sol.size());
for (iter it = sol.begin(); it != sol.end(); it++) {
fprintf(g, "%d %d\n", it->x, it->y);
}
fclose(f);
fclose(g);
return 0;
}