所有代码详见:https://github.com/jingminglake/Leetcode
总体思路
最短路径问题
N表示节点数量,E表示边的数量。
-
单源最短路径,且没有负权边 使用Dijkstra。 普通情况下,时间复杂度O(N^2)。 如果图的边数较少,那么使用Dijkstra堆优化版本。时间复杂度O(ElogE) 一般来说,边不算多,直接使用堆优化版。
-
单源最短路径,有负权边,但没有负权回路 使用Bellman-Ford。时间复杂度O(N * E)。
如果图的边数比较少,那么使用BellmanFord的队列优化版本SPFA。时间复杂度O(K * N)。一般来说,K比E小。
-
多源最短路径 使用Floyd。时间复杂度O(N^3)。
-
点到点最短路径 使用BFS。再BFS的基础上,进行A star。A star的时间复杂度不确定,最坏情况下,A * 退化成BFS,时间复杂度O(N^2),
最好情况下,是从起点直接到终点,时间复杂度为 O(dlogd),d 为起点到终点的深度。