[最小割]StoerWagner演算法
阿新 • • 發佈:2020-07-18
StoerWagner演算法
StoerWagner演算法是一個找出無向圖全域性最小割的演算法 \(O(n^{3})\)
演算法過程
http://blog.sina.com.cn/s/blog_700906660100v7vb.html
原理
https://www.cnblogs.com/oyking/p/7339153.html
模板
模板題:http://poj.org/problem?id=2914
#include<cstdio> #include<cstring> using namespace std; const int inf=0x3f3f3f3f; int n,m; int mp[505][505]; int combine[505]; int w[505]; int vis[505]; int Search(int& s,int& t){ memset(w,0,sizeof(w)); memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++){ int maxn=-inf,tmpt=-1; for(int j=0;j<n;j++){ if(!vis[j]&&!combine[j]&&w[j]>maxn){ maxn=w[j]; tmpt=j; } } if(tmpt==-1) return w[t]; s=t,t=tmpt; vis[t]=1; for(int j=0;j<n;j++){ if(!vis[j]&&!combine[j]){ w[j]+=mp[t][j]; } } } return w[t]; } int mincut(){ int ans=inf; memset(combine,0,sizeof(combine)); for(int i=0;i<n-1;i++){ int s=-1,t=-1; int minC=Search(s,t); combine[t]=1; if(minC<ans) ans=minC; for(int j=0;j<n;j++){ if(!combine[j]){ mp[s][j]+=mp[t][j]; mp[j][s]+=mp[j][t]; } } } return ans; } int main() { while(scanf("%d%d",&n,&m)!=EOF){ memset(mp,0,sizeof(mp)); for(int i=1;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",mincut()); } return 0; }
堆優化
。。。