博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷——1993 草地排水
阅读量:6690 次
发布时间:2019-06-25

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

1993 草地排水

 

USACO

 时间限制: 2 s
 空间限制: 256000 KB
 题目等级 : 钻石 Diamond
 查看运行结果
 
 
题目描述 
Description

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

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

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

输入描述 
Input Description

第1行: 两个用空格分开的整数N (0 <= N <= 200) 和 M (2 <= M <= 200)。N是农夫John已经挖好的排水沟的数量,M是排水沟交叉点的数量。交点1是水潭,交点M是小溪。

第二行到第N+1行: 每行有三个整数,Si, Ei, 和 Ci。Si 和 Ei (1 <= Si, Ei <= M) 指明排水沟两端的交点,雨水从Si 流向Ei。Ci (0 <= Ci <= 10,000,000)是这条排水沟的最大容量。

输出描述 
Output Description

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

样例输入 
Sample Input
5 41 2 401 4 202 4 202 3 303 4 10
样例输出 
Sample Output

50

 

 

网络流最大流模板

#include
#include
#include
#include
#include
#define N 1010#define inf 100000000using namespace std;queue
q;int n,m,x,y,z,tot=1,ans;int src,decc,tail,now,t;int to[N],que[N],cap[N],cnt[N],lev[N],nextt[N],head[N],front[N];int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f;}inline int add(int x,int y,int z){ ++tot;to[tot]=y;cap[tot]=z;nextt[tot]=head[x];head[x]=tot; ++tot;to[tot]=x;cap[tot]=0;nextt[tot]=head[y];head[y]=tot;}inline bool bfs(){ while(!q.empty()) q.pop(); for(int i=src;i<=decc;i++) { cnt[i]=head[i]; lev[i]=-1; } q.push(src); lev[src]=0; while(!q.empty()) { int x=q.front(); q.pop(); for(int i=head[x];i;i=nextt[i]) { int t=to[i]; if(cap[i]>0&&lev[t]==-1) { lev[t]=lev[x]+1; if(t==decc) return true; q.push(t); } } } return false;}int dinic(int now,int flow){ if(now==decc) return flow; int rest=0,delta; for(int &i=cnt[now];i;i=nextt[i]) { int t=to[i]; if(cap[i]>0&&lev[t]==lev[now]+1) { delta=dinic(t,min(cap[i],flow-rest)); if(delta) { cap[i]-=delta; cap[i^1]+=delta; rest+=delta; if(rest==flow) break; } } } if(rest!=flow) lev[now]=-1; return rest; }int main(){ n=read(),m=read(); for(int i=1;i<=n;i++) { x=read(),y=read(),z=read(); add(x,y,z); } src=1,decc=m; while(bfs()) ans+=dinic(src,inf); printf("%d",ans); return 0;}

 

转载于:https://www.cnblogs.com/z360/p/8060056.html

你可能感兴趣的文章
linux系统下zookeeper设置开机启动失败,求指教
查看>>
sed的用法
查看>>
工作流调度
查看>>
Nginx TCP代理和负载均衡
查看>>
理解原型对象
查看>>
Apache虚拟目录
查看>>
容器是实现操作系统虚拟化的一种途径
查看>>
电脑内部声音怎么录制 Mac在线录制音频
查看>>
个人对生活意义的观点
查看>>
Editplus的配置说明:Web服务器设置和用户工具栏设置
查看>>
手机拍照翻译如何把中文翻译为英文
查看>>
文件查找和压缩
查看>>
JAVA RPC:从上手到爱不释手
查看>>
HTTP1.0、1.1、2.0的区别
查看>>
CFA报名付款方式及支付失败解决方法
查看>>
详细介绍Java中的堆、栈和常量池
查看>>
Go环境变量
查看>>
用Doxygen优化Inkpad的模块关系
查看>>
Delphi 数据类型列表
查看>>
eclipse 创建maven Web项目
查看>>