【9018:1555】草地排水

1555: Drainage Ditches(草地排水)

时间限制: 1 Sec  内存限制: 128 MB
提交: 122  解决: 80
[提交][状态][讨论版]

题目描述

    在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水。这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间。因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪)。作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量。 

    农夫约翰知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小溪的一张网)。需要注意的是,有些时候从一处到另一处不只有一条排水沟。

    根据这些信息,计算从水潭排水到小溪的最大流量。对于给出的每条排水沟,雨水只能沿着一个方向流动,注意可能会出现雨水环形流动的情形。。

输入

 

1: 两个用空格分开的整数N (0 <= N <= 200) M (2 <= M <= 200)N是农夫约翰已经挖好的排水沟的数量,M是排水沟交叉点的数量。交点1是水潭,交点M是小溪。
第二行到第N+1: 每行有三个整数,Si, Ei, CiSi Ei (1 <= Si, Ei <= M) 指明排水沟两端的交点,雨水从Si 流向EiCi (0 <= Ci <= 10,000,000)是这条排水沟的最大容量。

输出

    输出一个整数,即排水的最大流量。

样例输入

5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10

样例输出

50

题解:网络流模板题。
代码如下:
 1 #include<cstdio>  
 2 #include<iostream> 
 3 #include<cstring>
 4 #include<queue>
 5 #define Max 210
 6 #define INF 0x7fffffff    
 7 using namespace std; 
 8 struct edge{int to,cap,next,rev;}e[Max*2]; 
 9 int s,t,n,m,cnt=0,head[Max],lev[Max],q[Max]; 
10 void ins(int u,int v,int w){ 
11     e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;e[cnt].cap=w;e[cnt].rev=cnt+1;  
12     e[++cnt].to=u;e[cnt].next=head[v];head[v]=cnt;e[cnt].cap=0;e[cnt].rev=cnt-1;
13 } 
14 bool bfs(){ 
15     memset(lev,-1,sizeof(lev)); 
16     int hd=0,tl=1;
17     lev[s]=0; q[hd]=s; 
18     while(hd<tl){ 
19         int v=q[hd++];
20         for(int i=head[v];i;i=e[i].next)
21             if(e[i].cap>0&&lev[e[i].to]<0){ 
22                 lev[e[i].to]=lev[v]+1;
23                 q[tl++]=e[i].to;
24             }
25     }
26     if(lev[t]==-1) return false;
27     return true;
28 } 
29 int dfs(int u,int f){ 
30     int used=0; 
31     if(u==t) return f; 
32     for(int i=head[u];i;i=e[i].next) { 
33         if (e[i].cap>0&&lev[u]<lev[e[i].to]){ 
34             int w=dfs(e[i].to,min(f-used,e[i].cap)); 
35             if (w>0){ 
36                 e[i].cap-=w; e[e[i].rev].cap+=w; used+=w; 
37                 if(used==f) break; 
38             } 
39         } 
40     }
41     if(!used) lev[u]=-1;
42     return used; 
43 } 
44 int dinic(){ 
45     int flow=0;
46     while(bfs()) flow+=dfs(s,INF);
47     return flow;
48 }  
49 int main () 
50 { 
51     scanf("%d%d",&n,&m); s=1; t=m; 
52     for (int i=1;i<=n;i++){ 
53         int x,y,z;
54         scanf("%d%d%d",&x,&y,&z); 
55         ins(x,y,z); 
56     } 
57     printf("%d",dinic());
58     return 0;
59 }
 
posted @ 2017-07-28 09:18  Beginner_llg  阅读(183)  评论(0编辑  收藏  举报