当前位置:首页 » 费用明细 » 如何判断一个可行流是最小费用流
扩展阅读
在哪里下载钻石 2024-10-20 08:34:45
物流怎么查询价格 2024-10-20 08:25:18
域名交易价格怎么计算 2024-10-20 08:20:08

如何判断一个可行流是最小费用流

发布时间: 2022-02-04 12:13:22

⑴ 帮我解释下网络流

必须知识:最短路径问题
1.Dijkstra
适用于满足所有权系数大于等于0(lij≥0)的网络最短路问题,能求出起点v1到所有其他点vj的最短距离;
朴素的Dijkstra算法复杂度为O(N^2),堆实现的Dijkstra复杂度为O(NlogN).

2.bellman-ford
适用于有负权系数,但无负回路的有向或无向网络的最短路问题,能求出起点v1到所有其它点 vj的最短距离。bellman-ford算法复杂度为O(V*E)。

3.Floyed
适用于有负权系数,可以求出图上任意两点之间的最短路径。DP思想的算法,时间复杂度为O(N^3);
for ( k= 1; k<= n; k++)
for ( i= 1; i<= n; i++)
if (graph[i][k]!=INF)
for ( j= 1; j<= n; j++)
if (graph[k][j]!=INF && graph[i][k]+graph[k][j]< graph[i][j])
graph[i][j]= graph[i][k]+ graph[k][j];

NO.1 s-t最大流
两大类算法
1.增广路算法
Ford-Fulkerson算法: 残留网络中寻找增加路径
STEP0:置初始可行流。
STEP1:构造原网络的残量网络,在残量网络中找s-t有向路。如果没有,算法得到最大流结束。否则继续下一步。
STEP2:依据残量网络中的s-t有向路写出对应到原网络中的s-t增广路。对于增广路中的前向弧,置s(e)=u(e)- f(e)。对于反向弧,置s(e)=f(e) STEP3:计算crement=min{s(e1),s(e2),…,s(ek)}
STEP4:对于增广路中的前向弧,令f(e)=f(e)+crement;对于其中的反向弧,令f(e)=f(e)-crement,转STEP1。
关键点:寻找可增广路。决定了算法复杂度。
实现:Edmonds-Karp 通过采用了广度优先的搜索策略得以使其复杂度达到O(V*E^2)。

优化—> Dinic算法(*)
Dinic算法的思想是为了减少增广次数,建立一个辅助网络L,L与原网络G具有相同的节点数,但边上的容量有所不同,在L上进行增广,将增广后的流值回写到原网络上,再建立当前网络的辅助网络,如此反复,达到最大流。分层的目的是降低寻找增广路的代价。
算法的时间复杂度为O(V^2*E)。其中m为弧的数目,是多项式算法。邻接表表示图,空间复杂度为O(V+E)。

2.预流推进算法
一般性的push-relabel算法: 时间复杂度达到O(V^2*E)。(*)
relabel-to-front算法->改进
最高标号预流推进:时间复杂度O(V^2*sqrt(E))

NO2. 最小费用最大流
求解最小费用流的步骤和求最大流的步骤几乎完全一致,只是在步骤1时选一条非饱和路时,应选代价和最小的路,即最短路。
步骤1. 选定一条总的单位费用最小的路,即要给定最小费用的初始可行流,而不是包含边数最小的路。
步骤2. 不断重复求最大流的步骤来进行,直到没有饱和路存在为止。然后计算每个路的总费用。
和Edmonds-Karp标号算法几乎一样,因为这两种算法都使用宽度优先搜索来来寻找增广路径,所以复杂度也相同,都是O(V*E^2)。

连续最短路算法 + 线性规划对偶性优化的原始对偶算法(*)
传说中,没见过,据说复杂度是O(V^3)

NO3. 有上下届的最大流和最小流(通过添加点来进行转化)(*)

NO4. 相关图论算法
二分图最大匹配: 加s和t构造最大流
专用算法:hungary算法 O(M*N)

二分图最佳匹配: 加s和t构造最小费用最大流
专用算法:KM算法
朴素的实现方法,时间复杂度为O(n^4)
加上松弛函数O(n^3)

最小路径覆盖:
顶点数-二分图的最大匹配

s-t最小边割集:
最大流最小割定理:最小割等于最大流

普通最小边割集:
Stoer-Wagner Minimum Cut O(n^3)

二分图的最大独立集:
N - 二分图的最大匹配(POJ monthly)girls and boys
反证法证明
普通图的最大独立集是np问题。(*)

⑵ 一个可行流是最大流的充分必要条件是( )

可行流是最大流的充分必要条件是无增广链。

从可行流和无增广链关系来看,就可以知道一种寻求最大流的方法:从一个可行流开始,寻求关于这个可行流的可增广链,若存在,则可以经过调整,得到一个新的可行流,其流量比原来的可行流要大,重复这个过程,直到不存在关于该流的可增广链时就得到了最大流。

v这种算法由Ford 和 Fulkerson于1956年提出,故又称 Ford-Fulkerson标号法。

(2)如何判断一个可行流是最小费用流扩展阅读

对一个网络的某些点指定为发点,规定出提供能力;某些点指定为收点,规定出接收能力。

若一个流对每一发点满足总流出量与总流入量之差不大于提供能力,对每一收点满足总流入量与总流出量之差不小于接收能力,则称这个流为可行流。

