加权有向图中两个节点之间的距离

时间:2014-05-30 05:44:27

标签: algorithm graph shortest-path

哪种算法最适合搜索正加权有向图中两个节点之间的最短距离?

我知道dijkstra是一个选项,但它从src计算到所有节点。和Floyd-Warshall一样。

另外一个问题。对于作为源和目标的节点,我需要一个距离。

例如:

src - F,dest - F. 我需要它在这个例子中计算2.45,而不是像dijkstra得到的那样。我可以修改dijkstra吗? 我已经实现了这个http://www.vogella.com/tutorials/JavaAlgorithmsDijkstra/article.html

graph http://www.math.cornell.edu/~numb3rs/blanco/net_dif.png

1 个答案:

答案 0 :(得分:4)

如果A是找到从一个顶点到另一个顶点的最短路径的算法,并且B是用于找到顶点和所有其他节点之间的最短路径的算法,则事实证明A的最佳复杂度并不优于最优路径。 BIe的复杂性您无法计算到单个顶点的路径,您还必须计算到所有其他节点的路径。简单来说,如果您甚至不知道到其他节点的路径,如何确定找到最短路径?

然而,即使没有比算法B更好的复杂度的算法A,A的特定实现可能比B的实现更优化,直到恒定因子。在正边缘的情况下,可以在放宽目标顶点时停止Dijkstra算法。但在最坏的情况下,您可能仍需要处理所有顶点。

如果您有负边缘,这种优化是不可能的,但Dijkstra算法也无法处理这种情况。对于这种情况,您需要Bellman–Ford算法。

Floyd-Warshall在这里太过分了,你显然不需要从所有顶点到所有其他顶点的路径。所以Dijkstra是我要走的路。如果您正在寻找最佳复杂性,可以使用基于堆的实现,甚至是Fibonacci堆。所有案例的复杂性在wiki page for Dijkstra algorithm中给出。还指出:

  

这[Dijkstra with Fibonacci heaps]渐近是已知最快的单源最短路径   具有无界非负的任意有向图的算法   权重。

所以你不应该费心找到任何渐近更好的算法。