最大流 标号法
网络最大流

容量为20 容量为
• 最小截集: • 容量最小截集的称为网络G的最小截集。 • 最大流-最小截集定理: • 在任一个网络D中,从vs到vt的最大流的 流量等于分离的最小截集的容量。
(二)、 求最大流的标号法
标号过程: 1. 给发点vs 标号(0,+∞)。 2. 取一个已标号的点vi,对于vi一切未标号的邻 接点vj 按下列规则处理: (1)如果边 (v j , vi ) ∈ E ,且 f j i > 0 ,那么给vj 标 号 (−vi , δ j ) ,其中: δ j = min( f j i , δ i ) (2)如果边 (vi , v j ) ∈ E ,且 f ij < cij,那么给vj 标号 ( +vi , δ δ j = min(ci j − f i j , δ i ) ,其中:j ) 3.重复步骤2,直到vt被标号或标号过程无法进 行下去,则标号结束。若vt被标号,则存在一条增广 链,转调整过程;若vt未被标号,而标号过程无法进 行下去,这时的可行流就是最大流。
2.去掉所有标号,回到第一步,对可行流 重新标号。
求下图所示网络中的最大流,弧旁数为
v2 (3 , 3) vs (5 , 1) (1 , 1) v1 (-v1, 1) ) v2 (3 , 3) (0,+∞) , ) vs (5 , 1) v1 (+ vs , 4) ) (2 , 2) (1 ,1) (1 , 1) (3 ,0) (2 ,1) v3 (-v2 ,1) ) (2 , 2) (4 ,3) (1 ,1) (3 ,0) (2 ,1) v3 (+v2,1) ) v4 (5 ,3) v4 (5 ,3) vt
f = f (v i , v j ) = { f i j }
求解网络最大流问题的标号算法

求解网络最大流问题的标号算法赵礼峰;白睿;宋常城【摘要】It provides a new way-labeling algorithm to solve network flow. Every vertex is labeled and vertex has the same number in arc as grades. Choose the way that has a grade. After every way that has only a grade,choose the way that has bigger arc capacity and shorter path. The algorithm is easy to understand and avoids the shortcomings of several labeling and adjusting process through improving Ford-Fulkerson labeling algorithm. The algorithm improves efficiency to solve the maximum network flow. The algorithm gives specific steps and manifests the practices of the algorithm through example.%给出了一种新的求解网络流问题的标号算法,对每个顶点进行标号,顶点有几个人弧,即有几个标号,每次在选择路径时先选取只有一个标号的路径,当所有单标号的路径走完时,再按照弧容量较大且最短的路径选择增广链.通过对Ford-Fulkerson标号算法进行改进,使得该算法容易理解,且又避免了Ford-Fulkerson标号算法在求解网络最大流问题时需经过多次的调整与标号,从而大大提高了求解最大流执行的效率.该算法通过实例给出了具体算法步骤并且表明了算法的实用性.【期刊名称】《计算机技术与发展》【年(卷),期】2011(021)012【总页数】3页(P113-115)【关键词】最大流;Ford-Fulkerson标号算法;增广链;标号【作者】赵礼峰;白睿;宋常城【作者单位】南京邮电大学理学院,江苏南京210003;南京邮电大学理学院,江苏南京210003;南京邮电大学理学院,江苏南京210003【正文语种】中文【中图分类】TP301.60 引言在现实生活中,存在着大量的“流”的问题,计算机技术和网络技术的迅速发展使得网络最大流问题在通信、物理、电力等科学领域都得到了广泛的应用。
最大流

