最大流也是图的一种常用的算法,许多系统包含了流量问题。例如交通系统有车流量,金融系统有现金流,控制系统有信息流等。许多流问题主要是确定这类系统网络所能承受的最大流量以及如何达到这个最大流量。 如果你想比较彻底的弄清楚网络最大流的原理, 你需要了解三个关键的概念:残留网络,增广路径,最大流最小割定。 这三个概念在算法
导论上有较详细的说明再次就不再讲述了,估计也没有算法导论上讲的清楚。所以可以先翻阅一下<<算法导论>>。下面我就讲述一下一个方法和两个算法。
1.Ford-Fulkerson 方法
Ford-Fulkerson是一种方法,它只提供思想,因此并不是一个算法
。所有增广路算法的基础都是 Ford - Fulkerson 方法的。
给定一个有向网络 G(V,E) 以及源点 s 终点 t ,FF 方法描述如下:
Ford-Fulkerson 方法 (G,s,t)
1 将各边上流量 f 初始化为 0
2 while 存在一条增广路径 p
3 do 沿路径 p 增广流量 f
4 return f
1 将各边上流量 f 初始化为 0
2 while 存在一条增广路径 p
3 do 沿路径 p 增广流量 f
4 return f
假设有向网络 G 中边 (i,j) 的容量为 c(i,j) ,当前流量为 f(i,j) ,则此边的剩余流量即为 r(i,j) = c(i,j) - f(i,j) ,其反向边的剩余流量为(j,i) = f(i,j),有向网中所有剩余流量 r(i,j) > 0 的边构成残量网络 Gf。增广路径是在参与网络中寻找的。通过反复宣召增广路径,直至增广路径都被找出来,根据最大流最小割定理,当不包含增广路径时,f是G中的一个最大流。因此求出增广路径的效率决定着算法的效率。不同的方法对增广路径的求法有所不同, 因此它们的效率也因此不同。接下来用以个实际的例子先看一下算法的基本流程。
![](https://i-blog.csdnimg.cn/blog_migrate/aa037263c41216fb0d70035df6c87f80.jpeg)
Edmonds - Karp 算法
首先来了解一下
Shortest Augmenting Path (SAP), 它 是每次寻找最短增广路的一类算法,Edmonds - Karp 算法以及后来著名的 Dinic 算法都属于此。SAP 类算法可统一描述如下: