网络流算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
网络流算法
在实际生活中有许多流量问题,例如在交通运输网络中的人流、车流、货物流,供水网络中的水流,金融系统中的现金流,通讯系统中的信息流,等等。50年代以福特(Ford)、富克逊(Fulkerson)为代表建立的“网络流理论”,是网络应用的重要组成部分。在最近的奥林匹克信息学竞赛中,利用网络流算法高效地解决问题已不是什么稀罕的事了。本节着重介绍最大流(包括最小费用)算法,并通过实际例子,讨论如何在问题的原型上建立—个网络流模型,然后用最大流算法高效地解决问题。
[问题描述]如图4-1所示是联结某产品地v1和销售地v4的交通网,每一弧(vi,vj)代表从vi到vj的运输线,产品经这条弧由vi输送到vj,弧旁的数表示这条运输线的最大通过能力。产品经过交通网从v1到v4。现在要求制定一个运输方案使从v1到v4的产品数量最多。
一、基本概念及相关定理
1)网络与网络流
定义1 给一个有向图N=(V,E),在V中指定一点,称为源点(记为vs,和另一点,称为汇点(记为vt),其余的点叫中间点,
对于E中每条弧(vi,vj)都对应一个正整数c(vi,vj)≥O(或简写成cij),称为f的容量,则赋权有向图N=(V,E,c,vs,vt)称为一个网络。如图4-1所给出的一个赋权有向图N就是一个网络,指定v1是源点,v4为汇点,弧旁的数字为cij。
所谓网络上的流,是指定义在弧集合E上一个函数f={f(vi,vj)},并称f(vi,vj)为弧(vi,vj)上的流量(下面简记为fij)。如图4-2所示的网络N,弧上两个数,第一个数表示容量cij,第二个数表示流量fij。
2)可行流与最大流
在运输网络的实际问题中,我们可以看出,对于流有两个显然的要求:一是每个弧上的流量不能超过该弧的最大通过能力(即弧的容量);二是中间点的流量为0,源点的净流出量和汇点的净流入量必相等且为这个方案的总输送量。因此有:
定义2 满足下列条件
(1)容量约束:0≤fij≤cij,(vi,vj)∈E,
(2)守恒条件
对于中间点:流入量=流出量;对于源点与汇点:源点的净流出量vs(f)=汇点的净流入量(-vt(f))的流f,称为网络N上的可行流,并将源点s的净流量称为流f的流值v(f)。
网络N中流值最大的流f*称为N的最大流。
3)可增广路径
所谓可增广路径,是指这条路径上的流可以修改,通过修改,使得整个网络的流值增大。
定义3 设f是一个可行流,P是从源点s到汇点t的一条路,若p满足下列条件:
(1)在p 上的所有前向弧(vi →vj)都是非饱和弧,即0≤fij (2)在p 上的所有后向弧(vi ←vj)都是非零弧,即0 则称p 为(关于可行流f 的)一条可增广路径。 V ,E,C,V S ,V T : 从V s 开始到Vt 建立起的一个流的网络。 C 容量--(Cvi,Cvj )简写成C i,j F i,j 表示流量。 <1>可行流:对于中间点,流入量=流出量; 源点与汇点:源点的净流出量Vs(f)=-Vt(f) 汇点的净流入量,f 称为这个网络的可行流。并将源点S 的净流量称为流值。 记: vi 点的净流出量与净流入的差有三种: =0中间点 i=s, =vf i=t -vf(f) 网络N 中流值最大的流f*称为N 的最大流 <3>可增广路径:是指在这条路径上的流可以修改,通过修改,让他的流量增大。 ⎪⎩⎪⎨⎧=-≠==-∑∑∈∈t i f v t s i s i f v f f i j i j v B v ji v A v ij )(,0)()()( 0020 θ(i)=表示顶点i可以增广的流量。θ(t)-> <1>最大流最小割定理:在一个网络N中,从Vs到Vt最大流的容量等于分离Vs,Vt的最小割的容量。 ●给源点S+,θ(s)=∞ 找出与已标记顶点相连(有直接边)的未标记的顶点进行标记 1、(i,j)是i-→j前向弧且饱和(fij=cij),则j不标记 2、(i,j)是i→j前向弧且不饱和(fij i+,min(θ(i),cij-fij) 3、(j,i)是反向弧j-→i 且fji=0则j不标记 4、(j,i)是反向弧j-→i 且fji>0则j: i-,min(θ(i),fji) 直到图中标记到了Vt,,就得到了一条增广路径θ(t)。 <2>汇点的f,是所有增广路径上标记顶点流量f的最小值θ(t)。从汇点回溯到源点,如果从顶点j回溯到i,只要看j的标记如果+,则把fij=fij+θ(t);如果是-,(说明是反向弧) fji=fji-θ(t); 多次增广以后,直到不能再继续标记了,就得到最大流。 ***最大流=源点的所有净输出量=汇点的所有净输入量。 *** 最小割=是从源点开始可以进行增广的所有顶点集合+剩下顶点的集合。 --》经过增广以后得到: 红色圈为:包含Vs的不能再增广的A割,绿色为包含Vt的顶点集合。则有最大流最小割的定义知: 割集={每条的起点,终点}={(3,t).(2,4)} 最大流(最小割的流量)=上面的割集的输出流总量=5+9=14 注意:6是输入,不是计入最大流的值。 (4)割及其容量 定义4 如果A是V的一个子集,A-=V-A,s∈A,t∈A-,则称边集(A,A-)为网络N的一个割,显然,若把某一割的弧从网络中丢去,则从vs到vt就不存在路。所以直观上讲,割是从vi到vj的必经之道。 定义5 给一割(A,A-),把其中所有弧的容量之和称为这个割的容量,记为c(A,A-),即 c(A,A-)=∑c(e) 网络N中容量最小的割(A*,A*-)称为N的最小割。 不难证明,任何一个可行流的流量v(f)都不会超过任一割的容量,即 v(f)≤c(A,A-) 例如,图4-2中,若A={s},(A,A-)={(s,v3),(s,v2)},c(A,A-)=4+3=7。 A(顶点的一个子集),A-(所有的顶点减-A),A中的顶点有直接边的到(A的补集)容量之和。 C(A,A-)=4+3=7 A(VS)---A-(Vt) Vi,Vj满足:Vi属于A,Vj属于A- ***反向边不行,必须是从Vi到Vj即Vj到Vi不行 •第一步:标号过程,找一条增广链 –1、给源点s标号[s+,q(s)=∞],表示从s 点有无限流出潜力 –2、找出与已标号节点i相邻的所有未标号节点j,若 –(1) (i, j)是前向弧且饱和,则节点j不标号; –(2) (i, j)是前向弧且未饱和,则节点j标号为[i+,q(j)],表示从节点i正向流出,可增广q(j)=min[q(i),c ij-f ij] ; –(3) (j, i)是后向弧,若f ji=0,则节点j不标号; –(4) (j, i)是后向弧,若f ji>0,则节点j标号为[i-,q(j)],表示从节点j流向i,可增广q(j)=min[q(i),f ji] ;