首页 > 代码库 > HDU 3002
HDU 3002
无向图最小割。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 const int MAXN=150; 7 const int inf=10000000; 8 int vis[MAXN],combine[MAXN],wan[MAXN]; 9 int map[MAXN][MAXN];10 int n,m,t;11 int mincut,S,T;12 13 void seacut(){14 int Max; int p;15 S=T=-1;16 memset(vis,0,sizeof(vis));17 memset(wan,0,sizeof(wan));18 for(int i=0;i<n;i++){19 Max=-inf;20 for(int j=0;j<n;j++){21 if(!combine[j]&&!vis[j]&&wan[j]>Max){22 Max=wan[j]; p=j;23 }24 }25 // cout<<p<<endl;26 if(p==T) return;27 S=T;T=p;28 vis[T]=1;29 for(int j=0;j<n;j++){30 if(!combine[j]&&!vis[j]){31 wan[j]+=map[T][j];32 }33 }34 }35 }36 37 void storewanger(){38 mincut=inf;39 memset(combine,0,sizeof(combine));40 for(int i=0;i<n-1;i++){41 seacut();42 if(wan[T]<mincut) mincut=wan[T];43 if(mincut==0) return;44 combine[T]=1;45 for(int j=0;j<n;j++){46 if(!combine[j]){47 map[S][j]+=map[T][j];48 map[j][S]+=map[j][T];49 }50 }51 }52 }53 54 int main(){55 int u,v,w;56 while(scanf("%d%d",&n,&m)!=EOF){57 memset(map,0,sizeof(map));58 for(int i=0;i<m;i++){59 scanf("%d%d%d",&u,&v,&w);60 map[u][v]+=w;61 map[v][u]+=w;62 // cout<<"YES"<<endl;63 }64 // cout<<"YES"<<endl;65 storewanger();66 printf("%d\n",mincut);67 }68 return 0;69 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。