最大流 == 最小割
///无向图 求最小割 模板 节点编号从 1 开始 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int n,m; int cnt = 0; int mp[510][510] ; int v[510] ,dis[510] ,vis[510] ; int Stoer_Wagner(int n){ int ans =0x3f3f3f3f ; for(int i=1;i<=n;i++){ v[i] = i; } while(n>1){ int k,pre =0 ; ///pre表示之前加入集合的点 memset(vis , 0 ,sizeof vis) ; memset(dis ,0 ,sizeof dis) ; for(int i=1 ; i<n ;i++){ k = -1 ; for(int j=1;j<n;j++){ if(!vis[v[j]]) { dis[v[j]] +=mp[v[pre]][v[j]]; if(k==-1 || dis[v[k]] < dis[v[j]]){ k=j; } } } cout<<k<<" "<<n<<endl; vis[v[k]] = 1; if(i == n-1){ ans = min(ans , dis[v[k]]) ; for(int j=0;j<n;j++){ ///将k 合并至pre,对应边权也要合并 mp[v[pre]][v[j]]+=mp[v[k]][v[j]]; mp[v[j]][v[pre]]+=mp[v[k]][v[j]] ; } v[k] = v[--n] ; } pre = k; } } return ans ; } int main() { while(~scanf("%d%d",&n,&m)){ memset(mp,0,sizeof mp) ; for(int i=0;i<m;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); mp[u][v]+=w ; mp[v][u]+=w ; } printf("%d\n",Stoer_Wagner(n)) ; } return 0; }