可行流存在的充分必要条件:对所有顶点子集s都满足:由s到s的弧的总容量,不小于s中的收点总接收能力与s中的发点的总提供能力之差。

这个定理在图论中有许多应用。

⑶ 最小费用最大流问题的相关定义

在网络D(V,A) 中,如果对连接发点vs和收点vt 的一条链P,方向规定为从vs 到vt,则当链P 中弧(vi,vj)
的方向与规定的方向一致时,称弧(vi,vj) 为前向弧,否则称为后向弧。不在这条链上的弧,不定义前向弧和后向弧。 设{fij}为一可行流(假设为非负值),如果存在从发点vs 到收点vt 的链P,在链P 上,下列两条同时满足,则称P 为可扩充链:
①对于P 上的前向弧(vi,vj) 有fij<cij。
②对于P 上的后向弧(vi,vj) 有fij>0。 设对于可行流f 存在可扩充链P,当以ε=1 调整f 而得到可行流f' 时,两流的费用之差成为可扩充链p 的费用。其中P+和P- 分别表示p 上的前向弧和后向弧。

⑷ 最小费用最大流问题的解决方法

解决最小费用最大流问题,一般有两条途径。一条途径是先用最大流算法算出最大流,然后根据边费用,检查是否有可能在流量平衡的前提下通过调整边流量,使总费用得以减少?只要有这个可能,就进行这样的调整。调整后,得到一个新的最大流。
然后,在这个新流的基础上继续检查,调整。这样迭代下去,直至无调整可能,便得到最小费用最大流。这一思路的特点是保持问题的可行性(始终保持最大流),向最优推进。另一条解决途径和前面介绍的最大流算法思路相类似,一般首先给出零流作为初始流。这个流的费用为零,当然是最小费用的。然后寻找一条源点至汇点的增流链,但要求这条增流链必须是所有增流链中费用最小的一条。如果能找出增流链,则在增流链上增流,得出新流。将这个流做为初始流看待,继续寻找增流链增流。这样迭代下去,直至找不出增流链,这时的流即为最小费用最大流。这一算法思路的特点是保持解的最优性(每次得到的新流都是费用最小的流),而逐渐向可行解靠近(直至最大流时才是一个可行解)。
由于第二种算法和已介绍的最大流算法接近,且算法中寻找最小费用增流链,可以转化为一个寻求源点至汇点的最短路径问题,所以这里介绍这一算法。
在这一算法中,为了寻求最小费用的增流链,对每一当前流,需建立伴随这一网络流的增流网络。例如图 1 网络G 是具有最小 费用的流,边旁参数为c(e),f(e),w(e),而图 2 即为该网络流 的增流网络G′。增流网络的顶点和原网络相同。按以下原则建 立增流网络的边:若G中边(u,v)流量未饱,即f(u,v) < e(u,v),则G ' 中建边(u,v),赋权w ' (u,v)=w(u,v);若G中边(u,v)已有流量,即f(u,v)〉0,则G′中建边(v,u),赋权w′(v,u) =-w(u,v)。建立增流网络后,即可在此网络上求源点至汇点的最短路径,以此决定增流路径,然后在原网络上循此路径增流。这里,运用的仍然是最大流算法的增流原理,唯必须选定最小费用的增流链增流。
计算中有一个问题需要解决。这就是增流网络G ′中有负权边,因而不能直接应用标号法来寻找x至y的最短路径,采用其它计算有负权边的网络最短路径的方法来寻找x至y的最短路径,将 大大降低计算效率。为了仍然采用标号法计算最短路径,在每次建立增流网络求得最短路径后,可将网络G的权w(e)做一次修正,使再建的增流网络不会出现负权边,并保证最短路径不至于因此而改变。下面介绍这种修改方法。当流值为零,第一次建增流网络求最短路径时,因无负权边,当然可以采用标号法进行计算。为了使以后建立增流网络时不出现负权边,采取的办法是将 G中有流边(f(e)>0)的权w(e)修正为0。为此, 每次在增流网络上求得最短路径后,以下式计算G中新的边权w (u,v):
w (u,v)=L(u)-L(v)+w(u,v) (*)
式中 L(u),L(v) -- 计算G′的x至y最短路径时u和v的标号值。第一次求最短径时如果(u,v)是增流路径上的边, 则据最短 路径算法一定有 L(v)=L(u)+w ' (u,v)=L(u)+w(u,v), 代入(*)式必有
w″(u,v)=0。
如果(u,v)不是增流路径上的边,则一定有:
L(v)≤L(u)+w(u,v), 代入(*)式则有 w ”(u,v)≥0。
可见第一次修正w(e)后,对任一边,皆有w(e)≥0, 且有流 的边(增流链上的边),一定有w(e)=0。以后每次迭代计算,若 f(u,v)>0,增流网络需建立(v,u)边,边权数w ' (v,u)=-w(u,v) =0,即不会再出现负权边。 此外,每次迭代计算用(*)式修正一切w(e), 不难证明对每一条x至y的路径而言,其路径长度都同样增加L(x)-L(y)。因此,x至y的最短路径不会因对w(e)的修正而发生变化。
【计算步骤】
⒈ 对网络G=[V,E,C,W],给出流值为零的初始流。
⒉ 作伴随这个流的增流网络G′=[V′,E′,W′]。G′的顶点同G:V′=V。若G中f(u,v)<c(u,v),则G′中建边(u,v),w(u,v)=w(u,v)。若G中f(u,v)>0,则G′中建边(v,u),w′(v,u)=-w(u,v)。
⒊ 若G′不存在x至y的路径,则G的流即为最小费用最大流, 停止计算;否则用标号法找出x至y的最短路径P。
⒋ 根据P,在G上增流:对P的每条边(u,v),若G存在(u,v),则(u,v)增流;若G存在(v,u),则(v,u)减流。增(减)流后,应保证对任一边有c(e)≥ f(e)≥0。
⒌ 根据计算最短路径时的各顶点的标号值L(v),按下式修 改G一切边的权数w(e):
L(u)-L(v)+w(e)→w(e)。
⒍ 将新流视为初始流,转2。

