图中单一来源到单一目的地的最短路径

时间:2012-04-07 11:07:18

标签: algorithm shortest-path

我的图形中不包含将顶点连接到自身的边缘。两个顶点之间只有一条边。从Wikipedia开始,我了解了一些用于根据给定条件计算最短路径的算法。其中一个最着名的算法是Dijkstra's algorithm,它找到从源顶点到图中所有其他顶点的最短路径。
但是通过使用Dijkstra's algorithm,我没有必要探索所有顶点,但我的目标只是找到从单一来源到单一目的地的最短路径。我应该在这里使用哪种策略?所以我不需要探索所有其他顶点。

我的一种方法是使用bidirectional bfs。到bidirectional bfs我的意思是从bfs应用两个source node,从destination node应用另一个child。当我第一次在两个树中找到任何相同的bfs时,我可以同时停止union。现在,从源到孩子bidirectional bfs路径从孩子到目的地的路径将是是我从源头到目的地的最短路径。

但是,维基百科和{{1}}所描述的所有方法中,哪种方法最适合我的图形?

4 个答案:

答案 0 :(得分:4)

这取决于您是否可以使用任何明显的启发式功能,或者如果您没有关于图表的任何其他可用信息。

您的选择是:

  • BFS:一般情况下或者你不关心计算时间那么多。
  • Dijkstra(Dijkstra“是”具有优先级队列的BFS):如果你的边缘有权重/价格(非负),你关心CPU时间。
  • A *(A *“是具有启发函数的Dijkstra - 例如城市地图上的距离):如果你希望它在平均情况下非常快,但你必须提供良好的启发式功能。

对于某些图形问题,可以使用动态编程或其他算法工具。这取决于具体情况。更多信息可以在http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=alg_index ...

的教程中找到

答案 1 :(得分:1)

从简介到算法(CLRS)第二版,第581页:

针对给定顶点uv,找到从uv的最短路径。如果我们用源顶点u解决单源问题,我们也解决了这个问题。此外,在最坏的情况下,没有已知的算法可以比最好的单源算法渐近地运行。

所以,坚持使用Dijkstra的算法:)

答案 2 :(得分:1)

Wikipedia文章为您解释了答案:

  

如果我们只对顶点源和目标之间的最短路径感兴趣,如果u = target,我们可以在第13行终止搜索。

答案 3 :(得分:0)

您可以使用Dijkstra的算法并以您停止探索已经超过目前为止最短的路径的方式对其进行优化。因为它们不会更短(假设你的边缘没有负重)。