最大流算法及其应用

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法基本架构
Procedure Shortest_Augmenting_Path; Var …… Begin 预处理流为零流,建立残留网络 计算距离函数d(i) //实际上一开始没有必要用BFS计算,清零就行了 i:=s;
while d(s)<n do
begin
if i出发有允许弧(i,j) then
增广路径 (Augmenting Path)
对于残留网络Gf中的一条s-t路径p称其为增 广路径,定义增广路径p的残留容量为p上 弧容量的最小值。后面求最大流要用到增 广路径这个概念。
增广 (Augment)
对 的于意残思留就网是络 对于Gf中每的一一条条属增于广p的路弧径(up,,v)增,广将 f(u,v)增加p的残留容量,将f(v,u)减少p的残 留容量。这样的话,新的流f仍然满足流的 三条性质,并且原流网络的流量|f|增加了。 一般来说,增广过后就会修改残留网络, 易得对于每一条属于p的弧(u,v),要将cf(u,v) 减去p的残留容量, cf(v,u)加上p的残留容 量。(程序实现基本都是通过直接修改残 留网络来实现增广的)
begin
记录j在允许路上的前驱结点i
i:=j;
if i=t then
begin
沿着增广路增广,修改残留网络
i:=s;
end;
end
else
if i出发有弧 then
d(i)=min{ d(j)+1 | (i,j)在残留网络中}
else
begin
d(i):=n; //禁止以后再考虑顶点i
给定一个流网络G=(V,E)和流f,由f压得的G 的残留网络Gf=(V,Ef),定义cf(u,v)为残留网
络Gf中边(u,v)的容量。如果弧(u,v)∈E或弧 (v,u)∈E,则(u,v)∈Ef,且cf(u,v) =c(u,v)-
f(u,v)。在下面的各种概念和方法中,我们 只考虑残留网络中容量大于0的弧,但是编 程时为了方便还是保留了。
这个方法的最大问题就在于怎样快速地找 到一条增广路径。当然我们可以用最基本 的搜索(DFS或BFS),但是这种方法肯定 不够高效,这时我们就需要更高效的算法。
本文将重点介绍一种高效且实用的最大流 算法:SAP算法(最短增广路算法)。
最短增广路算法
即每次寻找包含弧的个数最少的增广路进 行增广,可以证明,此算法最多只需要进 行mn/2次增广。并且引入距离标号的概念, 可以在O(n)的时间里找到一条最短增广路。 最终的时间复杂度为O(n2m),但在实践中, 时间复杂度远远小于理论值(特别是加了 优化之后),因此还是很实用的。(此段 中n表示顶点数|V|,m表示边数|E|)
距离标号
对于每个顶点i赋予一个非负整数值d(i)来描 述i到t的“距离”远近,称它为距离标号, 并且满足以下两个条件:
d(t)=0 对于残留网络Gf中的一条弧(i,j),d(i)≤d(j)+1。
允许弧和允许路
如果残留网络Gf中的一条弧(i,j)满足 d(i)=d(j)+1,我们称(i,j)是允许弧,由允许 弧组成的一条s-t路径是允许路。显然,允 许路是残留网络Gf中的一条最短增广路。 当找不到允许路的时候,我们需要修改某 些点的d(i)。
零流,即对于(u,v)∈E时,f(u,v)=0。然后构建残
留网络,寻找增广路径增广,再修改残留网络, 重复此过程,直到无法找到增广路径。此方法 (之所以不是算法,是因为实现方法很多)称为 Ford-Fulkerson方法。
Ford-Fulkerson方法的伪代码
FORD-FULKERSON-METHORD (G, s, t) 1 initialize flow f to 0 2 while there exists an augmenting path p 3 do augment flow f along p 4 return f
个特别的顶点:源点s和汇点t。
图1 一个流网络的例子
3 s
5
2
v1
2
v 3
1
v
21
3
v4
6
t
2
4
v
v
4
6
5
流 (Flow)
G的流是一个实值函数f,f(u,v)表示顶点u到顶 点v的流,它可以为正,为零,也可以为负, 且满足下列三个性质:
容量限制:对所有u,v∈V,要求f(u,v)≤c(u,v)。 反对称性:对所有u,v∈V ,要求f(u,v)=-f(v,u)。 流守恒性:对所有u,v∈V-{s,t},要求
f (u,v) 0
vV
流量
整个流网络G的流量:
f f (s,v) vV
f f (u,t) uV
割 (Cut)
流网络G=(V,E)的割(S,T)将划分成S和T=V-
S两部分,使得s∈S,t∈T。定义割(S,T)的
容量为c(S,T),则:
c(S,T) c(u,v) uS,vT
残留网络 (Residual Network)
最大流算法及其应用
提要
网络流相关的一些概念 最大流和最小割问题 最大流算法的应用 总结
一、网络流相关的一些概念
流网络 (Flow Network)
流网络是一个有向图G=(V,E),其中每条边
(u,v)∈E均有一非负容量c(u,v)≥0。如果 (u,v)∈E,则假定c(u,v)=0。流网络中有两
当i≠s时退回到前一步
end;
end;
End;
SAP的优化
Fra Baidu bibliotek
二、最大流和最小割问题
最大流问题
对于一个流网络G=(V,E),其流量|f|的最大 值称为最大流,最大流问题就是求一个流 网络的最大流。
增广路定理
当且仅当由当前的流f压得的残留网络Gf中不存在 增广路径时,流f的流量|f|达到最大。(证明在此 略去,可以参见相关书籍)
根据增广路定理,我们可以设计出最基本的求最 大流的方法,一开始将流网络G=(V,E)的流f置为
最小割问题
最小割是指流网络中容量最小的割。 Ford-Fulkerson定理(最小割最大流定
理):在流网络中,最小割的容量等于最 大流的流量。(证明也在此略去) 根据这个定理,我们就可以通过求流网络 的最大流来得到最小割。
最大流算法
前面所讲的只是求最大流的一种方法,但 怎样高效地实现还是一个问题。
相关文档
最新文档