我必须使用图算法(dijkstra,BellManford,BFS)计算所有这些。任何人都可以建议我哪个是最好的*算法来实现这些。
*最好意味着最短的时间;复杂性
答案 0 :(得分:2)
这在很大程度上取决于您的数据。维基百科有pretty good overview种可用的不同算法,以及这些算法何时有用的线索。一个重要因素是您是否可以对边缘的权重进行一些限制。基本细分一般如下:
如果所有权重相同且为正,我们基本上希望使用最小数量的边来找到路径。在这种情况下,我们可以使用广度或深度优先搜索来查找O(E + V)时间内的单源最短路径。然后,这直接扩展到O(EV + V 2 )时间内的所有对。
对于单源最短路径问题,您可以使用Dijkstra's algorithm。使用正常的二进制堆,这会给您一个O((E + V)log V)的时间复杂度。使用Fibonacci堆,可以将其改进为O(E + V log V),这对于密集图表来说更快。
或者,有Gabow的缩放算法,其运行时间为O(E log R L)时间,其中R是E / V,L是最大长度边缘,但这个算法比Dijkstra的复杂得多。
为了找到一对顶点之间的最短路径,您可以使用A* algorithm(或其衍生物之一),但这取决于合适的启发式的可用性。
单源最短路径由Bellman-Ford algorithm求解,时间复杂度为O(VE)。
可以使用O {EV + V 2 log V)时间中的Johnson's algorithm来解决所有对最短路径。另外,有Floyd-Warshall algorithm,它在O(V 3 )中解决它:在密集图上通常更快。