最大流算法

来源:互联网 发布:魔术师约翰逊数据统计 编辑:程序博客网 时间:2024/05/22 06:23
最大流算法描述的是一个源节点经过流网络达到目的节点的最大流量问题。
对于多源节点和多目的节点的问题可以通过增加一个超级源节点和超级汇聚节点来转换成单源节点和目的节点的问题。
在流网络G(V,E)中,相邻的节点之间有容量限制,实际的流量应不大于这个限制。如果(u,v)属于E,则(u,v).capacity为其容量限制,(u,v).flood为实际在这个边上的流量。(u,v).f<=(u,v).capacity。
流网络G为有向图,且任意一条边都被规定为单向的。若实际情况中为双向,则可通过增加“反平行边”的方法模拟。
在学习最大流算法前,还需要了解增广路径和残存网络的概念。至于切割,在单纯描述这个算法时不没有太大用处。相关概念在这里就不说了,导论里很清楚。


重点介绍一下这个算法的核心思想:
每次都尝试在残存网络中找到增广路径,如果可以找到则计算这个路径的最小流的值,并在原有网络中的该路径处增加这个值。直到无法找到为止。
这个算法的正确性证明是著名的最大流最小切割定理:
1.f是G的一个最大流
2.残存网络Gf不包括任何的增广路径。
3.|f|=c(S,T),其中(S,T)为流网络的某个切割。
这三个命题是等价的。


实际上上面的算法没有涉及切割的概念,两个简单的引理即可证明:
1.流的叠加:如果f是G的一个流,f'是对应于f的残存网络的一个流,则叠加的流量=|f|+|f'|
2.增广路径的流量|f'|>0
所以通过在残存网络中找增广路径并加入这个增广路径的流会使整个流增加。


至于在残存网络中找增广路径的算法,可以通过深度优先遍历O(Ef*),还可以通过广搜O(V²E)。






原创粉丝点击