当前位置:文档之家› 最大流算法及其应用

最大流算法及其应用


最短增广路算法
即每次寻找包含弧的个数最少的增广路进 行增广,可以证明,此算法最多只需要进 行mn/2次增广。并且引入距离标号的概念, 可以在O(n)的时间里找到一条最短增广路。 最终的时间复杂度为O(n2m),但在实践中, 时间复杂度远远小于理论值(特别是加了 优化之后),因此还是很实用的。(此段 中n表示顶点数|V|,m表示边数|E|)
f (u, v) 0
vV
流量
整个流网络G的流量:
f f (s, v)
vV
f f (u, t )
uV
割 (Cut)
流网络G=(V,E)的割(S,T)将划分成S和T=VS两部分,使得s∈S,t∈T。定义割(S,T)的 容量为c(S,T),则:
c(S , T )
图2 一个二分图的例子及其最大匹配(实 线表示选中的边,虚线表示未选中的边)
分析
实际上我们可以将二分图的最大匹配问题 转换为最大流问题。增加源和汇,将源连 到每个左边的点,将每个右边的点连到汇, 并把原来的边改为有向的,从左边的点指 向右边的点,最后把图中所有弧的容量赋 为1,这个流网络的最大流即为原二分图的 最大匹配。
最大流算法及其应用
提要
网络流相关的一些概念 最大流和最小割问题 最大流算法的应用 总结
一、网络流相关的一些概念
流网络 (Flow Network)
流网络是一个有向图G=(V,E),其中每条边 (u,v)∈E均有一非负容量c(u,v)≥0。如果 (u,v)∈E,则假定c(u,v)=0。流网络中有两 个特别的顶点:源点s和汇点t。
uS ,vT

