图中的最短路径

时间:2014-06-11 16:08:11

标签: algorithm dijkstra shortest-path

我对2节问题有疑问:

G =(V,E)是无向量的未加权图。 t,s是图中的节点。 e =(a,b)是图中的边缘。

1)建议一种有效的算法,检查 e 是否是从 s t的所有最短路径的一部分

2)建议一种有效的算法,检查 e 是否是从 s t的一个最短路径的一部分

我在论坛中看到解决第1部分的建议,使用Dijkstra算法两次,一次是给定边缘,一次是没有。然后你需要比较结果。 但是,我没有设法找到更有效的方法来解决第2节。我想这是可能的,但我不知道如何。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

实际上对于未加权的无向图,你不需要使用Dijkstra,一个简单的BFS就可以达到目的

以下方法检查e是否是至少一个从s到t的最短路径的一部分:

计算从s到e的最短路径以及从e到t的最短路径

如果这两条路径的长度之和等于从s到t的最短路径,则e是从s到t的至少一条最短路径的一部分。

s -----> e -------> t

如果您想知道e是否是从s到t的恰好一个最短路径的一部分,那么此外,以下链接可能会有所帮助。它涉及有向图,但我们的无向图可以被认为是具有u to vv to u边缘的有向图。

How to find the number of different shortest paths between two vertices, in directed graph and with linear-time?

答案 1 :(得分:0)

问题2应该是使用Dijkstra算法的一次(修改)传递来解决的。

和以前一样,你将搜索空间的边界保留在优先级队列中,但是你还要添加一点信息,这是一个标志,表示通往边界的这一部分的路径是否通过了边缘问题。

  • 最初,只有顶点s在队列中,并且标志为false。
  • 如果从队列的头部弹出,则该标志被传播(保持为真)。
  • 每当遍历边e时,该标志首次设置为true(即,如果您需要遍历e以获得v,那么在推送时v 1}}在队列中,将标志设置为true)。
如果从堆栈中弹出目标e,则其标志设置为true,则使用

t