Pagini recente » Cod sursa (job #2431989) | Cod sursa (job #558593) | Cod sursa (job #975459) | Cod sursa (job #1969351) | Cod sursa (job #3221313)
#include <iostream>
#include <fstream>
#include <stdint.h>
#include <algorithm>
const int32_t MAX_N = 200000;
const int32_t MAX_M = 400000;
struct Edge {
int32_t x, y, c;
};
int32_t parent[MAX_N];
int32_t depth[MAX_N];
Edge edges[MAX_M];
bool edgeUsed[MAX_M];
int32_t Root(int32_t node) {
for(; parent[node] != -1; node = parent[node]);
return node;
}
void Merge(int32_t root1, int32_t root2) {
if(depth[root1] > depth[root2]) {
parent[root2] = root1;
} else if(depth[root1] < depth[root2]) {
parent[root1] = root2;
} else {
parent[root2] = root1;
++depth[root1];
}
}
bool Compare(const Edge& edge1, const Edge& edge2) {
return edge1.c < edge2.c;
}
int main() {
std::ifstream fin("apm.in");
std::ofstream fout("apm.out");
int32_t n, m;
fin >> n >> m;
for(int32_t i = 0; i != n; ++i)
parent[i] = -1;
for(int32_t i = 0; i != m; ++i) {
Edge edge;
fin >> edge.x >> edge.y >> edge.c;
--edge.x; --edge.y;
edges[i] = edge;
}
std::sort(edges, edges + m, Compare);
int32_t edgeCount = 0;
int64_t totalCost = 0;
for(int32_t i = 0; i != m && edgeCount != n - 1; ++i) {
int32_t root1 = Root(edges[i].x);
int32_t root2 = Root(edges[i].y);
if(root1 == root2)
continue;
edgeUsed[i] = true;
++edgeCount;
totalCost += edges[i].c;
Merge(root1, root2);
}
fout << totalCost << '\n' << edgeCount << '\n';
for(int32_t i = 0; i != m; ++i) {
if(edgeUsed[i])
fout << (edges[i].x + 1) << ' ' << (edges[i].y + 1) << '\n';
}
fin.close();
fout.close();
return 0;
}