割是分离A和F的弧的集合,若切断一个割的所有弧对应的桥梁, 就可切断A和F之间的线路。切断最小割包含的弧对应的桥 梁,是切断A和F之间线路的桥梁数最少的方法。
由最大流最小割定理,分离A和F的最小割容量等于由A到F的 最大流量 A(0,+) 1,1 2 ,1 1 1, 1,0 2,1 D 2,0 B E C 1,1 2,0 (B,1) (A,1) 1 2, 2,1 F 由上图得知:已标号点为A,B,C,而D,E,F不能获得标 号,从而知道该最大流对应的最小割为{(A,E),(C, D),(C,F)}因此,切断AE,CD,CF三座桥梁,即可阻 止对方部队过河。
3 3 2 v4
割 集 容量 6 7 7 5 11 8 最小割 { (v1, v2) , ( v1, v3) } { (v1, v3) , ( v2, v5) } { (v1, v2 ) , ( v3, v2) , (v3,v4 ) } { (v2, v5) , ( v3, v4) } {(v1, v2) , ( v3, v2),(v4,v2) , (v4,v5)} { (v2 , v5 ) , ( v4 , v5 ) }
• 割中所有弧的容量之和称为该割的容量
C (V1 ,V2 )
( v i , v j )(V1 ,V2 )
c ij
所有割中容量最小的称为最小割
v2 2 v1 4 v3
V1 {v1} {v1,v2} {v1,v3} { v1,v2,v3 } {v1,v3 ,v4 } {v1 ,v2 ,v3, v4} V2 { v2 ,v3 ,v4 , v5 } { v3 ,v4 ,v5 } {v2 ,v4, v5} { v4, v5 } { v2 ,v5 } { v5 }
1,1
运筹学第7章 最大流问题(精简)

vs [v , 1]
5
(2, 0)
v5 v1
[vs, 3] (2, 2)
v3
(4, 0)
[v3, 1]
[-v4, 1]
如图已经得到增广链,然后进行调整。
调整后的可行流如下图: v2
(4, 4) (1, 0) [-, ∞] vs (5, 2) (1, 0) (3, 1) (2, 1)
(4, 4)
v4
网络上的流,是指定义在边集E上的 函数f={f(vi,vj)},并称f(vi,vj)为边 (vi,vj)上的流量,简记为fij。
v2 3,1 vs 5,2 1,0 v1 1,0 3,1 2,1 2,2 v3 4,1 v4 5,2 vt
标示方式:每条边上标示两个数字,第一个是容量,第二 是流量
可行流、可行流的流量、最大流。
标号过程: (1)给vs标号(∆,+∞),vs成为已标号未检查的点,其 余都是未标号点。 (2)取一个已标号未检查的点vi,对一切未标号点vj: 若有非饱和边(vi,vj),则vj标号(vi,l(vj)),其中l(vj)= min[l(vi),cij – fij],vj成为已标号未检查的点;若有非 零边(vj,vi),则vj标号(-vi,l(vj)),其中l(vj)=min[l(vi), fji], vj成为已标号未检查的点。vi成为已标号已检查的点。 (3)重复步骤(2),直到vt成为标号点或所有标号点 都检查过。若vt成为标号点,表明得到一条vs到vt的 增广链,转入调整过程;若所有标号点都检查过, 表明这时的可行流就是最大流,算法结束。 调整过程:在增广链上,前向边流量增加l(vt),后 向边流量减少l(vt)。
v2 3 vs 5 v1 2 v3 1 1 3 2 4 v4 5 vt
第五节 最大流问题

2、网络流
如果在网络N=(V,A,C,x,y)中,定义在弧集上的一函 数f满足: (1)对任一条弧(vi ,vj),cij≥fij
(2)对中间顶点vk
f
i
j
ik
f kj
j
对于源x和汇y, f x j fi x fi y f y j V f
i i j
则称f为N的一个网络流(可行流)。称 Vf为f流 量。
3、最大流 网络中从x到y流值最大的可行流,称为从x到y最大 流. 一个流 f ={ fij },当fij = cij,则称流 f对边(vi ,vj) 是饱和的,否则称f 对边(vi ,vj)不饱和。 4、增广链 设P是从源x到汇y的一条链,定义P的方向是从x到 y的。称P上与P的方向一致的弧为前向弧,记 P+ . 称P上与P的方向相反的弧为反向弧,记P- . P是网络N=(V,A,C,x,y)中从源x到汇y的一条链,f为 N的一个网络流,若对任一a∈ P+ ,f(a)<c(a),对 任一a ∈ P- ,f(a)>0,则称P为N中关于流f的一条 增广链。
f(a) a p f f(a) a P f(a) 其它弧
(2)去掉所有标号,回到第一步,对可行流重新标号。
例1:用最大流算法求下图所示网络的最大流。
4.3 x v2 4.2 4.0 v3 7.2 y
1.1 6.0 8.2 2.2 9.3 2.2 v4 v5
1.1 6.0 8.2 2.2 9.3 2.2 v4 v5
x
V2(v4 ,-,2) 4.1 4.2 8.2
v3 (v2 ,+,2) 7.3 x
4.4
v2 4.1 4.2
最大流算法小结