⑸ 高分:网络流问题

请问搂主用途,16岁已经上中学吧,高一对吧,通常计算机在高中的最高水平就在这个年龄了。
网络流牵涉到离散数学的很多概念,如果没有这个基础,就算告诉你了你也不能理解的很深刻。
上面已经很多人给了很多参考资料,难道你没有时间去认真看一下吗,既然你知道你能找到到,又何必花那么多分来解决问题呢。
真正的高手擅长于从庞大的信息中分析出自己想要的答案,就算这个领域自己并未接触过。
磨刀不误砍柴功,我只想对你说这些。

⑹ 算法Network Flow 请问如何证明寻找流量网路G=(V,E)中的最大流量,递增路径最多只需要搜寻E

中国第一家-----

和引进的最大流量问题,我们举了一个最大的材料处理流程问题。如果这个问题的已知条件,包括每条边运输货物的单位成本,然后如何运输,以获得最大的交通和运输成本至少吗?这是所谓的最小费用最大流问题。
最大流量定义的基础上,如果每个除权号C(E)的边缘(边缘的能力)之外的另一权重W(E)(单位流量成本)网络,并已获得的最大流量值F ,然后最小费用最大流问题,显然可用来描述以下的线性规划模型:

最小ΣW(E)F(E)
E∈E

满足0≤F(E)≤C(E),所有e∈E
F +(V)= F(V),对所有的v∈V
F +(X) = F(最大流量限制)
(或f(y)= F)

解决最小费用最大流问题,有两个一般的方法。的方式计算的最大流量,最大流量算法,然后基于成本的边缘,检查是否有可能通过调整边缘交通流平衡的前提下,使总成本可降低?只要存在这样的可能性,这样的调整。调整到一个新的最大流量。
然后继续检查在这个新的流程的基础上,调整。迭代下去,直到没有调整是可能的,他们将有最小费用最大流。这一思路的特点是保持的可行性问题(始终保持最大流量)的最佳推进。的最大流量算法思想的方式和在前面所描述的另一种解决方案是类似的,通常开始与被给定为零流量的初始流动。此流的成本是零,当然,是最小的成本。流动增值链,然后寻找一个源点到汇点,但这种增加的流动链必须是所有增量流链成本中最小的一个。如果他们能找到,以增加流动链,增加,增加流链,揭示了一个新的流。作为初始流的流治疗,并继续寻找增加流量链增加流量。本次迭代中继续进行,直到没有找到增加的流动链,当流量的最低成本的最大流量。的想法?该算法是其特征在于通过维持最优(每一个新的流是最小费用流),同时逐渐靠近的可行的解决方案(可达的最大流量是一个可行的解决方案)。
由于到第二算法和最大流算法描述的方法和算法,以最小的成本增加流动链,可以转化为求源点??到汇点的最短路径问题,所以在这里介绍的算法。

在该算法中,为了寻求最小费用流链的增加,每个电流的流动,需要建立的网络流量网络流量不断增加。例如,图1 G的网络是一个具有最低成本的,边缘的下一个参数是c(e)中,“中f(E),瓦特(E),而图2是网络的流的增加的流网络G'。网络的顶点和原来的网络流量的增加。在网络边缘增加流量按以下原则:如果G边(u,v)的交通是不完整的,即F(U,V??) 0,G'CCT边(V ,U)授权W'(V,U)= W(U,V)。增加流动网络的建立,可以通过网络和源点的最短路径,汇点,这决定增加流动路径,这条路径在原有的网络流量增加。使用还增加了流动原则的最大流算法,最小费用流链的增加,增加了流动CD必须选择。
计算需要解决的一个问题。这是一个在流网络G'负侧增加,并且因此不能被直接施加到找到的最短路径x到y的标记方法,使用其他方法计算网络的最短路径的负侧,以找到的最短路径x到y,将极大地减少了计算效率。不过标签的方法来计算最短路径,增加的流量每次你创建了一个网络获得的最短路径,在网络G的权重w(E)做了修正,不会出现消极的一面,建立增加流动网络,最短路径不会改变。下面是这种方法。
时的流量值为零,第一建增流网络的最短路径,由于负侧的情况下,当然,可以用标记的方法来计算。之后,以建立一个提高网络消极的一面,采取的方法流边(F(E)> 0)的权利W(E)的G修正0。为此,每增加流动网络获得的最短路径,下面的公式为y =-L G新的边权重W(U,V):

