算法-通过特定顶点的路径查找

时间:2020-01-16 23:12:49

标签: python algorithm graph-theory dijkstra path-finding

我正在寻找一种方法,以找到从源顶点(S)到目标顶点(D)的无环路径(最好是最短路径,但不一定如此),该路径通过另一个特定顶点(X)穿过图。

现在,在您指向我之前 Finding shortest path between pass through a specific vertex我想说的是,这种解决方案忽略了从S到X的最短路径已经包含D的情况,这是我应用此算法的可能情况。在这种情况下,您将如何解决这个问题?

我尝试过一次幼稚的尝试,以在Yen的K最短路径算法的结果中寻找这样的路径。但我希望有一种更有效,更确定的方式来做到这一点。

再次指出,我并不一定要寻找从S到D到X的最短路径,而是任何无环路径,尽管最短路径会更好。

1 个答案:

答案 0 :(得分:3)

基本概念很简单;那么您就可以适应在X的最短剩余路径上循环进出的情况。

  • 从图形中删除D
  • 找到P1,这是从SX的最短路径。
  • D恢复到图形。
  • 删除P1中的所有节点。
  • 找到P2,这是从XD的最短路径。
  • 返回P1 + P2

这就是解决方案的要旨。

注意:您可能会发现删除P1会产生一个子图,而该子图没有D的剩余路径。在这种情况下,您将需要一种动态编程解决方案来搜索该想法以上,但具有回溯功能和另一种搜索P1个候选人的方法。

首次找到P1时,请确保要使用的节点在行程的第二段不会将XD隔离开。这将为您提供更快的搜索算法。

足够开始吗?


适应的需求来自这样的情况- 考虑图

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 XX to D)将另一个终端节点与{{ 1}}?在上面的示例中,您可以简单地切换过程:当X路径隔离S to X之后,重新开始:首先找到D,删除节点X to D,然后然后在其余图中找到1。 您是否还能找到该开关也不起作用的图形?

如果没有,您可以立即解决。如果是这样,您将需要处理更复杂的情况。

相关问题