经典算法-最大流问题

举例描述

最大流问题是一个很经典的问题,不少人对此也很熟悉,它可以等同于一个线性规划问题。下面给出最大流问题的一个基本描述:以下图所示,s是源点,t为汇点,每条边上数字的含义是边可以容许流过的最大流量。能够将边当作管道,0/3表明该管道每秒最多能经过3个单位的流量,0表明当前流量。最大流问题便是说,从s点到t点,最大容许流量是多少?web

这里写图片描述

公式描述

这里写图片描述
的流量等于流出该点的流量。这个能够理解为流量守恒,就如同电流同样,流入一个电阻的电流必然等于流出的电流。

那么最大流就能够表示为: 算法

这里写图片描述

Ford-Fulkerson解法介绍

该方法依赖于三种重要思想:残留网络,增广路径和割

Ford-Fulkerson思想

Ford-Fulkerson是一种迭代的方法。开始时,对全部的u,v属于V,f(u,v)=0(这里f(u,v)表明u到v的边当前流量),即初始状态时流的值为0。在每次迭代中,能够经过寻找一个“增广路径”来增长流值。增广路径能够看作是从源点s到汇点t之间的一条路径,沿该路径能够压入更多的流,从而增长流的值。反复进行这一过程,直到增广路径都被找出为止。网络

增广路径

举个例子来讲明下,如图所示,每条红线就表明了一条增广路径,当前s到t的流量为3。固然这并非该网络的最大流,根据寻找增广路径的算法咱们其实还能够继续寻找增广路径。.net

这里写图片描述

残留网络

顾名思义,残留网络是指给定网络和一个流,其对应还能够容纳的流组成的网络。具体说来,就是假定一个网络G=(V,E),其源点s,汇点t。设f为G中的一个流,对应顶点u到顶点v的流。在不超过C(u,v)的条件下(C表明边容量),从u到v之间能够压入的额外网络流量,就是边(u,v)的残余容量(residual capacity),定义以下:cdn

r(u,v)=c(u,v)-f(u,v)htm

举个例子,假设(u,v)当前流量为3/4,那么就是说c(u,v)=4,f(u,v)=3,那么r(u,v)=1。blog

咱们知道,在网络流中还有这么一条规律。从u到v已经有了3个单位流量,那么从反方向上看,也就是从v到u就有了3个单位的残留网络,这时r(v,u)=3。能够这样理解,从u到v有3个单位流量,那么从v到u就有了将这3个单位流量的压回去的能力。图片

咱们来具体看一个例子,以下图所示一个流网络ci

这里写图片描述

对应的残留网络:

这里写图片描述

求解步骤举例

1.得到残留网络

2.穷举全部的增广路径

以下图所示:

这里写图片描述

计算最大流的标号法

这里介绍计算网络最大流的简便方法—标号法,此方法是Ford—Fulkerson 于1956年提出来的,它的原理是利用寻找增广链来不断改善可行流。 设μ是网络中 到 的一条链,规定 到 的方向为μ的方向。 μ上与μ的方向一致的弧称为前向弧,前向弧的集合记为μ+, μ上与μ的方向相反的弧称为后向弧,后向弧的集合记为μ-。it

这里写图片描述
上图 若给一个可行流{},称网络中 = 的弧为饱和弧,称 <的弧为非饱和弧,称 =0的弧为零流弧,称 >0的弧为非零流弧。 增广链:设{}是可行流, μ是 到 的一条链,若μ知足下列条件,则称μ为关于 f 的增广链。(注意: f ={}) 1°对于任何( ,)∈μ+,0≤ < (前向弧为非饱和弧) 2°对于任何( ,)∈μ-,0 <≤ (后向弧为非零流弧)

参考:

http://blog.csdn.net/smartxxyx/article/details/9275177 http://blog.csdn.net/smartxxyx/article/details/9293665/ 以及: http://dec3.jlu.edu.cn/webcourse/t000048/yun/ch7_04.htm

相关文章
相关标签/搜索