- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1网络流问题入门
多年来,考察网络流建模和算法的题目越来越多地出现在信息学竞赛中,网络流也已经被确定为信息学培训的重点章节。
网络流问题里的构图是最考验做题人的思维的。题海不可取,总结是必须的。
网络流的学习要在学习代码模板的基础上,深刻理解网络流模型的建立。
1.1网络及网络流
什么是网络?网络其实就是有向带权图。为什么要叫网络,是因为权值是容量,容量意味着可以在单位时间内经过的上限,但是可以比上限小。
有向图=点集+有向边集
一个实例:运输网络
图1.1
网络定义:
一个有向图 G=(V,E); V代表点的集合,E代表边的集合。
有两个特别的点:源点s、汇点t;
图中每条边(u,v)∈E,有一个非负值的容量C(u,v)
记为 G=(V,E,C)
网络三要素:点、边、容量
可行流定义:
是网络G上的一个“流”,即每条边上有个“流量”P(u,v),要满足下面两个条件:
流的容量限制---弧: 对任意弧(u,v)---有向边
流的平衡---点:
除源点和汇点,对任意中间点有:流入u的“流量”与流出u的“流量”相等。即:
有
网络的流量:源点的净流出“流量” 或 汇点的净流入“流量”。即:
注意,我们这里说的流量是一种速率,而不是指总量。联系上面所说的实例,下面是一个流量为1的可行流:
图1.2
标准图示法:
图1.3
1.2、最大流问题
寻找网络G上可能的最大流量(和一个有最大流量的可行流方案),即为网络G上的最大流问题。
我们再来看看图1.1的运输网络例子,我们可能通过改进图1.3得到下面这样的可行流:
图2.1
求解过程中的困惑:
[问题2.1]流量还可能增加吗?
[问题2.2]如果能增加,怎样改进?
1.3、最大流算法的核心---增广路径
退流的概念---后向弧
仔细分析图2.1,我们发现,流量是可以增加的:
图3.1
把一个流量弧(B,C)和(C,T)上的流退回到B点,改道从B-D-E-T走,就可以增加流量了,如下图:
图3.2
图3.1不能“直接寻找增大流的路径”,是因为当初有些弧上的流选择不“恰当”,要“退流”。
一种直观的想法就是:调整或重新搜索“当初的选择”---难!
能不能保留以前的工作,而在这之上改进呢?经过专家们研究发现,加入退流思想---后向弧,就能再次“直接寻找增大流的路径”。
增广路径(可改进路径)的定义
若P是网络中连结源点s和汇点t的一条路,我们定义路的方向是从s到t,则路上的弧有两种:
前向弧---弧的方向与路的方向一致。前向弧的全体记为P+;
后向弧---弧的方向与路的方向相反。后向弧的全体记为P-;
设F是一个可行流,P 是从s到t的一条路,若P满足下列条件:
在P+的所有前向弧(u,v)上,0≦f(u,v) C(u,v);
在P-的所有后向弧(u,v)上,0f(u,v) ≦C(u,v);
则称P是关于可行流F的一条可增广路径。
图3.3
本图中:S-A-C-B-D-E-T 为一增广路径。其中(C,B)为后向弧,其它为前向弧。
在增广路径上的改进算法:
求路径可改进量;
修改增广路径上的流量;
1.4、附加网络1---残留网络
由于要考虑前向弧、后向弧,分析、描述时不简洁,在图2.1上直观看也不容易看出增广路径。
因此我们把已经有的流量从容量中分离出来表示,引入一个与原问题等价的附加网络1:残留网络。
图4.1
其中,前向弧(黑色)上的容量为“剩余容量”=C(u,v)-f(u,v);后向弧(红色双线)上的容量为“可退流量”=f(v,u)。
改造后的网如下:
图4.2
在这张图上,我们找增广路径显的非常直观了!
结合增广路径,我们有如下定理:
最大流定理
如果残留网络上找不到增广路径,则当前流为最大流;反之,如果当前流不为最大流,则一定有增广路径。
证明涉及最小割概念,具体自己百度。
至此,[问题2.1]和[问题2.2]在这个最大流定理中同时获得解决。
求最大流的基本思想:
基于这种思想的算法,关键之处在于怎样找增广路径。常用方法有:
深度搜索dfs :Ford-Fulkerson 算法,也是入门算法。
宽度搜索bfs
优先搜索pfs---即类似Dijkstra算法的标号法。
1.5.最大流的代码实现
下面我们来学习一下dfs 求最大流的代码实现:
【P1318】ditch
在农夫约翰的农场上,每逢下雨,B
文档评论(0)