码迷,mamicode.com
首页 > 其他好文 > 详细

[USACO4.2]Drainage Ditches

时间:2017-07-14 23:53:10      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:str   scanf   mem   tin   pop   set   ons   eof   ==   

练习网络流的好题目,这里给出的是Dinic

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=250;
 4 int n,m;
 5 struct Dinic{
 6     int G[N][N],dis[N];
 7     void build(){
 8         memset(G,0,sizeof G);
 9         for(int i=1;i<=m;++i){
10             int u,v,f;
11             scanf("%d%d%d",&u,&v,&f);
12             G[u][v]+=f;
13         }
14     }
15     bool BFS(){
16         queue<int> Q;
17         memset(dis,-1,sizeof dis);
18         dis[1]=0;
19         Q.push(1);
20         while(!Q.empty()){
21             int u=Q.front();Q.pop();
22             if(u==n)return 1;
23             for(int i=1;i<=n;++i){
24                 if(~dis[i]||G[u][i]<=0)continue;
25                 dis[i]=dis[u]+1;
26                 Q.push(i);
27             }
28         }
29         return 0;
30     }
31     int dfs(int u,int low){
32         int a=0;
33         if(u==n)return low;
34         for(int i=1;i<=n;++i)
35             if(G[u][i]>0&&dis[i]==dis[u]+1){
36                 a=dfs(i,min(low,G[u][i]));
37                 G[u][i]-=a;
38                 G[i][u]+=a;
39                 if(a)return a;
40             }
41         return 0;
42     }
43     int dinic(){
44         int ans=0,t;
45         while(BFS())
46             while(t=dfs(1,0x3f3f3f3f))ans+=t;
47         return ans;
48     }
49 }D;
50 int main(){
51     while(~scanf("%d%d",&m,&n)){
52         D.build();
53         printf("%d\n",D.dinic());
54     }
55     return 0;
56 }

 

[USACO4.2]Drainage Ditches

标签:str   scanf   mem   tin   pop   set   ons   eof   ==   

原文地址:http://www.cnblogs.com/ndqzhang1111/p/7173076.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!