Pagini recente » Cod sursa (job #2603244) | Cod sursa (job #2828986) | Cod sursa (job #3040413) | Cod sursa (job #2405526) | Cod sursa (job #3267093)
#include <bits/stdc++.h>
using namespace std;
ifstream in("apm.in");
ofstream out("apm.out");
int n, m, parent[200005], sz[200005];
struct edging {
int fs, sd, w;
}edge[400005];
vector<int> use;
int total;
void make_set(int crt) {
parent[crt] = crt;
sz[crt] = 1;
}
int find_parent(int crt) {
if(crt == parent[crt])
return crt;
return parent[crt] = find_parent(parent[crt]);
}
void unite(int a, int b) {
a = find_parent(a);
b = find_parent(b);
if(a == b)
return;
if(sz[a] < sz[b])
swap(a, b);
parent[b] = a;
sz[a] += sz[b];
}
bool customSort(edging a, edging b) {
return a.w < b.w;
}
int main() {
int n, m; in >> n >> m;
for(int i = 1; i <= n; i++) {
make_set(i);
}
for(int i = 1; i <= m; i++) {
in >> edge[i].fs >> edge[i].sd >> edge[i].w;
}
sort(edge + 1, edge + m + 1, customSort);
for(int i = 1; i <= m; i++) {
if(find_parent(edge[i].fs) == find_parent(edge[i].sd))
continue;
unite(edge[i].fs, edge[i].sd);
total += edge[i].w;
use.push_back(i);
}
out << total << '\n';
out << use.size() << '\n';
for(auto i : use) {
out << edge[i].fs << ' ' << edge[i].sd << '\n';
}
return 0;
}