Drainage Ditches
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 70588   Accepted: 27436

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 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10

Sample Output

50

Source

[Submit]   [Go Back]   [Status]  
[Discuss]

解题思路:

是一道裸的一般增广路算法的题目,就是计算水塘最大的流量排到附近的小河中。

增广路中可能含有反向弧,最后流量改进的时候对于反向弧的处理,既可以按照残留网络中的对应的正向弧那样增加流量也可以直接把这条反向弧的流量减少相应的流量。

因为我用这两种解法都能AC,说明效果是一样的。

源代码:

<span style="font-size:18px;">
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std; #define MAXN 210 struct Matrix
{
int c,f;//容量,流量
};
Matrix Edge[MAXN][MAXN];//流及容量(邻接矩阵)
int M,N;//弧的条数,顶点个数
int s,t;//源点(1),汇点(n)
int residul[MAXN][MAXN];//残留网络
int qu[MAXN*MAXN],qs,qe;//队列、队列头、队列尾
int pre[MAXN];//pre[i]为增广路上顶点的访问标志
int vis[MAXN];//BFS算法中各个顶点的访问标志
int maxflow,min_augment;//最大流流量、每次增广时的可以改进的量
void find_augment_path()//BFS寻找增广路
{
int i,cu;//cu为队列头顶点
memset(vis,0,sizeof(vis));
qs=0;qu[qs]=s;//s入队列
pre[s]=s;vis[s]=1;qe=1;
memset(residul,0,sizeof(residul));memset(pre,0,sizeof(pre));
while(qs<qe&&pre[t]==0)
{
cu=qu[qs];
for(i=1;i<=N;i++)
{
if(vis[i]==0)
{
if(Edge[cu][i].c-Edge[cu][i].f>0)
{
residul[cu][i]=Edge[cu][i].c-Edge[cu][i].f;
pre[i]=cu;qu[qe++]=i;vis[i]=1;
}
else if(Edge[i][cu].f>0)
{
residul[cu][i]=Edge[i][cu].f;
pre[i]=cu;qu[qe++]=i;vis[i]=1;
}
}
}
qs++;
}
}
void augment_flow()//计算可改进量
{
int i=t,j;//t为汇点
if(pre[i]==0)
{
min_augment=0;return;
}
j=0x7fffffff;
while(i!=s)//计算增广路上可改进量的最小值
{
if(residul[pre[i]][i]<j) j=residul[pre[i]][i];
i=pre[i];
}
min_augment=j;
}
void update_flow()//调整流量
{
int i=t;//t为汇点
if(pre[i]==0)return;
while(i!=s)
{
if(Edge[pre[i]][i].c-Edge[pre[i]][i].f>0)
Edge[pre[i]][i].f+=min_augment;
else if(Edge[i][pre[i]].f>0) Edge[pre[i]][i].f+=min_augment;//或者写成Edge[i][pre[i]]-=min_augment;
i=pre[i];
}
}
void solve()
{
s=1;t=N;
maxflow=0;
while(1)
{
find_augment_path();//BFS寻找增广路
augment_flow();//计算可改进量
maxflow+=min_augment;
if(min_augment>0) update_flow();
else return;
}
}
int main()
{
int i;
int u,v,c;
while(scanf("%d %d",&M,&N)!=EOF)
{
memset(Edge,0,sizeof(Edge));
for(i=0;i<M;i++)
{
scanf("%d %d %d",&u,&v,&c);
Edge[u][v].c+=c;
}
solve();
printf("%d\n",maxflow);
}
return 0;
}
</span>

POJ-1273-Drainage Ditches 朴素增广路的更多相关文章

  1. poj 1273 Drainage Ditches(最大流)

    http://poj.org/problem?id=1273 Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Subm ...

  2. POJ 1273 - Drainage Ditches - [最大流模板题] - [EK算法模板][Dinic算法模板 - 邻接表型]

    题目链接:http://poj.org/problem?id=1273 Time Limit: 1000MS Memory Limit: 10000K Description Every time i ...

  3. POJ 1273 Drainage Ditches (网络最大流)

    http://poj.org/problem? id=1273 Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Sub ...

  4. POJ 1273 Drainage Ditches题解——S.B.S.

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 67823   Accepted: 2620 ...

  5. POJ 1273 Drainage Ditches

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 67387   Accepted: 2603 ...

  6. Poj 1273 Drainage Ditches(最大流 Edmonds-Karp )

    题目链接:poj1273 Drainage Ditches 呜呜,今天自学网络流,看了EK算法,学的晕晕的,留个简单模板题来作纪念... #include<cstdio> #include ...

  7. POJ 1273 Drainage Ditches(网络流dinic算法模板)

    POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...

  8. 网络流最经典的入门题 各种网络流算法都能AC。 poj 1273 Drainage Ditches

    Drainage Ditches 题目抽象:给你m条边u,v,c.   n个定点,源点1,汇点n.求最大流.  最好的入门题,各种算法都可以拿来练习 (1):  一般增广路算法  ford() #in ...

  9. POJ 1273 Drainage Ditches【最大流模版】

    题意:现在有m个池塘(从1到m开始编号,1为源点,m为汇点),及n条有向水渠,给出这n条水渠所连接的点和所能流过的最大流量,求从源点到汇点能流过的最大流量 Dinic #include<iost ...

随机推荐

  1. 正则和grep——再做正则就去死

    grep 文本过滤工具 基本正则表达式 grep 语法 基本正则表达式的元字符 次数匹配 位置锚定 分组 扩展正则表达式 基本正则表达式的元字符 次数匹配 位置锚定 分组 或者 grep的介绍 lin ...

  2. 【译】Java中的字符串字面量

    原文地址:https://javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html 作者:Corey McGlone 让我们由一个简 ...

  3. linux学习(九)set_uid、set_gid、stick_bit、软链接、硬链接

    一.set_uid set_uid其实是一种特殊权限,我们看一个文件: [root@iZ25lzba47vZ ~]# ls -l /usr/bin/passwd -rwsr-xr-x. root ro ...

  4. Problem B

    Problem Description A subsequence of a given sequence is the given sequence with some elements (poss ...

  5. poj 3340 Barbara Bennett's Wild Numbers(数位DP)

    Barbara Bennett's Wild Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3153   A ...

  6. Linux分区规划与xshell使用排错

    1.1 没有重要数据 /boot   200M    存放系统的引导信息 内核 swap   交换分区   防止内存用光了 临时的一个内存 如果你的内存小于8G swap是内存的1.5倍   如果你的 ...

  7. JS模块化-requireJS

    1. 为什么要使用require.js 刚开始的时候,网页需要用到很多不同的插件,都是依次加载,需要注意其中的加载顺序即依赖关系. <script src="1.js"> ...

  8. 远程调用服务框架-CXF(WebServic)

    介绍 远程调用web服务,不需要自己编写具体代码,只需要调用作者给出的接口即可. 我们可以调用互联网上查询天气信息Web服务,然后将它嵌入到我们的程序(C/S或B/S程序)当中来,当用户从我们的网点看 ...

  9. vue 使用axios 跨域请求数据的问题

    axios默认是没有jsonp 跨域请求的方法的.一般来说流行的做法是将跨域放在后台来解决,也就是后台开发人员添加跨域头信息. 例如java中的 header,response.setHeader(& ...

  10. 网页静态化技术Freemarker的详细介绍

    网页静态化技术Freemarker 一.Freemarker的基本介绍 1.1为什么要使用网页静态化技术 网页静态化解决方案在实际开发中运用比较多,例如新闻网站,门户网站中的新闻频道或者是文章类的频道 ...