首页 > 代码库 > 全局最小割(n^3)
全局最小割(n^3)
#include<iostream>#include<cstring>#define rep(i,n) for(int i=0;i<n;i++)#define fab(i,a,b) for(int i=a;i<=b;i++)#define sf scanf#define pf printf#include<cstdio>const int N = 200;int n,m;int map[N][N],combine[N],vis[N],wet[N];int S,T,minCut;void init(){ memset(map,0,sizeof map); sf("%d%d",&n,&m); rep(i,m){ int u,v,w; sf("%d%d%d",&u,&v,&w); u--;v--; map[u][v]+=w;map[v][u]+=w; }}#define INF 0x3f3f3f3fvoid find(){ int Max,tmp; memset(vis,0,sizeof vis); memset(wet,0,sizeof wet); S=T=-1; rep(i,n){ Max=-INF; rep(j,n){ if(!combine[j]&&!vis[j]&&wet[j]>Max){ tmp=j; Max=wet[j]; } } if(T==tmp)return; S=T;T=tmp; minCut=Max; vis[tmp]=1; rep(j,n){ if(!combine[j]&&!vis[j]){ wet[j]+=map[tmp][j]; } } }}int Stoer_Wagner(){ memset(combine,0,sizeof combine); int ans=INF; rep(i,n-1){ find(); if(minCut<ans)ans=minCut; if(ans==0)return ans; combine[T]=1; rep(j,n){ if(!combine[j]){ map[S][j]+=map[T][j]; map[j][S]+=map[j][T]; } } } return ans;}void solve(){ pf("%d\n",Stoer_Wagner());}int main(){ int t;sf("%d",&t); rep(cas,t){ pf("Case #%d: ",cas+1); init(); solve(); } return 0;}
全局最小割(n^3)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。