c(u, v)
残留网络 (Residual Network)
给定一个流网络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的弧,但是编 程时为了方便还是保留了。
当前弧优化
可以注意到一个事实:如果说在某次迭代 中从i出发的弧(i,j)不是允许弧,则在顶点i的 标号修改之前(i,j)都不可能是允许弧。(因 为d(i)不变,d(j)不减且d(i)≤d(j)+1)这样, 在查找允许弧的时候只需要从上一次找到 的允许弧开始找。所以我们增加“当前弧” 这个数据结构,记录当前顶点找到的允许 弧,只有在修改这个顶点标号时才会更改 这个顶点的当前弧。
Gap优化
我们可以注意到由于残留网络的修改只会使d(i)越 来越大(因为修改前d(i)<d(j)+1,而修改后会存在 d(i)=d(j)+1,因此变大了),所以说d(i)是单调递 增的,这就提示我们,如果d函数出现了“断层”, 即没有d(i)=k,而有d(i)=±1,这时候必定无法再 找到增广路径。我们可以这么想,现在的i满足 d(i)=k+1,发现没有一个d(j)为k,因此就会尝试去 调整d(i),但是d(i)是单调递增的,只会越来越大, 所以k这个空缺便永远不会被补上,也就是说无法 再找到增广路径。
算法基本架构
Procedure Shortest_Augmenting_Path; Var …… Begin 预处理流为零流,建立残留网络 计算距离函数d(i) //实际上一开始没有必要用BFS计算,清零就行了 i:=s;
while d(s)<n do begin if i出发有允许弧(i,j) then begin 记录j在允许路上的前驱结点i i:=j; if i=t then begin 沿着增广路增广,修改残留网络 i:=s; end; end
图3 新建的流网络(图中弧的容量均为1)
s
t
分析(续)
对于每个左边的点,进去的流量最多只有1; 对于每个右边的点,出去的流量最多只有1, 所以每个点最多在选中的边里最多出现一 次(选中的边即为中间流量为1的弧)。又 因为流最大,所以结果就是原二分图的最 大二分匹配。 关于二分图的最大二分匹配还有另外一种 算法:匈牙利算法,具体的内容可以参阅 其他资料。
【输入格式】 输入文件中第一行有两个正整数N和M 。 第二行中有N个整数描述每一个通讯中转站的建 立成本,依次为P1, P2, …, PN 。 以下M行,第(i + 2)行的三个数Ai, Bi和Ci描述第i 个用户群的信息。 所有变量的含义可以参见题目描述。 【输出格式】 你的程序只要向输出文件输出一个整数,表示公 司可以得到的最大净获利。
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
else if i出发有弧 then d(i)=min{ d(j)+1 | (i,j)在残留网络中} else begin d(i):=n; //禁止以后再考虑顶点i 当i≠s时退回到前一步 end; end; End;
SAP的优化
SAP算法有两个重要的优化:Gap优化和 当前弧优化。
增广路径 (Augmenting Path)
对于残留网络Gf中的一条s-t路径p称其为增 广路径,定义增广路径p的残留容量为p上 弧容量的最小值。后面求最大流要用到增 广路径这个概念。
增广 (Augment)
对于残留网络Gf中的一条增广路径p,增广 的意思就是对于每一条属于p的弧(u,v),将 f(u,v)增加p的残留容量,将f(v,u)减少p的残 留容量。这样的话,新的流f仍然满足流的 三条性质,并且原流网络的流量|f|增加了。 一般来说,增广过后就会修改残留网络, 易得对于每一条属于p的弧(u,v),要将cf(u,v) 减去p的残留容量, cf(v,u)加上p的残留容 量。(程序实现基本都是通过直接修改残 留网络来实现增广的)
二、最大流和最小割问题
最大流问题
对于一个流网络G=(V,E),其流量|f|的最大 值称为最大流,最大流问题就是求一个流 网络的最大流。
增广路定理
当且仅当由当前的流f压得的残留网络Gf中不存在 增广路径时,流f的流量|f|达到最大。(证明在此 略去,可以参见相关书籍) 根据增广路定理,我们可以设计出最基本的求最 大流的方法,一开始将流网络G=(V,E)的流f置为 零流,即对于(u,v)∈E时,f(u,v)=0。然后构建残 留网络,寻找增广路径增广,再修改残留网络, 重复此过程,直到无法找到增广路径。此方法 (之所以不是算法,是因为实现方法很多)称为 Ford-Fulkerson方法。
图1 一个流网络的例子
v1
2 2
v 3
3 s
v 2
1
v 6
3
4 t 4
1 5
v 4 v 5
2
6
流 (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},要求
距离标号
对于每个顶点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)。
SAP的两个优化效果比较
(程序1:SAP 程序2:SAP+Gap 程序3: SAP+当前弧 程序4:SAP+Gap+当前弧) 测试题目:NOI2006《最大获利》
比较结果(表中时间单位:s)
测试点 测试点 测试点 测试点 测试点 测试点 测试点 测试点 试点 1 2 3 4 5 6 7 8 9
程序1 程序2 程序3
0.01 0.02 0.02
0.04 0.02 0.02
0.06 0.02 0.03
0.04 0.02 0.03
0.06 0.01 0.04
0.06 0.01 0.03
0.10 0.02 0.05
TLE 1.62 TLE
TLE 1.64 TLE
程序4
0.01
0.01
0.02
0.02
最小割模型
最小割问题是网络流建模里的一个难点, 由于最小割模型在原问题中往往很隐蔽, 有时确实需要凭感觉。 看一道比较有难度的例题《最大获利》 (NOI2006第二试):
最大获利
【问题描述】 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇, 更是挑战。THU集团旗下的CS&T通讯公司在新一代通讯技术血战的 前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成前期 市场研究、站址勘测、最优化等项目。 在前期市场调查和站址勘测之后,公司得到了一共N个可以作为通讯 信号中转站的地址,而由于这些地址的地理位置差异,在不同的地方 建造通讯中转站需要投入的成本也是不一样的,所幸在前期调查之后 这些都是已知数据:建立第i个通讯中转站需要的成本为Pi(1≤i≤N)。 另外公司调查得出了所有期望中的用户群,一共M个。关于第i个用户 群的信息概括为Ai, Bi和Ci:这些用户会使用中转站Ai和中转站Bi进行 通讯,公司可以获益Ci。(1≤i≤M, 1≤Ai, Bi≤N) THU集团的CS&T公司可以有选择的建立一些中转站(投入成本), 为一些用户提供服务并获得收益(获益之和)。那么如何选择最终建 立的中转站才能让公司的净获利最大呢?(净获利 = 获益之和 - 投入 成本之和)
相关主题