Dijkstra的算法仅在您只有一个来源并且想知道从一个节点到另一个节点的最小路径时使用,但是失败[在具有负边的图中]
Dijkstra的算法是单源最短路径或SSSP算法的一个示例。每种SSSP算法都会计算从选定源节点到图中每个其他节点的最短路径距离。而且,它以根树的形式计算从s到其他节点的所有最短路径的紧凑表示。在Wikipedia代码中,是此树中v的父级。ssprevious[v]
v
Dijkstra算法在具有负边的图中的行为取决于所讨论的精确变体。该算法的某些变体(例如Wikipedia中的变体)始终运行很快,但在存在负边缘时无法正确计算最短路径。其他变体(如本讲义中的变体)始终正确计算最短路径(除非从源可到达负循环),但如果存在负沿,则在最坏情况下可能需要指数时间。
当所有节点中的任何一个都可以作为源时,将使用Floyd-Warshall算法,因此您希望从任何源节点到任何目标节点的距离最短。这仅在存在负循环时失败。
没错 Floyd-Warshall是全对最短路径算法的一个示例,这意味着它计算了每对节点之间的最短路径。另一个示例是“对于每个节点v,以v作为源节点运行Dijkstra”。还有其他几个。
当只有一个来源时,使用Bellman-Ford就像Dijkstra一样。这可以处理负重,并且其工作原理与弗洛伊德·沃歇尔的相同,除了一个来源,对吗?
Ø (V3)Ø (V2Ë)Ø (VË)
有关更多详细信息,请查阅您最喜欢的算法教科书。(您有一本最喜欢的算法教科书,不是吗?)