网络流算法专题.ppt
《网络流算法专题.ppt》由会员分享,可在线阅读,更多相关《网络流算法专题.ppt(52页珍藏版)》请在三一办公上搜索。
1、图论算法-最大流问题,长沙市雅礼中学朱 全 民,运输网络,现在想将一些物资从S运抵T,必须经过一些中转站。连接中转站的是公路,每条公路都有最大运载量。每条弧代表一条公路,弧上的数表示该公路的最大运载量。最多能将多少货物从S运抵T?,基本概念,这是一个典型的网络流模型。为了解答此题,我们先了解网络流的有关定义和概念。若有向图G=(V,E)满足下列条件:有且仅有一个顶点S,它的入度为零,即d-(S)=0,这个顶点S便称为源点,或称为发点。有且仅有一个顶点T,它的出度为零,即d+(T)=0,这个顶点T便称为汇点,或称为收点。每一条弧都有非负数,叫做该边的容量。边(vi,vj)的容量用cij表示。则称
2、之为网络流图,记为G=(V,E,C),可行流,可行流对于网络流图G,每一条弧(i,j)都给定一个非负数fij,这一组数满足下列三条件时称为这网络的可行流,用f表示它。1.每一条弧(i,j)有fijCij2.流量平衡除源点S和汇点T以外的所有的点vi,恒有:j(fij)=k(fjk)该等式说明中间点vi的流量守恒,输入与输出量相等。3.对于源点S和汇点T有,i(fSi)=j(fjT)=V(f),可增广路,给定一个可行流f=fij。若fij=Cij,称为饱和弧;否则称为非饱和弧。若fij=0,称为零流弧;否则称为非零流弧。定义一条道路P,起点是S、终点是T。把P上所有与P方向一致的弧定义为正向弧,
3、正向弧的全体记为P+;把P上所有与P方向相悖的弧定义为反向弧,反向弧的全体记为P-。譬如在图中,P=(S,V1,V2,V3,V4,T),那么P+=,P-=给定一个可行流f,P是从S到T的一条道路,如果满足:fij是非饱和流,并且 P+,fij是非零流,并且 P-那么就称P是f的一条可增广路。之所以称作“可增广”,是因为可改进路上弧的流量通过一定的规则修改,可以令整个流量放大。,剩余图(残余网络),剩余图G=(V,E)流量网络G=(V,E)中,对于任意一条边(a,b),若flow(a,b)0则(a,b)E,可以沿着a-b方向增广,剩余图中,从源点到汇点的每一条路径都对应一条增广路,剩余图中,每条
4、边都可以沿其方向增广,剩余图的权值代表能沿边增广的大小,G=(V,E,C)是已知的网络流图,设U是V的一个子集,W=VU,满足S U,TW。即U、W把V分成两个不相交的集合,且源点和汇点分属不同的集合。对于弧尾在U,弧头在W的弧所构成的集合称之为割切,用(U,W)表示。把割切(U,W)中所有弧的容量之和叫做此割切的容量,记为C(U,W),即:,割切,割切示例,上例中,令U=S,V1,则W=V2,V3,V4,T,那么,C(U,W)=+=8+4+4+1=17,流量算法的基本理论,定理1:对于已知的网络流图,设任意一可行流为f,任意一割切为(U,W),必有:V(f)C(U,W)。定理2:可行流f是最
5、大流的充分必要条件是:f中不存在可改进路。定理3:整流定理。如果网络中所有的弧的容量是整数,则存在整数值的最大流。定理4:最大流最小割定理。最大流等于最小割,即max V(f)=min C(U,W)。,最大流算法,第1步,令x=(xij)是任意整数可行流,可能是零流,给s一个永久标号(-,)。第2步(找增广路),如果所有标号都已经被检查,转到第4步。找到一个标号但未检查的点i,并做如下检查,对每一个弧(i,j),如果xij0,且j未标号,则给j一个标号(-i,(j),其中,(j)=minxji,(i)第3步(增广),由点t开始,使用指示标号构造一个增广路,指示标号的正负则表示通过增加还是减少弧
6、流量来增加还是减少弧流量来增大流量,抹去s点以外的所有标号,转第二步继续找增广轨。第4步(构造最小割),这时现行流是最大的,若把所有标号的集合记为S,所有未标号点的集合记为T,便得到最小割(S,T)。,实例,复杂度分析,设图中弧数为m,每找一条增广轨最多需要进行2m次弧的检查。如果所有弧的容量为整数,则最多需要v(其中v为最大流)次增广,因此总的计算量为O(mv)。,利用找增广路的其他流量算法,增广路的思想在于每次从源点搜索出一条前往汇点的增广路,并改变路上的边权,直到无法再进行增广:一般增广路方法:在剩余图中,每次任意找一条增广路径增广。O(nmU)容量缩放增广路方法:在剩余图中,每次任意找
7、一条最大可增广容量和的增广路径增广。O(nm*logU)最短增广路方法(MPLA):在剩余图中,每次任意找一条含结点数最少的增广路径增广。O(nm2)连续最短增广路方法(DINIC):在剩余图中,每次BFS找增广路径增广路径时,记录每个点的距离标号。在距离标号最短路图上,不断dfs找增广路,即一次标号,多次增广。O(n2m),DINIC算法演示:,用预流推进办法求网络流,预流推进算法给每一个顶点一个标号h(v),表示该点到t的最短路(在残量网络中)。第一步hights()过程,就是BFS出初始最短路,计算出每一个顶点的h(v)。预流推进算法的特征是运用了预流来加快运算。预流说明图中的节点(除s
8、,t),仅需要满足流入量=流出量。其中流入量流出量的结点,我们称之为活动节点。我们的算法就是不断地将活动结点,变为非活动结点,使得预流成为可行流。,预流推进算法流程,算法过程prepare(),即首先将与s相连的边设为满流,并将这时产生的活动结点加入队列Q。这是算法的开始。以后便重复以下过程直到Q为空:(1).选出Q的一个活动顶点u。并依次判断残量网络G中每条边(u,v),若h(u)=h(v)+1,则顺着这里条边推流,直到Q变成非活动结点(不存在多余流量)。(Push推流过程)(2).如果u还是活动结点。则需要对u进行重新标号:h(u)=minh(v)+1,其中边(u,v)存在于G 中。然后再
9、将u加入队列。(relable过程)可以证明,通过以上算法得到的结果就是最大流。,预流推进算法示例,顶点u的通过量g(u):剩余图中,找入边权和与出边权和的较小值增广时,每次找一个通过量最小的点v,从点v向源点“推”大小为g(v)的流量向汇点“拉”大小为g(v)的流量尽量使剩余图中的边饱和,用预流推进方法的一些网络流算法,预流推进的算法核心思想是以边为单元进行推流操作:一般的预流推进算法:在剩余图中,维护一个预流,不断对活跃点执行push操作,或者relable操作来重新调整这个预流,直到不能操作。O(nm2)先进先出预流推进算法:在剩余图中,以先进先出队列维护活跃点。O(n3)最高标号预流推
10、进算法:在剩余图中,每次检查最高标号的活跃点,需要用到优先队列。O(n2m1/2),费用流,流最重要的应用是尽可能多的分流物资,这也就是我们已经研究过的最大流问题。然而实际生活中,最大配置方案肯定不止一种,一旦有了选择的余地,费用的因素就自然参与到决策中来。右图是一个最简单的例子:弧上标的两个数字第一个是容量,第二个是费用。这里的费用是单位流量的花费,譬如fs1=4,所需花费为3*4=12。容易看出,此图的最大流(流量是8)为:fs1=f1t=5,fs2=f2t=3。所以它的费用是:3*5+4*5+7*3+2*3=62。,费用流定义,设有带费用的网络流图G=(V,E,C,W),每条弧对应两个非
11、负整数Cij、Wij,表示该弧的容量和费用。若流f满足:流量V(f)最大。满足a的前提下,流的费用Cost(f)=E(fij*Wij)最小。就称f是网络流图G的最小费用最大流。最小费用可改进路设P是流f的可改进路,定义P+Wij-P-Wij 为P的费用(为什么如此定义?)如果P是关于f的可改进路中费用最小的,就称P是f的最小费用可改进路。,费用流算法,求最小费用最大流的基本思想是贪心法。即:对于流f,每次选择最小费用可改进路进行改进,直到不存在可改进路为止。这样的得到的最大流必然是费用最小的。算法可描述为:第1步.令f为零流。第2步.若无最小费用可改进路,转第5步;否则找到最小费用可改进路,设
12、为P。第3步.根据P求delta(改进量)。第4步.放大f。转第2步。第5步.算法结束。此时的f即最小费用最大流。,如何求最小费用可改进路,设带费用的网络流图G=(V,E,C,W),它的一个可行流是f。我们构造带权有向图B=(V,E),其中:V=V。若E,fijE,权为Wij。若E,fij0,那么E,权为-Wij。显然,B中从S到T的每一条道路都对应关于f的一条可改进路;反之,关于f的每条可改进路也能对应B中从S到T的一条路径。即两者存在一一映射的逻辑关系。故若B中不存在从S到T的路径,则f必然没有可改进路;不然,B中从S到T的最短路径即为f的最小费用可改进路。现在的问题变成:给定带权有向图B
13、=(V,E),求从S到T的一条最短路径。,迭代法求最短路经,考虑到图中存在权值为负数的弧,不能采用Dijkstra算法;Floyd算法的效率又不尽如人意所以,这里采用一种折衷的算法:迭代法(bellman算法)。设Shorti表示从S到i顶点的最短路径长度;从S到顶点i的最短路径中,顶点i的前趋记为Lasti。那么迭代算法描述如下:(为了便于描述,令n=|V|,S的编号为0,T的编号为n+1)step 1.令Shorti+(1in+1),Short0 0。step 2.遍历每一条弧。若Shorti+,同时Lastj i。重复做step 2直到不存在任何任何弧满足此条件为止。step 3.算法结
14、束。若Shortn+1=+,则不存在从S到T的路径;否则可以根据Last记录的有关信息得到最短路径。一次迭代算法的时间复杂度为O(kn2),其中k是一个不大于n的变量。在费用流的求解过程中,k大部分情况下都远小于n。,思维发散与探索,可改进路费用:“递增!递增?”设f从零流到最大流共被改进了k次,每i次选择的可改进路的费用为pi,那么会不会有p1p2p3pk呢?迭代法:“小心死循环!嘿嘿”迭代法会出现死循环吗?也就是说,构造的带权有向图B中会存在负回路吗?费用:“你在乎我是负数吗?”容量:“我管的可不仅是弧。”网络流图中的“容量”都是对弧而言的,但若是给每个顶点也加上一个容量限制:即通过此顶点
15、的流量的上限;任务仍然是求从S到T的最小费用最大流。你能解决吗?,有上下界的最大流,上面讨论的网络流都只对每条弧都限定了上界(其实其下界可以看成0),现在给每条弧加上一个下界限制Aij(即必须满足Aijfij)。弧上数字对第一个是上界,第二个是下界。若是撇开下界不看,此图的最大流如图所示,流量是6;但若是加入了下界的限制,它的最大流量就只有5了。,怎样找可行流,一种自然的想法是去掉下界,将其转化为只含上界的网络流图。这种美好的愿望是可以实现的。具体方法如下:设原网络流图为G=(V,E,C,A),构造不含下界的网络流图G=(V,E,C):V=VS,T对每个顶点x,令h-(x)=E AiX,若h-
16、(x)0,就添加一条弧,其上界为h-(x)。对每个顶点x,令h+(x)=E AXi,若h+(x)0,就添加一条弧,其上界为h+(x)。对于任何E,都有E,其上界Cij=Cij Aij。新增E,其上界CTS=+。在G中以S为源点、T为汇点求得最大流f。若f中从S发出的任意一条弧是非饱和弧,则原网络流图没有可行流。否则可得原图的一个可行流f=f+A,即所有的fij=f ij+Aij。然后再求可改进路(反向弧必须满足fijAij,而非fij0),不断放大f,直到求出最大流。,另外一种构图方法,C(u,v)=C(u,v)-B(u,v)设如果M(i)非负,那么设一附加源S0,则可以令C(S0,i)=M(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 算法 专题

链接地址:https://www.31ppt.com/p-5301284.html