算法导论之最大流

最大流是图应用,将有向图理解为一个流网络,可模型化流经管道的液体、通过装配线的部件、电网中的电流、通讯网络传送的信息等,源点以固定能量产生,而汇点则消耗同等能量,保持守恒。最大流问题追求的就是在流网络中,物质从源点传到汇点的最大能量是多少?对于流网络,算法导论中给出了形式化定义。

流网络G=(V,E)是一个有向图,其中每条边(u,v)∈E均有一个非负能量c(u,v)≥0。如果(u,v)∉E,则假定c(u,v)=0。流网络中有两个特点的顶点,源点s和汇点t,假定每个顶点均处于从源点到汇点的某条路径上,就是说,对每个顶点v∈V,存在一条路径s->v->t,因此图G是连通图,且|E|≥|V|-1。

设G=(V,E)是一个流网络,其能量函数为c。设s为网络的源点,t为汇点。G的流是一个实值函数f:VXV->R,且满足下列三个性质:

容量限制:对所有u,v∈V,要求f(u,v)≤c(u,v)

反对称性:对所有u,v∈V,要求f(u,v)=-f(v,u)


容量限制性质说明从一个顶点到另一个顶点的网络流不能超过设定的容量;反对称性说明从顶点u到顶点v的流是其反向流求负所得。流手恒性说明从非源顶点或非汇点的顶点出发的总网络流为0。

最大流问题,就是给出一个具有源点s和汇点t的流网络G,希望找出从s到t的最大值流。

顶点总的净流量:离开顶点的总的正流量,减去进入顶点的总的正流量。流守恒性的另一个说法,进入某个非源点非汇点的顶点的正网络流,必须等于离开该顶点的正网络流,即流进等于流出。注意是正网络流。

存在多个源点和汇点的最大流问题中,将建立超级源点和超级汇点。

流函数f以流网络中的两个顶点作为自变量,并隐含求和记号的数学定义如下:

设G=(V,E)是一个流网络,f是G中的一个流:

对所有X⊆V,f(X,X)=0

对所有X,Y⊆V,f(X,Y)=-f(Y,X)

对所有X,Y,Z⊆V,其中X∩Y=∅,有f(XUY,Z)=f(X,Z)+f(Y,Z)且f(Z,XUY)=f(Z,X)+f(Z,Y)

应用隐含求和记法,可以证明一个流的值为进入汇点的全部网络流:

|f|=f(V,t),根据流守恒性,对所有顶点(非源点非汇点),进入顶点的总的正流量等于离开顶点的总的正流量。根据上面的数学定义,证明:

|f|=f(s,V)

  =f(V,V)-f(V-s,V)

  =-f(V-s,V)

  =f(V,V-s)

  =f(V,t)+f(V,V-s-t)

  =f(V,t)

1)Ford-Fulkerson方法

Ford-Fulkerson方法用流网络的割求解最大流的值,依赖三个主要思想:残留网络、增广路径、割。

Ø  残留网络形式化定义

假定一个流网络G=(V,E),源点为s,汇点为t;设f是G中的一个流,并考察一对顶点u,v∈V,在不超过容量c(u,v)的条件下,从u到v之间可以压入的额外网络流量,就是(u,v)的残留容量,定义为:cf(u,v)=c(u,v)-f(u,v)。

如果c(u,v)=16且f(u,v)=11,那么在不超过16的情况下,可以在增加cf(u,v)=5的流来增加f(u,v)。

给定一个流网络G=(V,E)和流f,由f压得的G的残留网络Gf=(V,Ef),其中:

Ef={(u,v)∈VXV: cf(u,v)>0}

在残留网络中,每条残留边都能够容纳一个严格为正的网络流。Ef中的边可以是E中的也可以是反向边。在f(u,v)<0情况下,即反向变边,Ef中的边不在E中。

设G=(V,E)是源点为s、汇点为t的一个流网络,且f为G中的一个流。设Gf是由f导出的G的残留网络,且f’为Gf中的一个流。那么f+f’之和也是G中的一个流,|f+f’|=|f|+|f’|。

Ø  增广路径的形式化定义

已知一个流网络G=(V,E)和流f,增广路径p为残留网络Gf中从s到t的一条简单路径。

沿一条增广路径p的每条边传输的网络流的最大量为p的残留容量,定义为:

cf(p)=min{cf(u,v):(u,v)在p上}

设G=(V,E)是一个流网络,f是G的一个流,并设p是残留网络Gf中的一条增广路径,定义函数:

fp:VXV->R


则fp是Gf上的一个流,其值为|fp|= cf(p)>0。

