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. PHP设计模式三:原型设计模式

    一.什么是原型设计模式 原型设计模式使用一种克隆技术来复制实例化的对象,新对象是通过复制原型实例创建的.原型设计模式的目的是通过使用克隆以减少 实例化对象的开销. 在原型设计模式中,Client类是不 ...

  2. MUI点击事件获取当前对象,及当前对象的属性值

    //用惯了jquery,开始用mui还是有些不习惯 //直接贴代码吧 <nav class="mui-bar mui-bar-tab"> <a class=&qu ...

  3. easyui dialog 中嵌入html页面

    最近使用easyui比较多,这个插件确实很好用.在使用时也遇到了大大小小的问题,好在都一一解决了. 记录一下今天遇到的问题. 目的:用easyui的dialog嵌入一个html页面(html中仍有要执 ...

  4. node调试工具--node-inspector安装

    node-inspector安装: npm install --registry=http://r.cnpmjs.org -g cnpm cnpm install -g node-inspector ...

  5. Ubuntu16 远程连接MySQL

    1.进入MySQL配置目录允许其他IP可以链接 vi /etc/mysql/mysql.conf.d/mysqld.cnf 吧下面这行注释掉 #bind-address = 127.0.0.1 2.远 ...

  6. Android-Async-Http 特性简单分析

    如下是官方文档描述此库的特点: All requests are made outside of your app’s main UI thread, but any callback logic w ...

  7. 微信公众平台快速开发框架 For Core 2.0 beta –JCSoft.WX.Core 5.2.0 beta发布

    写在前面 最近比较忙,都没有好好维护博客,今天拿个半成品来交代吧. 记不清上次关于微信公众号快速开发框架(简称JCWX)的更新是什么时候了,自从更新到支持.Net Framework 4.0以后基本上 ...

  8. 面向亿万级用户的QQ一般做什么?——兴趣部落的 Web 同构直出分享

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:李强,腾讯web开发工程师商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处.原文链接:http://wetest.qq.co ...

  9. 如何在ASP.NET Core Web API测试中使用Postman

    使用Postman进行手动测试 如果您是开发人员,测试人员或管理人员,则在构建和使用应用程序时,有时了解各种API方法可能是一个挑战. 使用带有.NET Core的Postman为您的Web API生 ...

  10. [转载] Java中常用的加密方法

    转载自http://www.iteye.com/topic/1122076/ 加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的 ...