给定加权无向图G = (V, E)
和一组节点P
。
给定两个节点n1
和n2
。
我想找到从n1
到n2
的两条独立(非重叠)路径,以便两条路径的权重之和最小。我将问题解释为标题所描述的内容,即包含n1
和n2
的最小加权周期。
显然,从p1
到n1
找到第一个最小加权路径n2
,然后从图中删除p1中的边,然后找到第二个最小加权路径{ {1}}。
我怎样才能找到这样的循环?
答案 0 :(得分:1)
可以使用flow networks解决问题。请参阅Edmonds-Karp算法:它涉及计算每个步骤的扩充路径。
使用广度优先搜索找到扩展路径(如Edmonds-Karp算法中所述)(如果图表已加权,请使用Bellman-Ford)。
然后,以相同的方式找到另一个扩充路径。消除两个路径中出现的边缘(流程算法实际上将为您处理此问题),这将是您的周期。基本上,如果您将所有边缘设置为容量1
,则您的周期将包含您推动1
流过的边缘。
如果你不喜欢基于流的解决方案,那么这是另一个。它基本上是相同的,只是没有流量算法。
使用任何可以执行此操作的算法找到最短路径n1 -> n2
(如果没有负成本则为Dijkstra,否则为Bellman-Ford);
使用从n2
指向n1
的定向弧替换此最短路径的边缘。例如,如果您的最短路径为n1 -> x -> y -> z -> n2
,请将边(n1, x)
替换为定向弧x -> n1
,(x, y)
,定向弧y -> x
等。
也否定了这些弧线的成本。例如,如果(x, y)
的费用为c
,则定向弧y -> x
的费用为-c
。
在此新图表中找到从n1
到n2
的最短路径。你现在必须使用一种适用于负边缘的算法。
删除最短路径的两者中出现的边缘。你剩下的就是你所追求的周期。