Edmonds-Karp算法用于具有流量容量节点的图形

时间:2012-01-05 23:17:11

标签: algorithm graph edmonds-karp

我正在为有向图实现此算法。但是这个图节点的有趣之处还有它们自己的流量。我认为,必须以特殊方式处理原始问题的这种微妙变化。因为,在原始的最大流量问题中可以从头到尾找到任何路径(实际上,在Edmonds-Karp算法中,我们需要做BFS,并选择到达最终节点的第一条路径)但是有了这个节点 - 容量扩展,我们需要更加小心“这个路径选择”的工作。我知道这是因为我实现了原始算法并且发现自己的流量值比max-flow小,我怀疑它与节点容量限制有关。

我在这方面付出了很多努力,并提出了一些想法,比如将初始图转换为一个图形,通过添加自循环(在每个节点上添加自循环并找到包含此自我的路径)对节点没有容量限制路径上每个节点的循环)或添加虚拟节点和边缘,其权重取代初始节点容量约束)但是,我不相信任何这些都是解决这个问题的好方法。

任何想法都会非常感激。

提前致谢。

1 个答案:

答案 0 :(得分:8)

从节点容量的最大流量问题到常规最大流量问题的简单减少:

对于图表中的每个顶点v,请替换为两个顶点v_inv_outv的每个传入边都应指向v_inv的每个传出边都应指向v_out。然后创建一个从v_inv_out的附加边,其容量为c_v,即顶点v的容量。

所以你只需要在变换图上运行Edmunds-Karp。

因此,假设您的问题中包含以下图表(顶点v具有容量2):

s --> v --> t
   1  2  1

这与max-flow问题中的这个图对应:

s --> v_in --> v_out --> t
   1        2         1

显而易见的是,获得的最大流量是解决方案(并且证明它也不是特别困难)。