POJ 1273 Drainage Ditches 题解与分析<网络流DINIC>
来源:互联网 发布:linux黑客大曝光 编辑:程序博客网 时间:2024/06/01 09:38
Drainage Ditches 草地排水
描述
在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水。这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间。因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪)。作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量。
农夫约翰知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小溪的一张网)。需要注意的是,有些时候从一处到另一处不只有一条排水沟。
根据这些信息,计算从水潭排水到小溪的最大流量。对于给出的每条排水沟,雨水只能沿着一个方向流动,注意可能会出现雨水环形流动的情形。
格式
PROGRAM NAME:ditch
INPUT FORMAT:
(file ditch.in)
第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 FORMAT:
(file ditch.out)
输出一个整数,即排水的最大流量。
SAMPLE INPUT
5 41 2 401 4 202 4 202 3 303 4 10
SAMPLE OUTPUT
50
【分析】:用网络流的DINIC算法解。首先构图,读入x,y,z,将x到y的容量加上z,并记录x可以到y,y可以到x。接下来,构建层次图<用队列实现,先将1加入,每次取队头元素x,然后枚举与它有边连的点y,根据层次图性质,每次判断x到y是否有容量并且d[x]+1是否小于d[y],如果是就更新d[y]为d[x]+1,并将y加进队列,若队列中元素有M个,就说明建图完毕>,然后进行DINIC网络流算法,递归求增广路,只是更新的时候要判断是否初始点的d值+1等于到达点<此处就是DINIC算法对普通增广路算法的优化>
<提示:POJ1273与USACO 4.2.1相同,只是POJ1273是多组数据>
【代码】:
/* Problem: 1273 User: csyzcyj Memory: 528K Time: 16MS Language: C++ Result: Accepted */#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include<iostream>#include<vector>#include<stack>#include<queue>using namespace std;#define MAX 201#define IMAX 2147483647struct LAKE{vector<long long> link;};LAKE a[MAX];long long N,M,map[MAX][MAX],ans=0,use;//map记录容量 long long d[MAX];//d记录层次 bool build()//构建层次图 { long long q[MAX],tot=0; for(int i=0;i<=M+1;i++) d[i]=IMAX; q[++tot]=1; d[1]=0; for(int i=1;i<=tot;i++) { int now=q[i]; for(int j=0;j<a[now].link.size();j++) { int next=a[now].link[j]; if(map[now][next] && d[now]+1<d[next]) { d[next]=d[now]+1; q[++tot]=next; if(tot==M) return true; } } } return false;}long long DINIC(long long now,long long flow)//flow为当前容量最小值 { long long new1; if(flow==0) return 0;//没有可用容量 if(now==M) return flow;//如果到达了汇点 for(int i=0;i<a[now].link.size();i++) { long long next=a[now].link[i]; if(d[now]+1==d[next] && (new1=DINIC(next,min(flow,map[now][next])))) { map[now][next]-=new1; map[next][now]+=new1;//其反向弧加上正向弧减去的流量 return new1; } } return 0;}int main(){ while(scanf("%lld%lld",&N,&M)!=EOF) { memset(map,0,sizeof(map)); memset(a,0,sizeof(a)); memset(d,0,sizeof(d)); ans=0; for(int i=1;i<=N;i++) { long long A,B,C; scanf("%lld%lld%lld",&A,&B,&C); map[A][B]+=C; a[A].link.push_back(B); a[B].link.push_back(A); } while(build()) { while(use=DINIC(1,IMAX)) { ans+=use; } } printf("%lld\n",ans); } //system("pause"); return 0;}
转载注明出处:http://blog.csdn.net/u011400953
- POJ 1273 Drainage Ditches 题解与分析<网络流DINIC>
- USACO Training 4.2.1 Drainage Ditches 草地排水 题解与分析<网络流DINIC算法>
- poj 1273--Drainage Ditches [网络流dinic算法]
- POJ 1273 Drainage Ditches (网络流 EK && Dinic)
- poj 1273Drainage Ditches(简单网络流(用dinic))
- POJ 1273~Drainage Ditches(网络最大流ek,dinic)
- poj 1273 Drainage Ditches 经典网络流 Dinic算法
- POJ 1273 Drainage Ditches(网络流【Dinic算法】)
- poj 1273 Drainage Ditches 网络流 Edmond Karp || Dinic
- 【POJ 1273 Drainage Ditches】& 网络流 & Dinic 算法
- poj 1273 Drainage Ditches--最大流--Dinic
- poj 1273 Drainage Ditches (最大流Dinic)
- POJ 1273 Drainage Ditches 最大流 dinic
- POJ-1273 Drainage Ditches 最大流Dinic
- poj 1273 Drainage Ditches【最大流 dinic】
- POJ 1273 Drainage Ditches -dinic
- POJ 1273 Drainage Ditches—网络流,最大流模板题,Dinic算法
- POJ--1273--Drainage Ditches【Dinic模板】【isap模板】网络最大流
- Tempter of the Bone_hdu_1010(深搜).java
- 小Q系列故事——大笨钟
- expandlistview 分组+浮动条
- 图像常用名词解释
- HDU-1010-Tempter of the Bone
- POJ 1273 Drainage Ditches 题解与分析<网络流DINIC>
- windows文件命名规范
- Cocos2d-x Touch事件处理机制
- 最远曼哈顿距离小结 poj 2926 Requirements&hdu 4666 Hyperspace
- Unicode字符集下CString与char *转换 (解决中文乱码等)(转)
- hdu(2553)(回朔搜索)
- Android编译系统详解(二)
- Oracle中把一个查询结果插入到一张表中
- C# 下载远程http文件到本地