最小生成树
Kruskal
#include<bits/stdc++.h> #define ri register int #define ll long long #define fast ios::sync_with_stdio(0), cin.tie(0), cout.tie(0) using namespace std; const inline int read(){ int k = 0, f = 1; char c = getchar(); for(;!isdigit(c); c = getchar()) if(c == '-') f = -1; for(;isdigit(c); c = getchar()) k = k * 10 + c - '0'; return k * f; } int n, m, f[1005], ans = 0, cnt = 0, sum = 0; struct edge{ int u, v, w; }r[100005]; int find(int x){ if(x == f[x]) return x; return f[x] = find(f[x]); } bool cmp(edge x, edge y){ return x.w < y.w; } void kruskal(){ for(ri i = 1; i <= m; ++i){ int a = find(r[i].u), b = find(r[i].v); if(a == b) continue; f[a] = b; cnt++; ans += r[i].w; if(cnt == n - 1) break; } } int main(){ n = read(), m = read(); for(ri i = 1; i <= n; ++i) f[i] = i; for(ri i = 1; i <= m; ++i){ r[i].u = read(); r[i].v = read(); r[i].w = read(); sum += r[i].w; } sort(r + 1, r + m + 1, cmp); kruskal(); ans = sum - ans; printf("%d",ans); return 0; }
Never say never.


浙公网安备 33010602011771号