【问题标题】:Increase flow by changing only one edge after Ford-Fulkerson在 Ford-Fulkerson 之后只改变一条边来增加流量
【发布时间】:2013-05-24 03:02:58
【问题描述】:

假设我在图 G = (V,E) 上运行了 Ford-Fulkerson 算法,结果是一个与最小割相关联的最大流 fmax最小。我有兴趣通过增加图中任何一条边的容量来尽可能地增加流量。如何识别这条边?

一种策略可能是:给定初始顶点s和最终顶点t,考虑从s的所有路径>t 并验证容量较低的边缘。例如,如果我有一个 1/1 的边,这就是我必须增加容量的顶点。

有解决这个问题的通用算法吗?

【问题讨论】:

    标签: algorithm graph graph-algorithm max-flow ford-fulkerson


    【解决方案1】:

    一旦你在图中找到了最大流量,增加边 (u, v) 的容量只会增加最大流量,前提是在图中存在从 s 到 u 和从 v 到 t 的正容量路径残差图。如果不是这样,那么增加后残差图中就没有增广路径,因此最大流量将保持最大。

    在具有此属性的边 (u, v) 中,增加 (u, v) 的容量后,您可以从 s 推送到 t 的最大额外流量将是有界的。如果你可以推动任何流穿过这条边,你必须通过找到从 s 到 u 的路径和从 v 到 t 的路径来做到这一点。这样做时,两条路径中的每一条都会有一个瓶颈边缘,并且流量不能增加超过这个。因此,解决该问题的一种选择是执行以下操作:

    • 在残差图中找到从 s 到可从 s 到达的每个其他节点的最大瓶颈路径。
    • 在残差图中找到从每个节点到 t 的最大瓶颈路径。
    • 对于穿过路径的每条边 (u, v),可以推动穿过边的最大额外流量由从 s 到 u 的最大瓶颈路径和从 s 到 u 的最大瓶颈路径的最小值给出v 到 t。

    换句话说,如果你可以计算图中的最大瓶颈路径,你可以找到应该在时间 O(B(m, n) + m) 上增加的边,其中 B(m, n) 是计算图中最大瓶颈路径的成本。

    幸运的是,这是一个经过充分研究的问题,可以使用 Dijkstra 算法的变体来解决,该算法不是存储到每个节点的最小成本路径,而是存储到每个节点的最大瓶颈路径。一个快速的谷歌搜索应该会出现一些额外的信息。使用斐波那契堆,您可以在 O(m + n log n) 时间内实现此搜索,因此识别应该增加容量的边的总运行时间也应该是 O(m + n log n)。

    希望这会有所帮助!

    【讨论】:

    • 很好的解释,不过是一个问题。是否有可能在时间 O(k*|E|) 中计算关于新容量的最大流量,其中 k 是我们使用增广算法增加边缘容量的量?这对我来说不清楚,你能告诉我我是对还是错?还有一件事,最大流量增加量是多少?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    相关资源
    最近更新 更多