设G=(V,E)是一个流网络,f是G的一个流,p是残留网络Gf中的一条增广路径。fp定义如上, f’=f+fp也是G的一个流,值|f’|=|f|+|fp|>|f|。

通俗地理解残留网络和增广路径:在流网络的一个流f上还可以容纳的多余的流量就是残留网络,而在残留网络中寻找最大流就是增广路径,原来流f加上残留网络中的增广路径流就是不断增加了最大流的值,如此迭代,寻找最大流的值。

Ø  流网络的割形式化定义

Ford-Fulkerson方法沿着增广路径反复增加流,直至找到最大流为止。最大流最小割原理是:一个流使最大流,当且仅当它的残留网络不包含增广路径。

流网络G=(V,E)的割(S,T)是将顶点集合V划分为S和T=V-S两部分,使得s∈S,t∈T。如果f是一个流,则穿过(S,T)的净流定义为f(S,T),割(S,T)的容量为c(S,T)。一个网络的最小割也是网络中所有割中具有最小容量的割。

设f是源点s、汇点t的流网络G中的一个流,并且(S,T)是G的一个割,则通过割(S,T)的净流f(S,T)=|f|,即一个流的值为进入汇点的总网络流量。


网络的最大流必定不超过此网络最小割的容量,最大流的值实际上就是某一个最小割的容量。

这个很好理解了,就是关键割了,最大值取决于关键路径上的容量。

有了上面三个形式化定义,现在可以正式说明最大流最小割定理。

如果f是具有源点s和汇点t的流网络G=(V,E)中的一个流,则下列条件是等价的:

第一:f是G的一个最大流;

第二:残留网络Gf不包含增广路径;(迭代再也找不到增广路径)

第三:对G的某个割(S,T),有|f|=c(S,T);(最大流是最小割的容量)

对Ford-Fulkerson方法的算法分析以及通过最短路径距离定义优化的Edmonds-Karp算法不多述。理解最大流最小割原理最重要是理解流的定义。

Ford-Fulkerson方法的基础算法中关键是增广路径的寻找,这也是决定算法性能的关键点。

2)最大二分匹配

流网络的流满足容量限制、反对称性、流守恒性三大性质,基于残留网络、流网络割以及增广路径的定义,形成最大流的最小割容量值定理。

最大二分匹配正式在这样基础上,用以解决二分图匹配问题。可以说是将二分匹配问题转化为最大流问题,也可以说是最大流问题适合用于解决二分匹配问题,anyway,先看看二分匹配问题的定义。

给定一个无向图G=(V,E),一个匹配是一个边的子集M⊆E,且满足对所有顶点v∈V,M中至多有一条边和v关联。如果M中某条边和v关联,则说顶点v∈V被匹配,否则是无匹配。最大匹配就是最大势的匹配。假定顶点集合可被划分为V=LUR,其中L和R是不相交的,且E中的所有边一个端点在R中、另一个端点在l中,并假设V中的每个顶点至少有一条关联的边。基于这样的二分图定义寻找最大匹配问题有很多实际应用。如集群机器执行分布式任务,机器是集合L,任务是集合R,E中的边(u,v)假设为u∈L的机器执行一项任务v∈R,最大匹配可以将任务尽可能多地分配给机器执行。

应用Ford-Fulkerson方法可以在关于|V|和|E|的多项式时间内,找出无向二分图G=(V,E)的最大匹配。针对二分图建立一个流网络,流对应于匹配,寻找最大匹配就是寻找最大流。定义下二分图G的相应流网络G1=(V1,E1):

设源点s和汇点t是不属于V的新顶点,V1=VU{s,t},如果G的顶点划分为V=LUR,G1的有向边为E的边,从L指向R,再加上|V|条新边:

E1={(s,u):u∈L}U{(u,v):u∈L,v∈R,and (u,v)∈E}U{(v,t):v∈R}

V中的每个顶点至少有一条关联边,|E|≥|V|/2。

设G=(V,E)是一个二分图,其顶点划分为V=LUR,设G1=(V1,E1)是G对应的流网络。如果M是G的匹配,则G1中存在一个整数值的流f,且|f|=|M|,相反,如果f是G1中的整数值流,则G中存在一匹配M满足|M|=|f|。二分图G的一个最大匹配M的势等于其相应的流网络G1中的某一最大流的值。

算法导论还就最大流给出了压入与重标记算法以及优化的重标记与前移算法,值得去深入理解。在理解最大流及其应用上,还是有点脱离实际,所以暂不深入掌握这两个算法。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值