W(U,V)X(V) L(U)+ W(U V)(*)

其中,L(U),L(V) - G'最短路径计算时,u和v的数值。首先计算最短路径,如果(U,V)的流路侧,根据最短路径算法必须有L(V)= L(U)+ W(U,V)= L(U )+ W(U,V),成(*),必须

瓦特“(U,V)= 0。

(U,V)不增加流动路径上的优势,你必须具备:
L.(V)≤L(U)+ W(U,V) BR />代(*)W(U,V)≥0。

可见瓦特(e)第一修正案,对任何一方,有W(E)≥0,边缘流(侧链上的流量增加),必须是w( E)= 0。每次迭代后,如果f(U,V)> 0,由流动网络需要建立(V,U)的边缘,边缘的权重w(V,U)=-W(U,V)= 0,即不再出现在消极的一面。
此外,每次迭代计算(*)的公式解决所有的W(E),它是很容易证明,每个路径的x到y,同样提高其路径的长度L(X)-L( Y)。因此,x到y的最短路径是不是由于瓦特(五)的变化的校正。

1。流网络G = [V,E,C,W],初始流量值是零。
2。伴随着的增长的流网络G'= [V',E',W']。顶点
G',G:V'= V
如果G F(U,V??)<C(U,V),G'建设的边缘(U,V), W(U,V)= W(U,V)。
G,F(U,V??)> 0,则G'中建边(V,U)(V,U)W'= W(U,V)。
3。 G'有没有的路径x,Y G流的最小费用最大流的
停止计算,否则标记方法,找到最短的路径P x到y。
4。 P增加G流:每边的P(U,V),如果G(U,V),(U,V)的流量,如果G(V,U)(V,U)是流。增加(减少)的流量应确保任一侧上的c(五)≥(五)≥0。
5。根据计算出的最短路径的每个顶点的标签值L(V),下面的公式多少G的所有边缘的权重w(五):

L(U) - L( V)+ W(E)→W(E)。

6。新的数据流作为初始流动开启2。
-----------------的
======================
>下面是英语-----

最大流问题的介绍中,我们列出了一个流量最大的货物配送。如果这个问题还包括已知的条件下,各单位的交付货物的成本,那么如何运输到最低限度,以获得最多的流量,和运输成本?这是所谓的最大流问题的最低成本。
最大流量的基础上,定义,如果双方的第一优先受偿权数C(E)(即边缘的能力),但也有另一权重W(E)(单位成本流),并一直在寻求最大的网络流量F值,然后最小费用最大流问题,它是清除下面的线性规划模型可以用来描述如下:

最小ΣW( E)F(E)
?∈E

满足0≤F(E)≤C(E),所有e∈E
F +(V)= F - (V),对所有的v∈V
F +(X)= F(最大流量限制)
(或F-(Y)= F)

]算法思想

解决最小费用最大流问题,一般有两种方式。一种方法是使用的最大流量的算法来计算的最大流量,然后根据在成本方面,检查它是否可以平衡流的流量调节侧,这样就降低总成本吗?只要存在这样的可能性,在这种调整。调整后的新的最大流量。
然后,新的流的基础上,继续检查和调整。迭代下去,直到没有调整可能,他们将有最小费用最大流。这一思路的特点是保持的可行性问题(始终保持最大流量),以促进最佳。到另一个解决方案,并在前面的最大流算法,介绍了类似的思路,首先,由于作为初始零流的一般流程。的流量为零的成本,当然,成本是最小的。 ,然后找到一个源到汇点的流链,这条产业链的要求,必须是一个流的全产业链成本最低。如果我们能找到的流程链,链中的流动,增加流量,一个新的流。将被视为初始流的流动,继续通过增加流的搜索链接。此迭代下去,直到发现通过流链,则该流程是最小费用最大流。 ?的特点,该算法的理念是保持最佳的解决方案(每个新的收费标准是最小的流),但逐渐接近可行的解决方案(最大流量是一个可行的解决方案时)。
第二种算法的结果,并引进的最大流算法发现的最小费用流链的算法,可以变成一个源到汇点的最短路径,因此该算法在这里。

在该算法中,为了寻求增加最小费用流链,目前流通的每一个陪同下,需要建立一个网络流的流量网络。例如,图1是网络G的最小费用流,旁边的参数C(E),F(E),W(E),图2是网络流量的流网络G'。由峰值流作为原来的网络的网络和相同的。通过下面的G中边(u,v)的原则,按照建立网络边缘的流:如果没有足够的流量,即f(U,V) 0,则G'建设边(V,U),使W'(V,U)= - W(U,V)。建立网络的流媒体,你可以在这个网络中寻求的交汇点源最短路径,流动路径所决定的,然后在这条道路在原有的网络流量。在这里,使用的最大流算法的原则,增加流量,但必须选择以最小的链流的成本。
计算,是一个需要解决的问题。这是流网络G'的权利,有消极的一面,因此标签法不能直接找到x到y的最短路径,使用权等消极的一面计算网络的方式的最短路径x y以找到最短路径,将极大地减少了计算效率。为了使用标签的方法来计算最短路径,每个数据流通过网络来??实现的最短路径,在网络G可以是正确的W(E)的修订,这样做流建立网络将不会是一个负的右侧,和保证的最短路径不改变。这种后的方法描述如下。
当流量值为零,第一内置流量网络的最短路径,非负的右侧的结果,当然,可用于计算标签法。为了增加流量的网络负的时间是不成立后,右侧所采取的方法是边流G(F(E)> 0),W(E)修订为0。为此,每次的最短路径,新的瓦特的右侧下面的计算中的G“(U,V):通过以下方式获得的流网络