网络最大流的算法网络最大流的算法分类:一、Ford-Fulkerson增广路方法1、Ford-Fulkerson标号算法(最简单的实现)分别记录这一轮扩展过程中的每个点的前驱与到该节点的增广最大流量,从源点开始扩展,每次选择一个点(必须保证已经扩展到这个点),检查与它连接的所有边,并进行扩展,直到扩展到t。
2、最大容量增广路算法每次找一条容量最大的增广路来增广,找的过程类似Dijkstra,实现起来相当简单。
3、Edmonds-Karp,最短路增广算法的BFS实现每次找一条最短的增广路,BFS是一个可以很方便的实现思想。
4、距离标号算法最短路增广的O(n)寻找实现,使用距离函数d:d[t]=0;d<=d[j]+1若存在(i,j)∈E;只有路径上满足d=d[i+1]+1的增广路才为满足要求的,一开始我们初始化使标号恰好满足要求,之后不断更改标号使其可以使增广继续。
5、Dinic,分层思想对网络分层(按照距t的距离),保留相邻层之间的边,然后运用一次类似于距离标号的方法(其实质是DFS)进行增广。
二、预留与推进算法1、一般性算法随便找个点,要么将他的盈余推出去,要么对他进行重标记,直至无活跃点为止。
2、重标记与前移算法维护一个队列,对一个点不断进行推进与重标记操作,直至其盈余为0,若过程中他没有被重标记过,则可出列,否则加入队头,继续等待检查。
3、最高标号预留与推进算法记录d值,然后优先处理d值较高的,直至没有盈余。
网络最大流的算法实现一、Edmonds-Karp(EK)算法就是用广度优先搜索来实现Ford-Fulkerson方法中对增广路径的计算,时间复杂度为O(VE2),Shortest Augmenting Path (SAP) 是每次寻找最短增广路的一类算法,Edmonds - Karp 算法以及后来著名的Dinic 算法都属于此。
SAP 类算法可统一描述如下:Shortest Augmenting Path{ x <-- 0while 在残量网络Gx 中存在增广路s ~> t do{ 找一条最短的增广路径Pdelta <-- min{rij:(i,j) 属于P}沿P 增广delta 大小的流量更新残量网络Gx}return x}在无权边的有向图中寻找最短路,最简单的方法就是广度优先搜索(BFS),E-K 算法就直接来源于此。
最大流算法-最高标号预流推进(HLPP)

最⼤流算法-最⾼标号预流推进(HLPP)昨天我们学习了ISAP算法,它属于增⼴路算法的⼤类。
今天学习的算法是预流推进算法中很⾼效的⼀类——最⾼标号预流推进(HLPP)。
预流推进预流推进是⼀种很直观的⽹络流算法。
如果给到⼀个⽹络流让你⼿算,⼀般的想法是从源点开始流,遇到不够的就减掉,⼀直往前推到汇点。
这就是预流推进算法的基本思想。
每个节点是⼀个储⽔池,最开始源点有⽆限多的⽔。
⽤⼀个队列维护需要处理的点。
最开始把源点加进去,对于每⼀个当前点,我们把将这个点⽔池中有的流量沿着边(⽔管)推到相邻的点,然后把相邻的点加⼊队列中。
算法思想如此,但其中有⼀个问题:这样做有可能出现两个点⼀个推过来⼀个推回去,结果就死循环了。
这时候我们给每个点引⼊⼀个⾼度来解决这个问题。
源点的⾼度为\(n\),汇点的⾼度为\(0\),其他点初始⾼度为0,我们规定,⽔往下⼀层流,即我们只推\(h[x]=h[v]+1\)的边\((x,v)\)。
如果⼀个点还有⽔,但是却⽆法推出去,即周围的点都⽐他⾼,那么我们就抬⾼这个点,因为\(h\)值是连续的,所以每次出现这种情况我们就给它加⼀。
如果这个点根本就流不出去,那么最后它会被抬⾼到\(n+1\)的⾼度,回流给源点。
最⾼标号Tarjan和Goldberg在1986年提出了最⾼标号预留推进算法,即把普通队列换成优先队列,每次取出⾼度最⾼的那个来推进。
Cheriyan和Maheshwari在1988年证明了这样做的复杂度为\ (O(n^2\sqrt m)\)。
优化喜闻乐见的gap优化,但和ISAP的形式不太⼀样。
如果我们发现在给⼀个点抬⾼1的⾼度的时候,这个点原来的⾼度已经没有点了,那么我们直接把⼤于这个⾼度的点全部设为⾼度\(n+1\),让他们回流到源点去,因为根据算法,他们⽆法再有机会把⽔推到汇点(为什么不能有下⾯⼀个点抬上来形成路径呢?因为⼀个点的⾼度是所有相邻点⾼度最⼩值加⼀,所以不可能出现这种情况)。
最大流问题标号法例题详解

