Stoer-Wagner 全局最小割代码
还是很好背的。
#include<bits/stdc++.h>
using namespace std;
const int N = 623, inf = 0x3f3f3f3f;
int n,m,dis[N][N];
int s, t;
int ord[N], w[N];
bool deld[N], vis[N];
int proc(int x) {
memset(vis, 0, sizeof vis);
memset(w, 0, sizeof w);
for(int i=1; i<=n-x+1; ++i) {
int mx = 0;
for(int j=1; j<=n; ++j)
if(!deld[j] && !vis[j] && (!mx || w[j]>w[mx])) mx=j;
vis[mx]=true, ord[i]=mx;
for(int j=1; j<=n; ++j)
if(!deld[j] && !vis[j]) w[j] += dis[mx][j];
}
s = ord[n-x], t = ord[n-x+1];
return w[t];
}
int sw() {
int res = inf;
for(int i=1; i<n; ++i) {
res = min(res, proc(i));
deld[t] = true;
for(int j=1; j<=n; ++j) {
dis[s][j] += dis[t][j], dis[j][s] += dis[j][t];
}
}
return res;
}
int main() {
scanf("%d%d", &n, &m);
for(int i=0; i<m; ++i) {int x,y,z;
scanf("%d%d%d", &x, &y, &z);
dis[x][y]+=z, dis[y][x]+=z;
}
cout << sw();
return 0;
}