【问题标题】:How to get the cut-set using the Edmonds–Karp algorithm?如何使用 Edmonds–Karp 算法获得割集?
【发布时间】:2011-07-19 19:42:30
【问题描述】:

我使用在 Edmonds–Karp 算法 wiki 页面中找到的伪代码实现了 Edmonds–Karp 算法:http://en.wikipedia.org/wiki/Edmonds%E2%80%93Karp_algorithm

效果很好,但是算法输出的是最大流量值(最小切割值),我需要这个切割包含的边列表

我尝试改变算法,没有成功,你们能帮忙吗?

谢谢

【问题讨论】:

    标签: java algorithm pseudocode edmonds-karp


    【解决方案1】:

    如果您已经有了流,则计算残差图。然后从源头进行深度优先搜索(或广度优先搜索,我认为这并不重要),以计算切割一半(S)中的顶点。剩余的顶点在切割的另一半,T。

    这给了你你的削减(S,T)。如果您特别想要 S 和 T 之间的边缘,则可以遍历所有边缘,选择连接 S 和 T 的边缘。(尽管最后一部分可能有更优雅的方法。)

    【讨论】:

    • 你能解释一下F nXn矩阵中数字的含义吗?我该如何准确地使用它们?
    • @ciochPep:矩阵 F 给出了通过图中每条边的流量以实现最大流量——本质上这就是 Edmonds Karp 算法旨在计算的。这也使得计算残差图变得容易:它只是矩阵 C - 矩阵 F 的差。
    【解决方案2】:

    如果你已经知道最大流,那么最小割是(S, T),其中S是残差网络中从源点可达的顶点集,T是互补集。连接来自 S 的顶点和来自 T 的顶点的边属于割。

    【讨论】:

    • 我只知道最小切值...不知道集合
    • @ciochPep 你说你实现了 Edmonds-Karp?它与值一起找到流。
    • 你能解释一下F nXn矩阵中数字的含义吗?我该如何准确地使用它们?
    • @ciochPep F[i,j] 是从 i 到 j 沿边缘的流。在实际算法中,它可能表示为边列表,而不是矩阵
    【解决方案3】:

    这里有一些提示可以帮助阐明将来如何为任何人做到这一点。

    1. 要查找 S 个顶点,请从源顶点执行 BFS(或 DFS)搜索,仅跟踪剩余一些流动容量的边。 (换句话说,非饱和边缘)。根据定义,这些不能在 mincut 中。

    2. 要查找 T 顶点,从 sink 顶点执行 BFS(或 DFS)搜索,仅连接到尚未添加到 S 集合的顶点。这些可能有剩余流量,或者可能完全饱和,没关系。因为您是从接收器执行 BFS,所以如果图形是定向的,您需要确保遵循边缘指向的相反方向。注意:重要的是只包含可以从 T 集合中的 sink 到达的顶点,否则您最终会在最小切割中包含不属于那里的边。 (这让我困扰了很长时间。)

    3. 一旦有了这两组顶点,就可以遍历图的所有边。任何在 S 中具有源节点并且在 T 中具有目标节点的任何人都是最小切割的一部分。不过,重要的是要注意,这只是许多可能的最小切割中的一个。在图中找到所有可能的 S-T 最小割需要更多时间。

    希望这可以帮助任何试图解决这个问题的未来互联网人!祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-29
      • 2012-02-03
      • 2020-08-03
      • 2012-11-20
      • 1970-01-01
      • 2011-09-16
      • 2011-04-22
      • 2018-11-19
      相关资源
      最近更新 更多