克鲁斯卡尔模板。
#include<bits/stdc++.h> // #define int long long #define double long double #define x first #define y second using namespace std; typedef long long LL; typedef long long ll; typedef pair<int, int> PII; const int N = 5e5 + 10; const int M = 1e3 + 10; int mod = 1e9 + 7; struct Link { int u, v, w, id; } s[N]; int root[N]; int find(int x) { if (root[x] == x) return x; return root[x] = find(root[x]); } bool cmp(Link xx, Link yy) { return xx.w < yy.w; } void solve() { int n, m; cin >> n >> m; for (int i = 1; i <= m; i++) { int u, v, w; cin >> u >> v >> w; s[i] = {u, v, w, i}; } for (int i = 1; i <= n; i++) root[i] = i; sort(s + 1, s + m + 1, cmp); vector<int>ans; ll sum = 0, cnt = 0; for (int i = 1; i <= m; i++) { int u = find(s[i].u), v = find(s[i].v); if (u != v) { root[u] = v; sum += s[i].w; ans.push_back(s[i].id); cnt++; } if (cnt == n - 1) break; } cout << sum << "\n"; for (int i = 0; i < ans.size(); i++) cout << ans[i] << " "; } signed main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); int _; _ = 1; //cin>>_; while (_--) { solve(); } }