信息学奥赛 网络流算法介绍与分析精.ppt
《信息学奥赛 网络流算法介绍与分析精.ppt》由会员分享,可在线阅读,更多相关《信息学奥赛 网络流算法介绍与分析精.ppt(89页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、信息学奥赛 网络流算法介绍与分析第1 页,本讲稿共89 页一些符号和定义 V 表示整个图中的所有结点的集合.E 表示整个图中所有边的集合.G=(V,E),表示整个图.s表示网络的源点,t 表示网络的汇点.对于每条边(u,v),有一个容量c(u,v)(c(u,v)=0)如果c(u,v)=0,则表示(u,v)不存在在网络中。如果原网络中不存在边(u,v),则令c(u,v)=0 对于每条边(u,v),有一个流量f(u,v).第2 页,本讲稿共89 页v1tsv2(2,2)(4,4)(2,4)(0,3)(2,2)一个简单的例子.网络可以被想象成一些输水的管道.括号内右边的数字表示管道的容量,左边的数字
2、表示这条管道的当前流量.第3 页,本讲稿共89 页网络流的三个性质1、容量限制:fu,v=cu,v2、反对称性:fu,v=-fv,u3、流量平衡:对于不是源点也不是汇点的任意结点,流入该结点的流量和等于流出该结点的流量和。结合反对称性,流量平衡也可以写成:只要满足这三个性质,就是一个合法的网络流.第4 页,本讲稿共89 页最大流问题 定义一个网络的流量(记为|f|)=最大流问题,就是求在满足网络流性质的情况下,|f|的最大值。第5 页,本讲稿共89 页残量网络为了更方便算法的实现,一般根据原网络定义一个残量网络。其中r(u,v)为残量网络的容量。r(u,v)=c(u,v)f(u,v)通俗地讲:
3、就是对于某一条边(也称弧),还能再有多少流量经过。Gf残量网络,Ef表示残量网络的边集.第6 页,本讲稿共89 页例1v1tsv2(2,2)(4,4)(2,4)(0,3)(2,2)v1tsv2232422原网络(a,b)表示(流量f,容量c)残量网络(如果网络中一条边的容量为0,则认为这条边不在残量网络中。r(s,v1)=0,所以就不画出来了。另外举个例子:r(v1,s)=c(v1,s)f(v1,s)=0(-f(s,v1)=f(s,v1)=4.图1图2第7 页,本讲稿共89 页例1 从残量网络中可以清楚地看到:因为存在边(s,v2)=3,我们知道从S 到v2 还可以再增加2单位的流量;因为存在
4、边(v1,t)=2,我们知道从v1到t 还可以再增加2单位的流量。v1tsv2232422第8 页,本讲稿共89 页后向弧其中像(v1,s)这样的边称为后向弧,它表示从v1 到s还可以增加4 单位的流量。但是从v1 到s 不是和原网络中的弧的方向相反吗?显然“从v1 到s 还可以增加4 单位流量”这条信息毫无意义。那么,有必要建立这些后向弧吗?v1tsv2232422第9 页,本讲稿共89 页为什么要建立后向弧 显然,例1 中的画出来的不是一个最大流。但是,如果我们把s-v2-v1-t 这条路径经过的弧的流量都增加2,就得到了该网络的最大流。注意到这条路径经过了一条后向弧:(v2,v1)。如果
5、不设立后向弧,算法就不能发现这条路径。从本质上说,后向弧为算法纠正自己所犯的错误提供了可能性,它允许算法取消先前的错误的行为(让2 单位的流从v1 流到v2)第10 页,本讲稿共89 页为什么要建立后向弧 当然,可以把上面说的情况当成特殊情况来处理。但使用后向弧可以使编程简单许多.注意,后向弧只是概念上的,在程序中后向弧与前向弧并无区别.第11 页,本讲稿共89 页增广路 增广路定义:在残量网络中的一条从s 通往t 的路径,其中任意一条弧(u,v),都有ru,v0。绿色的即为一条增广路。v1tsv2232422第12 页,本讲稿共89 页增广路算法 增广路算法:每次用BFS找一条最短的增广路径
6、,然后沿着这条路径修改流量值(实际修改的是残量网络的边权)。当没有增广路时,算法停止,此时的流就是最大流。下面证明增广路算法的正确性.第13 页,本讲稿共89 页将f,c,r 的定义域扩展为点集(在以后的叙述中,大写字母X,Y,S,T 一般均表示点集)点集间的流量和:f(X,Y)=即:X中的任意一点与Y 中的任意一点组成的所有边上的流量之和.(边的方向为从X 中的结点到Y 中的结点)c,r 等函数都有类似的定义.(点集间的容量和、点集间的残量网络容量和)第14 页,本讲稿共89 页结论11.f(X,X)=0(由流量反对称性)2.f(X,Y)=-f(Y,X)(有流量反对称性)3.f(X Y,Z)
7、=f(X,Z)+f(Y,Z)(显然)4.f(X,Y Z)=f(X,Y)+f(X,Z)(显然)第15 页,本讲稿共89 页最大流最小割定理 网络流中这三个条件等价(在同一个时刻):1、f 是最大流 2、残量网络中找不到增广路径 3、|f|=c(S,T)第16 页,本讲稿共89 页1、f 是最大流2、残量网络中找不到增广路径3、|f|=c(S,T)1-2 证明:显然.假设有增广路径,由于增广路径的容量至少为1,所以用这个增广路径增广过后的流的流量肯定要比f 的大,这与f 是最大流矛盾.第17 页,本讲稿共89 页割的定义 一个割(S,T)由两个点集S,T 组成.S+T=V s 属于 S.t 属于
8、T.提出割的定义,是为后面的证明作铺垫.第18 页,本讲稿共89 页结论2(点集总流量为零)不包含s 和t 的点集,于它相关联的边上的流量之和为0.证明:f(X,V)=(由流量平衡)=0 第19 页,本讲稿共89 页结论3任意割的流量等于整个网络的流量.证明:f(S,T)=f(S,V)f(S,S)(由辅助定理1)=f(S,V)(由辅助定理1)=f(S,V)+f(S s,V)(同上)=f(s,V)(由辅助定理2)=|f|(由|f|的定义)第20 页,本讲稿共89 页结论4 网络的流量小于等于任意一个割的容量.(注意这个与辅助定理3 的区别.这里是容量)即|f|=c(S,T)证明:|f|=f(S,
9、T)=(由定义)=(由流量限制)=c(S,T)第21 页,本讲稿共89 页2-3 证明:定义S=s v|在残量网络中s 到v 有一条路径;T=V-S.则(S,T)是一个割.|f|=f(S,T)(由辅助定理3)而且,r(S,T)=0.假设不为0,则在残量网络中,两个集合间必定有边相连,设在S 的一端为v,在T 的一端为u.那么,s 就可以通过v 到达u,那么根据S 的定义,u 就应该在S 中.矛盾.所以,|f|=f(S,T)=c(S,T)r(S,T)=c(S,T)1、f 是最大流2、残量网络中找不到增广路径3、|f|=c(S,T)第22 页,本讲稿共89 页 3-1 证明:|f|0),那么|f|
10、+d 肯定不能满足上面的条件.1、f 是最大流2、残量网络中找不到增广路径3、|f|=c(S,T)第23 页,本讲稿共89 页增广路算法的正确性 如果 最大流最小割定理不能从2 推出3,那么存在这样一种可能性:尽管找不到增广路径了,但由于前面的错误决策,导致f 还没有到达最大流,却不能通过修改当前流来得到最大流.但由于最大流最小割定理的三个条件互相等价(1-2,2-3,3-1),一个流是最大流当且仅当它没有增广路径.第24 页,本讲稿共89 页增广路算法的效率 设n=|V|,m=|E|每次增广都是一次BFS,效率为O(m)所以,总共的时间复杂度为O(m*f*)其中f*为增广次数.怎么求f*?第
11、25 页,本讲稿共89 页f*对于随机数据,f*的值与n 比较接近.当m不太大也不太小时,f*的值较大.(我出随机数据的方法是:固定地为源点和汇点连上一些边,然后随机生成中间的边.中间的边保证边的两个端点的编号相差不太大.这与不少题目转成网络流后形成的图相似)第26 页,本讲稿共89 页f*的理论上界 考虑每一次增广,至少有一条边的r(u,v)值等于增广路径的流量.称这些边为临界边.增广之后,这条临界边就在残量网络中消失.假设一条临界边对应一次增广(事实上很难达到这样),令每条边成为临界边的次数为k(u,v),则有f*=O(m*k).k 的上界?第27 页,本讲稿共89 页k 的上界 如果要让
12、一条曾经的临界边(u,v)再次成为临界边,则必须有一条增广路径包含边(v,u).因为每次增广之后临界边就消失,要让他再次成为临界边至少要让他再次在残量网络中出现,即(v,u)要被增广.结合上面的结论可以证明,当算法取的增广路总是残量网络中的最短路,任意一条边成为临界边的次数至多为n/2-1.因此,增广路算法的效率为O(f*m)=O(km2)=O(nm2).(这只是个上界,一般情况是达不到的)备注中为增广路算法我的代码实现。数组u 是残量网络的容量。第28 页,本讲稿共89 页预流推进算法下面将介绍一个更直观且时间效率更优的算法.第29 页,本讲稿共89 页一个直观的想法 如果给你一个网络流,让
13、你手算出它的最大流,你会怎么算?一般人都会尝试着从源点出发,让每条边的流量尽可能得大,然后一点点往汇点推,直到遇到一条比较窄的弧,原先的流量过不去了,这才减少原先的流量.第30 页,本讲稿共89 页v1tsv2(0,2)(4,4)(0,4)(3,3)(0,2)例2.一个直观的想法大致的思路:从源点出发,逐步推进。称当前状态下不满足流量平衡的结点为“溢出的结点”.(对于结点u,f(V,u)0)令e(u)=f(V,u),称为u 点的赢余,直观地描述,就是“流入的比流出的多多少”。e(v1)=4,e(v2)=3。不断将溢出的结点中的赢余往后继点推进,直到赢余都聚集在t.第31 页,本讲稿共89 页v
14、1tsv2(2,2)(4,4)(0,4)(3,3)(2,2)如果多推了一些流量,我们可以再把它推回来.(如e(v2)=3,但这3个单位的赢余已经没地方去了,只能推回来.)(沿着后向弧)这副图是原网络而不是残量网络,因此没把后项弧画出来)例2.一个直观的想法第32 页,本讲稿共89 页v1tsv2(2,2)(4,4)(0,4)(3,3)(2,2)程序没有全局观?!此时e(v2)=3.正确的回推法是往(v2,s)推1,往(v2,v1)推2,然后使得这2个单位的赢余可以从(v1,t)推到t 上。但程序没有全局观,它万一往(v2,s)推了3个单位怎么办?我们总不能尝试所有的可能性吧,那样就变成搜索了.
15、第33 页,本讲稿共89 页引导机制 把流推错可能导致产生的流不是最大流.我们需要有一个能引导流的推进方向的机制,当它发现我们先前的推进是错误的时候,能沿着正确的后向弧回推回来.由于建立了后向弧,正推与回推在程序中并无却别,都是在推残量网络中的一条边.第34 页,本讲稿共89 页高度标号的引导作用高度标号就是这样的一个引导机制.我们规定,如果一个结点溢出了,那么他的多余的流量只能流向高度标号比自己低的结点.(“水往低处流”)当然,高度标号不可能事先知道往哪些方向推才是正确的.它将按情况动态改变自己的值,从而正确地引导流向.第35 页,本讲稿共89 页重标号操作 当一个结点有赢余(溢出了),周围
16、却没有高度比它低的结点时候,我们就用重标号操作使它的标号上升到比周围最低的结点略高一点,使他的赢余能流出去.赢余千万不能困在某个结点里.对于任意一个非源非汇的结点,有赢余就意味着它不满足流量平衡,也就意味着整个网络流不是一个真正合法的网络流。第36 页,本讲稿共89 页重标号操作 对于例2 的这种情况,v2 中过多的赢余最终会沿着(v2,v1)、(v2,s)流回去(虽然他们一开始流错了方向,但后来又被回推,等于说是被改正了)。只有当非源非汇的结点中的赢余全部流到汇点或流回源点后,这个流才重新合法。第37 页,本讲稿共89 页高度函数 高度函数h(v)返回一个v 的高度标号。高度函数有三个基本条
17、件:h(s)=|V|h(t)=0 对于Ef(残量网络)中的每一条边(u,v),(r(u,v)0)h(u)0,那就表示从u 到v 还可以增加流量,那h(u)就应该比h(v)高才对.的确,我们后面还将规定,只有在h(u)h(v)的时候才能应用推进操作(将一个结点的盈余推进到另一个结点的操作).而高度函数为了满足其合法性,还要满足上述的这三个条件.后面我们将利用这三个条件证明预流推进算法的正确性。第38 页,本讲稿共89 页高度函数的条件的实质h(u)=h(v)+1.这个条件实质上是要求高度不能下降的太快,即水只能在高度相差不多的地方缓缓流过,不能像瀑布一样从很高的地方流到很低的地方。(否则就有流错
18、的危险)这和A*算法中的启发函数必须“相容”的条件类似。h 函数的缓慢下降,保证了算法的正确性。后面我们将看到这个条件的作用.第39 页,本讲稿共89 页两个关键操作 推进操作(将一个结点的盈余推到另一个结点)重标号操作(更改一个结点的高度值,使其的盈余能朝着更多的地方流动)第40 页,本讲稿共89 页推进操作 使用对象:一条边(u,v)使用条件:e(u)0,r(u,v)0,h(u)=h(v)+1(u 溢出,(u,v)在残量网络中,两者的高度差为1)推进量为e(u)与r(u,v)的最小值。推进时同时更改相关的r 与e 的值。第41 页,本讲稿共89 页推进操作 伪代码 Procedure Pu
19、sh(u,v)l X min e(u),r(u,v)l Dec(r(u,v),x)Inc(r(v,u),x)l Dec(e(u),x)Inc(e(v),x)第42 页,本讲稿共89 页重标号操作 使用对象:一个结点u 使用条件:结点u 溢出;残量网络中周围所有的点的高度都不比它低。Relabel(u)l u(u)=min h(v)|(u,v)是残量网络总的边+1 使用了重标号操作后,至少存在一个(u,v)满足h(u)=h(v)+1.第43 页,本讲稿共89 页预流初始化(Init-Preflow)一开始的时候,我们要让和源点s 相关连的边都尽可能的充满。但由于s 没有溢出,不符合推进操作的使用
20、条件,我们需要另写一段初始化的代码。还得做的一件事是初始化高度函数.h(s)=n h(v)=0(vs)对于所有与s 相关联的点v,l Inc(e(v),c(s,v),Dec(e(s),c(s,v)l 将边(s,v)反向,变成(v,s)(在残量网络中)。初始化过后,e(s)变成负数。第44 页,本讲稿共89 页结论5 对于一个溢出的结点,两个关键操作(推进和重标号)能且只能应用一个。证明:对于一个溢出的结点u,和所有与他相关联的点v(u,v)在残量网络中存在),必然有h(u)=h(v)+1.(由高度函数的定义).根据v 分成两种情况:1).所有v 都有h(u)h(v)+1 2).至少存在一个v,
21、使得h(u)=h(v)+1.而1)2)互为否命题,不能同时成立或同时不成立.那么1)对应重标号,2)对应推进,两者必能应用一个且只能应用一个.第45 页,本讲稿共89 页一般的预流推进算法 由辅助定理5,得到了一个一般的预流推进算法.(好短)Init-Preflow While 存在一个溢出的结点l 选一个结点,应用相应的关键操作(推进或重标号).当不存在溢出结点时(s,t 不算),算法结束,得到一个可行流,并且还是最大流.第46 页,本讲稿共89 页预流推进算法的正确性 预流只是不满足流量平衡,网络流的前两条性质-容量限制和反对称性它还是满足的.当不存在溢出结点时,流量平衡也满足了.所以,当
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息学奥赛 网络流算法介绍与分析精 信息学 网络 算法 介绍 分析
限制150内