Single Source shortest Path
Dijkstra - 指向和无向 - 仅适用于正边权重 - 周期??
贝尔曼福特指导 - 不存在循环All source shortest path
Floyd Warshall - 没有信息
Minimum Spanning Tree
(没有关于边缘权重或图形或周期性质的信息)
Kruskal的
Prim's - 无向
Baruvka的
答案 0 :(得分:4)
我不确定问题是什么,但是这里......
Dijkstra算法的经典实现只能处理正边缘权重,但有一种方法可以使它与负边缘成本一起工作。每当更新节点时,将更新的节点放回队列中。然而,这是否真的是Dijkstra或具有优先级队列的Bellman-Ford是有争议的。
例如,请考虑此图表:
1 - 2(100)
2 - 3(-200)
1 - 3(50)
3 - 4(100)
经典Dijkstra将设置D [1] = 0,D [2] = 100,D [3] = 50,D [4] = 150,D [3] = -100并停止。但是,当设置D [3] = -100时,将3添加回队列并继续算法。这将得到D [4] = 0,这是正确的。我不确定这是否被认为是“Dijkstra算法”。
至于Bellman-Ford,图表不一定必须指向,并且(负成本周期,其他周期没有任何差别)周期可以存在,只需确保您检测周期。从队列中n
次提取节点时会检测到一个循环,其中n
是节点数。您可以执行相同的检查以检测上面概述的“修改后的Dijkstra算法”中的循环。
Floyd Warshall - 节点数量的成本是立方的。对于除了非常小的图之外的任何东西都不够。它假定没有负成本周期,但您可以使用它来检测此类周期,请参阅wikipedia。
MST - 当边数接近O(n)而不是O(n 2 )时使用Kruskal。否则使用Prim。两者都适用于任何类型的图形,即使它们包含负边缘权重和周期。
我个人非常喜欢的另一种最短路径算法是Dial's algorithm。我喜欢把它想象成计算图表排序。另请阅读this rather exhaustive paper。
答案 1 :(得分:1)
A *(A star)可能是图算法中的最佳选择之一。但是,如维基百科文章中所述:
A *的时间复杂度取决于启发式。在最坏的情况下,扩展的节点数在解的长度(最短路径)中是指数的,但是当搜索空间是树时它是多项式的
意味着根据图形计算的时间并不总是相同的。