博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1273:Drainage Ditches(最大流入门 EK,dinic算法)
阅读量:6903 次
发布时间:2019-06-27

本文共 3650 字,大约阅读时间需要 12 分钟。

Description

Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a set of drainage ditches so that Bessie's clover patch is never covered in water. Instead, the water is drained to a nearby stream. Being an ace engineer, Farmer John has also installed regulators at the beginning of each ditch, so he can control at what rate water flows into that ditch. 
Farmer John knows not only how many gallons of water each ditch can transport per minute but also the exact layout of the ditches, which feed out of the pond and into each other and stream in a potentially complex network. 
Given all this information, determine the maximum rate at which water can be transported out of the pond and into the stream. For any given ditch, water flows in only one direction, but there might be a way that water can flow in a circle. 

Input

The input includes several cases. For each case, the first line contains two space-separated integers, N (0 <= N <= 200) and M (2 <= M <= 200). N is the number of ditches that Farmer John has dug. M is the number of intersections points for those ditches. Intersection 1 is the pond. Intersection point M is the stream. Each of the following N lines contains three integers, Si, Ei, and Ci. Si and Ei (1 <= Si, Ei <= M) designate the intersections between which this ditch flows. Water will flow through this ditch from Si to Ei. Ci (0 <= Ci <= 10,000,000) is the maximum rate at which water will flow through the ditch.

Output

For each case, output a single integer, the maximum rate at which water may emptied from the pond.

Sample Input

5 41 2 401 4 202 4 202 3 303 4 10

Sample Output

50 EK算法:
#include 
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3fusing namespace std;int map[201][201],n,m,v[201],pre[201];int bfs(int s,int t){ queue
q; q.push(s); memset(pre,-1,sizeof(pre)); memset(v,0,sizeof(v)); pre[s]=s; v[s]=1; while(!q.empty()) { int w=q.front(); q.pop(); for(int i=1; i<=n; i++) { if(map[w][i]&&!v[i]) { pre[i]=w; v[i]=1; if(i==t) { return 1; } q.push(i); } } } return 0;}void EK(int s,int t){ int ans=0,minx; while(bfs(s,t)==1) { minx=inf; for(int i=t; i!=s; i=pre[i]) { minx=min(minx,map[pre[i]][i]); } for(int i=t; i!=s; i=pre[i]) { map[pre[i]][i]-=minx; map[i][pre[i]]+=minx; } ans+=minx; } printf("%d\n",ans); return ;}int main(){ int xx,yy,zz; while(scanf("%d%d",&m,&n)!=EOF) { memset(map,0,sizeof(map)); while(m--) { scanf("%d%d%d",&xx,&yy,&zz); map[xx][yy]+=zz; } EK(1,n); } return 0;}

dinic算法:

#include 
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3fusing namespace std;int map[201][201],dis[201];int m,n;int bfs(int s,int t){ memset(dis,-1,sizeof(dis)); dis[s]=0; queue
q; q.push(s); while(!q.empty()) { int y=q.front(); q.pop(); for(int i=1; i<=n; i++) { if(dis[i]==-1&&map[y][i]) { dis[i]=dis[y]+1; q.push(i); } } } if(dis[t]>0) return 1; return 0;}int dinic(int s,int maxt){ if(s==n) return maxt; int a,sum=maxt; for(int i=1; i<=n&∑ i++) { if(dis[i]==dis[s]+1&&map[s][i]>0) { a=dinic(i,min(sum,map[s][i])); map[s][i]-=a; map[i][s]+=a; sum-=a; } } return maxt-sum;}int main(){ int x,y,z,ans; while(scanf("%d%d",&m,&n)!=EOF) { ans=0; memset(map,0,sizeof(map)); while(m--) { scanf("%d%d%d",&x,&y,&z); map[x][y]+=z; } while(bfs(1,n)==1) { ans+=dinic(1,inf); } printf("%d\n",ans); } return 0;}

 

 

转载地址:http://popdl.baihongyu.com/

你可能感兴趣的文章
NFS
查看>>
静电引发的悲剧
查看>>
在Angularjs中使用directive自定义指令实现attribute的继承
查看>>
新手学习编程的最佳方式是什么
查看>>
程序员零起步(四)——实习
查看>>
day6
查看>>
Aix下如何运行Java程序
查看>>
js简单总结
查看>>
隐马尔可夫HMM中viterbi算法
查看>>
ospf 协议配置方法及实例
查看>>
Python:解决中文字符串问题
查看>>
python模块之xml
查看>>
那些在学习iOS开发前就应该知道的事
查看>>
python多线程--Condition(条件对象)
查看>>
c++汉诺塔相关知识总结1
查看>>
Gym 100169A 最短路
查看>>
android 中activity调用本地service中的方法。
查看>>
强制IE浏览器或WebBrowser控件使用指定版本显示网页(转发)
查看>>
OJDBC版本区别
查看>>
中国网建之SMS
查看>>