如何在加权无向图中找到包含两个给定节点的最小加权循环?

时间:2015-09-07 09:35:39

标签: algorithm graph cycle shortest-path

给定加权无向图G = (V, E)和一组节点P

给定两个节点n1n2

我想找到从n1n2的两条独立(非重叠)路径,以便两条路径的权重之和最小。我将问题解释为标题所描述的内容,即包含n1n2的最小加权周期。

显然,从p1n1找到第一个最小加权路径n2,然后从图中删除p1中的边,然后找到第二个最小加权路径{ {1}}。

我怎样才能找到这样的循环?

1 个答案:

答案 0 :(得分:1)

可以使用flow networks解决问题。请参阅Edmonds-Karp算法:它涉及计算每个步骤的扩充路径。

使用广度优先搜索找到扩展路径(如Edmonds-Karp算法中所述)(如果图表已加权,请使用Bellman-Ford)。

然后,以相同的方式找到另一个扩充路径。消除两个路径中出现的边缘(流程算法实际上将为您处理此问题),这将是您的周期。基本上,如果您将所有边缘设置为容量1,则您的周期将包含您推动1流过的边缘。

如果你不喜欢基于流的解决方案,那么这是另一个。它基本上是相同的,只是没有流量算法。

  1. 使用任何可以执行此操作的算法找到最短路径n1 -> n2(如果没有负成本则为Dijkstra,否则为Bellman-Ford);

  2. 使用从n2指向n1的定向弧替换此最短路径的边缘。例如,如果您的最短路径为n1 -> x -> y -> z -> n2,请将边(n1, x)替换为定向弧x -> n1(x, y),定向弧y -> x等。

    也否定了这些弧线的成本。例如,如果(x, y)的费用为c,则定向弧y -> x的费用为-c

  3. 在此新图表中找到从n1n2的最短路径。你现在必须使用一种适用于负边缘的算法。

  4. 删除最短路径的两者中出现的边缘。你剩下的就是你所追求的周期。