首页 > 代码库 > 全局最小割模板(定S,不定T,找最小割)
全局最小割模板(定S,不定T,找最小割)
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;const int MAXN=400;const int INF=0x7fffffff;int N,M,S;int a[MAXN][MAXN],dis[MAXN];bool visit[MAXN],d[MAXN];int StoerWagner(int N){ int p=N,ans=INF,Max,t,s,k,i; memset(d,0,sizeof(d)); while (--p>0) { memset(visit,0,sizeof(visit)); memset(dis,0,sizeof(dis)); i=1; while (d[i]) i++; visit[i]=1; for (int j=1;j<=N;j++) if (!d[j] && !visit[j]) dis[j]=a[i][j]; t=s=i; for (;i<=N;i++) { Max=0; for (int j=1;j<=N;j++) if (!d[j] && !visit[j] && Max<dis[j]) Max=dis[k=j]; if (!Max) break; visit[k]=1; for (int j=1;j<=N;j++) if (!d[j] && !visit[j]) dis[j]+=a[k][j]; s=t; t=k; } if (ans>dis[t]) ans=dis[t]; d[t]=1; for (int j=1;j<=N;j++) if (!d[j]) { a[s][j]+=a[t][j]; a[j][s]+=a[j][t]; } } return ans;}int main(){ while (1) { scanf("%d%d%d",&N,&M,&S); if (!N && !M && !S) break;///N 点数,M 边数,S起点 memset(a,0,sizeof(a)); for (int i=1;i<=M;i++) { int x,y,d; scanf("%d%d%d",&x,&y,&d); a[x][y]+=d; a[y][x]+=d; } printf("%d\n",StoerWagner(N)); } return 0;}
全局最小割模板(定S,不定T,找最小割)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。