【问题标题】:Is there an efficient algorithm for printing all edge-disjoint paths in a flow network?是否有一种有效的算法可以打印流网络中的所有边缘不相交路径?
【发布时间】:2021-07-31 06:39:23
【问题描述】:

我很好奇是否有一种有效的算法可以实际返回流程图中从 s 到 t 的所有边不相交的路径?

例如,以下面的网络为例,其中每条边的容量为 1:

显然只有两条边不相交的路径:

  1. s -> A -> B -> t
  2. s -> C -> D -> E -> F -> t

我猜您需要使用修改后的 Ford-Fulkerson 算法来跟踪增广路径。但它如何覆盖以前的错误路径(如我的示例中的 s -> A -> E -> F -> t)。

【问题讨论】:

    标签: algorithm graph-theory directed-graph graph-traversal


    【解决方案1】:

    正如您所注意到的,Ford--Fulkerson 使用的增强路径并不是立即有用的。

    您可以做的是运行 F--F(或任何最大流算法)直到完成,然后从结果流中贪婪地提取路径。要提取路径,请从 s 开始。如果没有流出的流弧,那么就没有路径可以提取。否则,选择任何一个尾部为当前顶点的流弧,移动到该弧的头部,删除该弧,重复直到当前顶点为t,打印弧序列。

    如果您需要简单的路径,那么您还需要检测路径何时会重复自身并删除循环。这可以通过将当前访问的顶点映射到路径中它们的传入弧的索引来有效地完成。

    如果您需要较短的简单路径,可以将 F--F 换成最小成本流算法并省略循环检测(具有正成本循环的流不能是最小成本)。

    【讨论】:

    • 嗨大卫,谢谢你的回答!我还是有点困惑。当您说“从结果流中提取路径”时,这是否意味着来自残差图或流图(其中每条边的权重是通过该边的流量)?我猜是后者。另外,我对您对周期的评论感到有些困惑。我认为流程图不会有任何循环?您能否提供一个简单的视觉示例来说明您所说的内容?再次感谢!
    • @Nova 假设我们有一个弧 s->1, s->2, 1->2, 2->1, 1->t, 2->t 的图。如果我们增加 s->1->2->t 和 s->2->1->t,那么我们得到一个流循环 1->2->1。当然,为了在实际实现中提高效率,我们可能会对 1->2 和 2->1 使用相同的边,但我们可以通过细分这些弧中的每一个来修改示例。
    • 原来容量图中只有一个循环,不是吗?在流程图中,s->1->2->t 和 s->2->1->t 似乎确实是边不相交的路径。
    • @Nova 然而,弧贪婪策略可以提取 s->1->2->1->t 和 s->2->t。
    • 啊,我明白了。确实,s->1->2->1->t 不是一条简单的路径。
    猜你喜欢
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多