瓦特”(U,V)= ?(U)L(V)+ W(U,V)(*)

L(U),L(V) - G'的最短路径x到y的计算时u和v的值的标签。最短路径(U,V)的第一时间,如果是由边缘的流路,然后,根据最短路径算法必须具有L(ⅴ)= L(U)+ w'的(U,V)= L (U)+ W(U,V),代入(*)类型必须

W“(U,V)= 0。

如果(U,V)而不是由侧流道,它必须具备:
L(V)≤L(U)+ W(U,V),
(*)型,W(U ,V)≥0。

可见,W(E),对任何一方的第一次修正,有W(E)≥0,流侧(侧链流),将W(E)= 0。后,每一次迭代计算,如果F(U,V??)> 0,需要建立网络流量(V,U)边,边的权重w(V,U)= - 瓦特(U,V)= 0,即,右侧将不会是一个负侧。
另外,每次迭代的计算与(*)修复了所有的w(五),它是不难证明每个路径x到y,它的所有相同的增加路径长度L(x)的L(y)的,因此,x和y不会是最短路径为w(e)该修正变化。 / a>
] [计算步骤

在网络G = [V,E,C,W],初始值是零流。
2。陪同这流网络G'= [V',E'W'。
G'的顶点G:V'= V
如果F(U,V??)中的G 0,则(U,V),然后在建筑物的边缘G'(U,V),W(U,V)= W(U,V)。
G'建设边(V,U),W(V,U)= - W(U,V)。
3。如果G'X到Y的路径不存在,则G是最大流量,最小费用流
要停止计算;否则标记方法,用来找到x到y的最短路径P.
4。据至P,G中的流量增加:每个边缘的P (U,V),如果?(U,V),(U,V)流,如果G(V,U)(V,U),由流动增加(减少)的流量应任一侧上,以确保有是c(五)≥(五)≥0。
5。根据计算的最短路径的标签L的峰值的时间(v)中,按G型的所有边的权重W(E):

L(U)(V)-L + W(E)→W(E)。
6。新的流作为初始流量为2。=========

希望能满足您的要求----

⑺ 管理运筹学 最小费用最大流问题 3道 。希望能帮我讲一下详细解答流程,越详细越好,感激不尽!

这个应该有例题吧,把每个例题研究一下,看看每个点怎么标数字,每个数字什么意思。把例题看一下就好了,还是比较简单的。我去年才考了,可惜现在忘得差不多了。这个其实不难,我上课也没听,考前花了两天时间看了两遍书,就过了。

⑻ 最大截量最小流量定理的证明

首先,要知道截量的定义:把截集中所有弧的容量之和成为截集的容量(即截量)。所以:
任何一个可行流的流量v(f)都不会超过任一截集的容量。
显然,如果对于一个可行流f^,网络D=(V,A,C)中有一个截集(V^1,V~1),使v(f^)=c(V^1,V~1),则f^必是最大流,而(V^1,V~1)必是D的所有截集中,容量最小的一个,即最小截集。

证明:由截量定义:把截集中所有弧的容量之和成为截集的容量,可知
任何一个可行流的流量v(f)都不会超过任一截集的容量。
如果对于一个可行流f^,网络D=(V,A,C)中有一个截集(V^1,V~1)
∵v(f^)=c(V^1,V~1)
∴f^必是最大流
∵(V^1,V~1)是D的所有截集中的一个。
∴c(V^1,V~1)最小,即是最小截集。
证毕。

谢谢采纳!

⑼ 网络流的资料

编辑本段定义
图论中的一种理论与方法,研究网络上的一类最优化问题 。1955年 ,T.E. 哈里斯在研究铁路最大通量时首先提出在一个给定的网络上寻求两点间最大运输量的问题。1956年,L.R. 福特和 D.R. 富尔克森等人给出了解决这类问题的算法,从而建立了网络流理论。所谓网络或容量网络指的是一个连通的赋权有向图 D= (V、E、C) , 其中V 是该图的顶点集,E是有向边(即弧)集,C是弧上的容量。此外顶点集中包括一个起点和一个终点。网络上的流就是由起点流向终点的可行流,这是定义在网络上的非负函数,它一方面受到容量的限制,另一方面除去起点和终点以外,在所有中途点要求保持流入量和流出量是平衡的。如果把下图看作一个公路网,顶点v1…v6表示6座城镇,每条边上的权数表示两城镇间的公路长度。现在要问 :若从起点v1将物资运送到终点v6去 ,应选择那条路线才能使总运输距离最短�这样一类问题称为最短路问题 。 如果把上图看作一个输油管道网 , v1 表示发送点,v6表示接收点,其他点表示中转站 ,各边的权数表示该段管道的最大输送量。现在要问怎样安排输油线路才能使从v1到v6的总运输量为最大。这样的问题称为最大流问题。
最大流理论是由福特和富尔克森于 1956 年创立的 ,他们指出最大流的流值等于最小割(截集)的容量这个重要的事实,并根据这一原理设计了用标号法求最大流的方法,后来又有人加以改进,使得求解最大流的方法更加丰富和完善 。最大流问题的研究密切了图论和运筹学,特别是与线性规划的联系,开辟了图论应用的新途径。
目前网络流的理论和应用在不断发展,出现了具有增益的流、多终端流、多商品流以及网络流的分解与合成等新课题。网络流的应用已遍及通讯、运输、电力、工程规划、任务分派、设备更新以及计算机辅助设计等众多领域。

网络流算法
一、网络流的基本概念
先来看一个实例。
现在想将一些物资从S运抵T,必须经过一些中转站。连接中转站的是公路,每条公路都有最大运载量。如下图:
每条弧代表一条公路,弧上的数表示该公路的最大运载量。最多能将多少货物从S运抵T?
这是一个典型的网络流模型。为了解答此题,我们先了解网络流的有关定义和概念。
若有向图G=(V,E)满足下列条件:
1、 有且仅有一个顶点S,它的入度为零,即d-(S) = 0,这个顶点S便称为源点,或称为发点。
2、 有且仅有一个顶点T,它的出度为零,即d+(T) = 0,这个顶点T便称为汇点,或称为收点。
3、 每一条弧都有非负数,叫做该边的容量。边(vi, vj)的容量用cij表示。
则称之为网络流图,记为G = (V, E, C)
譬如图5-1就是一个网络流图。
1.可行流
对于网络流图G,每一条弧(i,j)都给定一个非负数fij,这一组数满足下列三条件时称为这网络的可行流,用f表示它。
1、 每一条弧(i,j)有fij≤cij。
2、 除源点S和汇点T以外的所有的点vi,恒有:
该等式说明中间点vi的流量守恒,输入与输出量相等。
3、 对于源点S和汇点T有:
这里V(f)表示该可行流f的流量。
例如对图5-1而言,它的一个可行流如下:
流量V(f) = 5。
2.可改进路
给定一个可行流f=。若fij = cij,称<vi, vj>为饱和弧;否则称<vi, vj>为非饱和弧。若fij = 0,称<vi, vj>为零流弧;否则称<vi, vj>为非零流弧。
定义一条道路P,起点是S、终点是T。把P上所有与P方向一致的弧定义为正向弧,正向弧的全体记为P+;把P上所有与P方向相悖的弧定义为反向弧,反向弧的全体记为P-。
譬如在图5-1中,P = (S, V1, V2, V3, V4, T),那么
P+ = {<S, V1>, <V1, V2>, <V2, V3>, <V4, T>}
P- = {<V4, V3>}
给定一个可行流f,P是从S到T的一条道路,如果满足:
那么就称P是f的一条可改进路。(有些书上又称:可增广轨)之所以称作“可改进”,是因为可改进路上弧的流量通过一定的规则修改,可以令整个流量放大。具体方法下一节会重点介绍,此不赘述。
3.割切
要解决网络最大流问题,必须先学习割切的概念和有关知识。
G = (V, E, C)是已知的网络流图,设U是V的一个子集,W = V\U,满足S U,T W。即U、W把V分成两个不相交的集合,且源点和汇点分属不同的集合。
对于弧尾在U,弧头在W的弧所构成的集合称之为割切,用(U,W)表示。把割切(U,W)中所有弧的容量之和叫做此割切的容量,记为C(U,W),即:
例如图5-1中,令U = {S, V1},则W = {V2, V3, V4, T},那么
C(U, W) = <S, V2> + <V1, V2> + <V1, V3>+<V1, V4>=8+4+4+1=17
定理:对于已知的网络流图,设任意一可行流为f,任意一割切为(U, W),必有:V(f) ≤ C(U, W)。
通俗简明的讲:“最大流小于等于最小割”。这是“流理论”里最基础最重要的定理。整个“流”的理论系统都是在这个定理上建立起来的,必须特别重视。
下面我们给出证明。
网络流、可改进路、割切都是基础的概念,应该扎实掌握。它们三者之间乍一看似乎风马牛不相干,其实内在联系是十分紧密的。
二、求最大流
何谓最大流?首先它必须是一个可行流;其次,它的流量必须达到最大。这样的流就称为最大流。譬如对图5-1而言,它的最大流如下:
下面探讨如何求得最大流。
在定义“可改进路”概念时,提到可以通过一定规则修改“可改进路”上弧的流量,可以使得总流量放大。下面我们就具体看一看是什么“规则”。
对可改进路P上的弧<vi, vj>,分为两种情况讨论:
第一种情况:<vi, vj>∈P+,可以令fij增加一个常数delta。必须满足fij + delta ≤ cij,即delta ≤ cij – fij。
第二种情况:<vi, vj>∈P-,可以令fij减少一个常数delta。必须满足fij - delta ≥ 0,即delta ≤ fij
根据以上分析可以得出delta的计算公式:
因为P+的每条弧都是非饱和弧,P-的每条弧都是非零流弧,所以delta > 0。
容易证明,按照如此规则修正流量,既可以使所有中间点都满足“流量守恒”(即输入量等于输出量),又可以使得总的流量有所增加(因为delta > 0)。
因此我们对于任意的可行流f,只要在f中能找到可改进路,那么必然可以将f改造成为流量更大的一个可行流。我们要求的是最大流,现在的问题是:倘若在f中找不到可改进路,是不是f就一定是最大流呢?
答案是肯定的。下面我们给出证明。
定理1 可行流f是最大流的充分必要条件是:f中不存在可改进路。
证明:
首先证明必要性:已知最大流f,求证f中不存在可改进路。
若最大流f中存在可改进路P,那么可以根据一定规则(详见上文)修改P中弧的流量。可以将f的流量放大,这与f是最大流矛盾。故必要性得证。
再证明充分性:已知流f,并且f中不存在可改进路,求证f是最大流。
我们定义顶点集合U, W如下:
(a) S∈U,
(b) 若x∈U,且fxy<cxy,则y∈U;
若x∈U,且fyx>0,则y∈U。
(这实际上就是可改进路的构造规则)
(c) W = V \ U。
由于f中不存在可改进路,所以T∈W;又S∈U,所以U、W是一个割切(U, W)。
按照U的定义,若x∈U,y∈W,则fxy = cxy。若x∈W,y∈U,则fxy = 0。
所以,
又因 v(f)≤C(U,W)
所以f是最大流。得证。
根据充分性证明中的有关结论,我们可以得到另外一条重要定理:
最大流最小割定理:最大流等于最小割,即max V(f) = min C(U, W)。
至此,我们可以轻松设计出求最大流的算法:
step 1. 令所有弧的流量为0,从而构造一个流量为0的可行流f(称作零流)。
step 2. 若f中找不到可改进路则转step 5;否则找到任意一条可改进路P。
step 3. 根据P求delta。
step 4. 以delta为改进量,更新可行流f。转step 2。
step 5. 算法结束。此时的f即为最大流。
三、最小费用最大流
1.问题的模型
流最重要的应用是尽可能多的分流物资,这也就是我们已经研究过的最大流问题。然而实际生活中,最大配置方案肯定不止一种,一旦有了选择的余地,费用的因素就自然参与到决策中来。
图5-8是一个最简单的例子:弧上标的两个数字第一个是容量,第二个是费用。这里的费用是单位流量的花费,譬如fs1=4,所需花费为3*4=12。
容易看出,此图的最大流(流量是8)为:fs1 = f1t = 5, fs2 = f2t = 3。所以它的费用是:3*5+4*5+7*3+2*3 = 62。
一般的,设有带费用的网络流图G = (V, E, C, W),每条弧<Vi, Vj>对应两个非负整数Cij、Wij,表示该弧的容量和费用。若流f满足:
(a) 流量V(f)最大。
(b) 满足a的前提下,流的费用Cost(f) = 最小。
就称f是网络流图G的最小费用最大流。
2.算法设计
我们模仿求最大流的算法,找可改进路来求最小费用最大流。
设P是流f的可改进路,定义 为P的费用(为什么如此定义?)。如果P是关于f的可改进路中费用最小的,就称P是f的最小费用可改进路。
求最小费用最大流的基本思想是贪心法。即:对于流f,每次选择最小费用可改进路进行改进,直到不存在可改进路为止。这样的得到的最大流必然是费用最小的。
算法可描述为:
step 1. 令f为零流。
step 2. 若无可改进路,转step 5;否则找到最小费用可改进路,设为P。
step 3. 根据P求delta(改进量)。
step 4. 放大f。转step 2。
step 5. 算法结束。此时的f即最小费用最大流。
至于算法的正确性,可以从理论上证明。读者可自己思考或查阅有关运筹学资料。
2.最小费用可改进路的求解
求“最小费用可改进路”是求最小费用最大流算法的关键之所在,下面我们探讨求解的方法。
设带费用的网络流图G = (V, E, C, W),它的一个可行流是f。我们构造带权有向图B = (V’, E’),其中:
1、 V’ = V。
2、 若<Vi, Vj>∈E,fij<Cij,那么<Vi, Vj>∈E’,权为Wij。
若<Vi, Vj>∈E,fij>0,那么<Vj, Vi>∈E’,权为-Wij。
显然,B中从S到T的每一条道路都对应关于f的一条可改进路;反之,关于f的每条可改进路也能对应B中从S到T的一条路径。即两者存在一一映射的逻辑关系。
故若B中不存在从S到T的路径,则f必然没有可改进路;不然,B中从S到T的最短路径即为f的最小费用可改进路。
现在的问题变成:给定带权有向图B = (V’, E’),求从S到T的一条最短路径。
考虑到图中存在权值为负数的弧,不能采用Dijkstra算法;Floyd算法的效率又不尽如人意——所以,这里采用一种折衷的算法:迭代法。
设Short[k]表示从S到k顶点的最短路径长度;从S到顶点k的最短路径中,顶点k的前趋记为Last[k]。那么迭代算法描述如下:(为了便于描述,令n = |V’|,S的编号为0,T的编号为n+1)
step 1. 令Short[k]  +∞(1≤k≤n+1),Short[0]  0。
step 2. 遍历每一条弧<Vk, Vj>。若Short[k] + <k, j> < Short[j],则令Short[j]  Short[k] + <k, j>,同时Last[j]  k。倘不存在任何一条弧满足此条件则转step 4。
step 3. 转step 2.
step 4. 算法结束。若Short[n + 1]= +∞,则不存在从S到T的路径;否则可以根据Last记录的有关信息得到最短路径。
一次迭代算法的时间复杂度为O(kn2),其中k是一个不大于n的变量。在费用流的求解过程中,k大部分情况下都远小于n。
3.思维发散与探索
1)可改进路费用:“递增!递增?”
设f从零流到最大流共被改进了k次,每i次选择的可改进路的费用为pi,那么会不会有p1≤p2≤p3≤……≤pk呢?
2)迭代法:“小心死循环!嘿嘿……”
迭代法会出现死循环吗?也就是说,构造的带权有向图B中会存在负回路吗?
3)费用:“你在乎我是负数吗?”
网络流图中的费用可以小于零吗?
4)容量:“我管的可不仅是弧。”
网络流图中的“容量”都是对弧而言的,但若是给每个顶点也加上一个容量限制:即通过此顶点的流量的上限;任务仍然是求从S到T的最小费用最大流。你能解决吗?
四、有上下界的最大流
上面讨论的网络流都只对每条弧都限定了上界(其实其下界可以看成0),现在给每条弧<Vi, Vj>加上一个下界限制Aij(即必须满足Aij≤fij)。
例如图5-9:
弧上数字对第一个是上界,第二个是下界。若是撇开下界不看,此图的最大流如图5-10(a)所示,流量是6;但若是加入了下界的限制,它的最大流量就只有5了,具体方案见图5-10(b)。
那么有上下界的网络最大流怎么求呢?
一种自然的想法是去掉下界,将其转化为只含上界的网络流图。这种美好的愿望是可以实现的。具体方法如下:
设原网络流图为G = (V, E, C, A),构造不含下界的网络流图G’ = (V’, E’, C’):
1、 V’ = V∪{S’, T’}
2、 对每个顶点x,令 ,若h-(x)≠0,就添加一条弧<S’, x>,其上界为h-(x)。
3、 对每个顶点x,令 ,若h+(x)≠0,就添加一条弧<x, T’>,其上界为h+(x)。
4、 对于任何<Vi, Vj>∈E,都有<Vi, Vj>∈E’,其上界C’ij = Cij – Aij。
5、 新增<T, S>∈E’,其上界CTS = +∞。
在G’中以S’为源点、T’为汇点求得最大流f’。若f’中从S’发出的任意一条弧是非饱和弧,则原网络流图没有可行流。否则可得原图的一个可行流f = f’ + A,即所有的fij = f’ij + Aij。(其正确性很容易证明,留给读者完成)
然后再求可改进路(反向弧<Vi, Vj>必须满足fij≥Aij,而非fij≥0),不断放大f,直到求出最大流。
我们看到,上几节所讨论的一种可行网络流实际上是{Aij = 0}的一种特殊网络流,这里提出的模型更一般化了。解决一般化的复杂问题,我们采取的思路是将其转化为特殊的简单问题,加以研究、推广,进而解决。这是一种重要的基本思想:化归——简单有效。基于这种思想,请读者自行思考解决:
1、 有上下界的最小流。
2、 有上下界的最小费用最大流。
五、多源点、多汇点的最大流
已知网络流图有n个源点S1、S2、……、Sn,m个汇点T1、T2、……、Tm,,求该图的最大流。这样的问题称为多源点、多汇点最大流。
它的解决很简单:
1、 增设一个“超级源”S’,对每个源点Si,新增弧<S’, Si>,容量为无穷大。
2、 增设一个“超级汇”T’,对每个汇点Ti,新增弧<Ti, T’>,容量为无穷大。
3、 以S’为源点、T’为汇点求最大流f。
4、 将f中的S’和T’去掉,即为原图的最大流。
算法正确性显然。
六、顶点有容量限制的最大流
上一节已经提出了这个问题,即对于进出每个顶点的流量也规定一个上限,这样的最大流如何求?
既然我们已经解决了“边限制”问题,现在何不把“点限制”问题转化为“边限制”呢?具体办法如下:
1、 对除源点和汇点之外的每个顶点i拆分成两个顶点i’和i’’。新增一条弧<i’, i’’>,其容量为点i的流量限制。
2、 对于原图中的弧<i, j>,我们将其变换成<i’’, j’>。
3、 对变换后的图求最大流即可。
这里我们又一次运用到了化归的思想:将未知的“点限制”问题转化为已知的“边限制”问题。
七、网络流与二部图的匹配
{二部图和匹配的定义可参见本书专门介绍二部图匹配的章节}
设二部图为G = (X, Y, E)。
增设点S’,对于所有i∈X,新增弧<S’, Xi>,容量为1;增设点T’,对于所有i∈Y,新增一条弧<Yi, T’>,容量也为1。原图中所有的弧予以保留,容量均为+∞。对新构造出来的网络流图以S’为源点、T’为汇点求最大流:流量即为最大匹配数;若弧<Xi, Yj>(i∈X,j∈Y)的流量非零,它就是一条匹配边。
二部图最大匹配问题解决。
那么二部图的最佳匹配问题又如何?
仍然按照上述方法构图。同时令原图中弧的费用保持不变;新增弧的费用置为0。然后以S’为源点、T’为汇点求最小费用最大流即可。最大流的费用即为原二部图最佳匹配的费用。

复制的我快吐了~