最大流问题标号法例题详解最大流问题标号法例题详解本文以一道标号法求解最大流问题的例题胶加以详细讲解,帮助读者了解其原理及运算步骤。
题目如下:给定一个网络结构如下:s (源点) 0----1----2----3----4---- t (汇点)a 25 10 12 15 20其中 s 是源点,t是汇点,aij(i,j=0,1,2,3,4)是每条弧的容量,求整个网络的最大流量。
解:1、设置标号:在最大流问题中,为了求解最大流,最常用的方法是标号法。
首先,要设置各结点标号,因为本题中有5个结点,s源点的标号为0,t汇点标号为4,其他结点即1,2,3依次标号,标号的设定不仅便于求解,而且可以在初始化的时候使用。
2、初始化标号:初始化标号即将各结点初始化为两个空集合{},即各结点的访问和未访问标号都是空集合,即无访问的结点标号为{},访问过的结点标号也为{}。
3、依据标号法,从源点(s=0)计算,得出每条弧的剩余容量Cij,具体推导如下:源点0 1 2 3 41 0 25 10 12 152 0 0 10 7 103 0 0 0 8 104 0 0 0 0 20其中:Cij=aij-fij (i,j=0,1,2,3,4)其中,aij 为每条弧的容量,fij 为每条弧的流量,在初始情况下,fij=0,故Cij=aij。
4、找增广路径:从源点s开始,用深度优先搜索法查找从s到t的增广路径,具体步骤如下:设置一个数组P[i]用以记录路径,P[i]表示从s到i节点所经过的上一个结点,先从源点s开始,P[0]=-1,然后查找s出发可以到达的结点,若Cij>0,则有路可达,将P[j]=i(j为s出发可达的结点),接着查找j出发可以到达的结点(该结点未被访问过)若Cjk>0,则有路可达,把P[k]=j,以此类推,直到找到P[t]=-1,即从s到t 的一条增广路径找到,这条增广路径的路径上的容量称为Cmin,它是该增广路径上各结点之间的容量最小值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0
2 8
30
8 18
京
0
沈
W ( f* ) =10+6+12+30+12+10+5 = 85
多个发点多个收点的情形
对于多发点多收点的容量网络的最大流问题可 以通过添加两个新点vs与vt扩充为新的单发点与 单收点的容量网络的方式解决。
x1 x2 ... xm y1 y2 ... yn
vs
+∞
+∞
vt
x1 x2 x3 xn y1 y2 y3 ym
…
…
如果记X={x1, x2, …, xn},Y={y1, y2, …, ym},则该二 部图可记为G=(X, Y, E),而上述的工作匹配问题就 是:在图G中找一个边集E的子集,使得这个子集 中任意两条边没有公共端点,最好的方案就是要使 得该子集中的边数达到最大。 定义:对于二部图G=(X, Y, E),M是边集E的一个 子集,如果M中的任意两条边没有公共端点,则称 M是图G的一个匹配(也称对集)。 M中任意一条边的端点v称为(关于M的)饱和点, G中的其他顶点称为非饱和点。 若不存在另一匹配M1使得| M1 | > | M |,则称M为最 大匹配。
下面用实例说明具体的操作方法:例
v2 (3,3) (4,3) v4 (5,3) (3,0) (2,1) v1 (2,2) v3
vs
(5,1)
(1,1)
(1,1)
vt
在图中给出的可行 流的基础上,求vs 到vt的最大流。
(3,3) v2 (4,3) (1,0) v4 (5,3) vt
(-v1,1)
v2
割集 割集(V1, V2)中所有起点在V1,终点在V2的边的容量 的和称为割集容量。例如下图中所示割集的容量为5
v2 4 1 v4
3
vs 5 v1 1 3
5
vt 2
2
v3
在容量网络的所有割集中,割集容量最小的割集称为 最小割集(最小割)。
对于可行流f={fij},我们把网络中使fij=cij的 弧称为饱和弧,使fij<cij的弧称为非饱和弧;把 使fij=0的弧称为零流弧,使fij>0的弧称为非零 流弧。 若μ 是联结发点 v2 4,1 v4 vs和收点vt的一条链, 3,1 5,2 1,0 我们规定链的方向是 vs 3,1 1,0 vt 从vs到vt,则链上的 2,1 5,2 v1 2,2 v3 弧被分成两类:前向 弧、后向弧。 设f是一个可行流,μ是从vs到vt的一条链,若μ 满足前向弧都是非饱和弧,后向弧都是都是非零 流弧,则称μ是(可行流f的)一条增广链。
注:有向边也称为弧。
对教材P259定义21的解释
v1 vs v3 vt v2
v4 边集(vs,v1),(v1,v3),(v2,v3),(v3,vt), (v4,vt)是G的割集。其顶点分别属于两个互补不相交 的点集。去掉这五条边,则图不连通,去掉这五条边中 的任意1-4条,图仍然连通。
割集的容量(简称割量) 最小
vs
x1 x2 x3 y1 y2 y3
vt
…
…
xn
ym
这样最大匹配问题就化为对上图的网络的最大流问题。
例
有5位求职者和5项工作岗位,这5位求职者各自能胜 任的工作如图所示,问如何安排才能实现最大就业?
x1 y1 y2 y3 y4 y5 x2 x3 x4 x5
vs
vs
首先将原图扩充成一个容量网络,其中每边的容量均 为1。然后用标号法来求最大流。
[x2,1] y1 [x1,1] y2 [x1,1] y
3
1 [y2,1] v
s
x4 [vs,1] x5 [vs,1]
[x5,1] 1 y4
y [x4,1]5
1
x1 1
1 1
1 1 1
y1 1
y2 y3 y4 y5 1 1 1
vs
1
1
x2 1 x3 x4 x5
1
vs
最大匹配为(省略了最后一步的标号过程):
vs
x2 [vs,1] x3 [vs,1] x4 [vs,1] x5 [vs,1]
x1
1
1
y1
y2 1
vs
[-,+∞]
1
x2 [vs,1] x3 [v ,1] x4 s x5 [vs,1] 1
y3 [x3,1] 1 y4 [x3,1] y5
vs
[y5,1]
vs
[-,+∞]
[-y1, 1] 1 x1 1 [-y , 1] x2 4 1 1 x3 1 1
成都 成都 重庆
重庆 10
武汉 5 5
上海 15
西安 8 6
郑州
沈阳
昆明 12 15
广州 10
北京 30 25
武汉
上海 西安 郑州 沈阳 昆明 广州
10
15 8 6 14 8 8 2 6 8 18 10 10 8
用图来描述就是
6
重
西
6
郑
10 8
成
5 12
25 15
昆
8
8
15 10 14
8
30 15 5
v3
(4, 0)
[-v4, 2]
如图已经得到增广链,然后进行调整。
调整后的可行流如下图:
[vs, 1]
v2
(4, 3)
[v2, 1]
v4
(5, 5) (4, 3)
vs [v , 1]
5
(1, 0)
[-, ∞] vs (5, 2) (1, 0)
(3, 2) (2, 0)
v5 v1
[vs, 3] (2, 2)
下面的二部图表示了一个匹配问题
x1 x2 y1 y2 y3 y4 y5
x3 x4
它有如下两个最大匹配:
x1 x2 x3 x4 y1 y2 y3 y4 y5 x1 x2 x3 x4 y1 y2 y3 y4 y5
最大匹配问题可以化为最大流问题求解。化的方式 类似于多发点多收点问题,具体做法是: 在原二部图中添加两个点vs和vt,其中vs有以它为 起点,以X中各点为终点的有向边;连结vt有以它 为终点,Y中各点为起点的有向边。并且在这样的 图中各边上的容量取为1。若一条边上的流量为1, 则表示一个相应的分配。如下图
具有实际背景的例子
• 国庆大假期间旅游非常火爆,机票早已订购 一空。成都一家旅行社由于信誉好、服务好, 所策划的国庆首都游的行情看好,要求参加 的游客众多,游客甚至不惜多花机票钱辗转 取道它地也愿参加此游。旅行社只好紧急电 传他在全国各地的办事处要求协助解决此问 题。很快,各办事处将其已订购机票的情况 传到了总社。根据此资料,总社要作出计划, 最多能将多少游客从成都送往北京以及如何 取道转机。下面是各办事处已订购机票的详 细情况表:
最大流问题
基本概念
v2 3 vs 5 v1 2 v3 1 1 3 2 4 v4
5
vt
给定一个有向图G=(V,E),其中仅有一个点的入次 为零称为发点(源),记为vs,仅有一个点的出次为 零称为收点(汇),记为vt,其余点称为中间点。 对于G中的每一个弧(vi,vj),相应地给一个数cij (cij≥0),称为弧(vi,vj)的容量。我们把这样的D称 为网络(或容量网络),记为G=(V,E,C)。
x1 x2 x3 x4 x5 y1 y2 y3 y4 y5
(v2,1)
v4 (5,3) (1,1) (3,0) v3
(-,+∞)
vs
(3,3)
(4,3)
(v3,1) (-,+∞)
vt vs (1,0)
(1,1)
(3,0) (2,2) v3
(5,1)
(2,1)
(5,2)
(vs,4)
v1
(2,2)
(-v2,1)
(vs,3)
v1
(2,2)
得增广链,标号结束, 进入调整过程
可行流是指满足如下条件的流: (1)容量限制条件:对G中每条边(vi,vj), 有
0 f ij c ij
(2)平衡条件: 对中间点,有:
j
f ij
k
f ki
(即中间点vi的物资输入量等于输出量) 对收点vt与发点vs,有:
i
f si
j
f jt W
(即vs发出的物资总量等于vt接收的物资总量),W是 网络的总流量。
给定容量网络G=(V,A,E),若点集V被剖分 为两个非空集合V1和V2,使 vs∈V1 ,vt∈V2, 则把弧集(V1,V2)称为(分离vs和vt的)割集。
v2
3 vs 1 1 3 4 v4 5 vt
5
v1 2 v3
2
显然,若把某一割集的弧从网络中去掉, 则从vs到vt便不存在路。所以,直观上说,割 集是从vs到vt的必经之路。
标号过程: (1)给vs标号(-,+∞),vs成为已标号未检查的点,其 余都是未标号点。 (2)取一个已标号未检查的点vi,对一切未标号点vj: 若有非饱和弧(vi,vj),则vj标号(vi,l(vj)),其中l(vj)= min[l(vi),cij – fij],vj成为已标号未检查的点;若有非 零弧(vj,vi),则vj标号(-vi,l(vj)),其中l(vj)=min[l(vi), fji], vj成为已标号未检查的点。vi成为已标号已检查的点。 (3)重复步骤(2),直到vt成为标号点或所有标号点 都检查过。若vt成为标号点,表明得到一条vs到vt的 增广链,转入调整过程;若所有标号点都检查过, 表明这时的可行流就是最大流,算法结束。 调整过程:在增广链上,前向弧流量增加l(vt),后 向弧流量减少l(vt)。