求解最大流一般采用两种思路,一种是预流,另一各是增广路。增广路这种思想是基于以下定理:

定理一:设网络 G 的源为 S, 汇和 T,F
和 C 分别为 G 的流和容量,则 F 是最大流当且仅当 G 中不存在可增广路。

由此定理可以设计很多算法来计算最大流,Dinic 算法是其中一种比较高效的方法,其复杂度为 O(n2*m)

Dinic 算法的基本步骤为:

1) 计算残余网络的层次图。我们定义 h[i] 为顶点 i 距离源 S 所经过到最小边数,求出所有顶点的 h 值,h[] 值相同的顶点属于同一层,这就是网络的层次图。

2) 在层次图上进行 BFS 增广,直到不存在增广路径。这时求得的增广路径上顶点是分层的,路径上不可能存在两个顶点属于同一层,即 h[i]== h[j] (i!= j )。同时,求得层次图后,我们可以在层次图上进行多次增广。

3) 重复 1 和 2。直到不存在增广路径。

可知,Dinic 算法找到的增广路径是最短的,即经过的顶点数最少。再者,Dinic 算法找一条增广路径同时可以找到多条,类似增广路径树。比如我们找到了一条增广路径,这条增广路径所增加的流量为 C,则这条增广路径上必然有一条边<i,j>残余容量为 C,这是我们不必又从起点开始寻找增广路,而是从 i 顶点出发找增广路,这样就减少了重复计算,提高了效率,这好像就是所说的多路增广。

posted on 2012-10-01 17:12  pony1993  阅读(624)  评论(1编辑  收藏  举报

View My Stats