我对2节问题有疑问:
G =(V,E)是无向量的未加权图。 t,s是图中的节点。 e =(a,b)是图中的边缘。
1)建议一种有效的算法,检查 e 是否是从 s 到 t的所有最短路径的一部分
2)建议一种有效的算法,检查 e 是否是从 s 到 t的一个最短路径的一部分
我在论坛中看到解决第1部分的建议,使用Dijkstra算法两次,一次是给定边缘,一次是没有。然后你需要比较结果。 但是,我没有设法找到更有效的方法来解决第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 v
和v to u
边缘的有向图。
答案 1 :(得分:0)
问题2应该是使用Dijkstra算法的一次(修改)传递来解决的。
和以前一样,你将搜索空间的边界保留在优先级队列中,但是你还要添加一点信息,这是一个标志,表示通往边界的这一部分的路径是否通过了边缘问题。
s
在队列中,并且标志为false。e
时,该标志首次设置为true(即,如果您需要遍历e
以获得v
,那么在推送时v
1}}在队列中,将标志设置为true)。e
,则其标志设置为true,则使用 t
。