我正在寻找一种方法,以找到从源顶点(S)到目标顶点(D)的无环路径(最好是最短路径,但不一定如此),该路径通过另一个特定顶点(X)穿过图。
现在,在您指向我之前 Finding shortest path between pass through a specific vertex我想说的是,这种解决方案忽略了从S到X的最短路径已经包含D的情况,这是我应用此算法的可能情况。在这种情况下,您将如何解决这个问题?
我尝试过一次幼稚的尝试,以在Yen的K最短路径算法的结果中寻找这样的路径。但我希望有一种更有效,更确定的方式来做到这一点。
再次指出,我并不一定要寻找从S到D到X的最短路径,而是任何无环路径,尽管最短路径会更好。
答案 0 :(得分:3)
基本概念很简单;那么您就可以适应在X
的最短剩余路径上循环进出的情况。
D
。P1
,这是从S
到X
的最短路径。D
恢复到图形。P1
中的所有节点。P2
,这是从X
到D
的最短路径。P1
+ P2
。这就是解决方案的要旨。
注意:您可能会发现删除P1
会产生一个子图,而该子图没有D的剩余路径。在这种情况下,您将需要一种动态编程解决方案来搜索该想法以上,但具有回溯功能和另一种搜索P1
个候选人的方法。
首次找到P1
时,请确保要使用的节点在行程的第二段不会将X
与D
隔离开。这将为您提供更快的搜索算法。
足够开始吗?
适应的需求来自这样的情况- 考虑图
src dst
S 1, 2
1 X, D
2 D
X 1
您的部分路径是
S -> 1 -> X
S -> 2 -> 3 -> X
X -> 1 -> D
and, incidentally,
S -> 1 -> D
运行最短路径搜索时,会得到路径S 1 X 1 D
,由于循环而被拒绝。实施我的第一个修改时-尝试查找路径1
时删除节点X to D
,就没有剩余的路径。
该算法需要具有备份能力,拒绝路径X 1 D
来找到X 2 3 D
。从描述中并不能立即看出这种编码。
这是您的一项心智练习:是否可以构造一个图,其中每个最短路径(S to X
和X to D
)将另一个终端节点与{{ 1}}?在上面的示例中,您可以简单地切换过程:当X
路径隔离S to X
之后,重新开始:首先找到D
,删除节点X to D
,然后然后在其余图中找到1
。
您是否还能找到该开关也不起作用的图形?
如果没有,您可以立即解决。如果是这样,您将需要处理更复杂的情况。