Pagini recente » Cod sursa (job #1509534) | Cod sursa (job #990747) | Cod sursa (job #168871) | Cod sursa (job #424075) | Cod sursa (job #3321774)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
struct Edge {
int x, y, cost;
};
bool cmp(const Edge& a, const Edge& b) {
return a.cost < b.cost;
}
vector<int> parent, rankv;
int findRoot(int x) {
if (parent[x] != x)
parent[x] = findRoot(parent[x]);
return parent[x];
}
void unite(int x, int y) {
x = findRoot(x);
y = findRoot(y);
if (x == y) return;
if (rankv[x] < rankv[y])
parent[x] = y;
else if (rankv[x] > rankv[y])
parent[y] = x;
else {
parent[y] = x;
rankv[x]++;
}
}
int main() {
ifstream fin("apm.in");
ofstream fout("apm.out");
int N, M;
fin >> N >> M;
vector<Edge> edges(M);
for (int i = 0; i < M; i++)
fin >> edges[i].x >> edges[i].y >> edges[i].cost;
sort(edges.begin(), edges.end(), cmp);
parent.resize(N + 1);
rankv.resize(N + 1, 0);
for (int i = 1; i <= N; i++)
parent[i] = i;
long long totalCost = 0;
vector<pair<int, int>> result;
for (int i = 0; i < M; i++) {
int rx = findRoot(edges[i].x);
int ry = findRoot(edges[i].y);
if (rx != ry) {
unite(rx, ry);
totalCost += edges[i].cost;
result.push_back({ edges[i].x, edges[i].y });
}
}
fout << totalCost << "\n";
fout << result.size() << "\n";
for (size_t i = 0; i < result.size(); i++)
fout << result[i].second << " " << result[i].first << "\n";
fin.close();
fout.close();
return 0;
}