[最小割]StoerWagner算法
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;
}
堆优化
。。。
转载请注明出处:https://www.cnblogs.com/lllxq/