Pagini recente » Cod sursa (job #2939277) | Cod sursa (job #2620371) | Cod sursa (job #1223293) | Cod sursa (job #411160) | Cod sursa (job #2537322)
#include <bits/stdc++.h>
using namespace std;
void usain_bolt()
{
ios::sync_with_stdio(false);
cin.tie(0);
}
const int N = 2e5 + 5;
int Size[N], parent[N];
void make_set(int k)
{
Size[k] = 1;
parent[k] = k;
}
int find_set(int k)
{
if(parent[k] != k) return parent[k] = find_set(parent[k]);
return k;
}
void union_sets(int a, int b)
{
a = find_set(a), b = find_set(b);
if(a != b) {
if(Size[b] > Size[a]) swap(a, b);
Size[a] += Size[b];
parent[b] = a;
}
}
struct solve
{
int x, y, w;
bool operator < (const solve & nxt) const
{
return w < nxt.w;
}
};
vector < solve > edges;
vector < pair < int, int > > sol;
int main()
{
usain_bolt();
int n, m;
cin >> n >> m;
for(int i = 1; i <= m; ++i) {
int x, y, w;
cin >> x >> y >> w;
edges.push_back({x, y, w});
}
sort(edges.begin(), edges.end());
for(int i = 1; i <= n; ++i) make_set(i);
int ans = 0;
for(auto x : edges) {
if(find_set(x.x) != find_set(x.y)) {
union_sets(x.x, x.y);
ans += x.w;
sol.push_back({x.x, x.y});
}
}
cout << ans << "\n";
cout << sol.size() << "\n";
for(auto v : sol) cout << v.first << " " << v.second << "\n";
return 0;
}