以下兩段選自:Dijkstra算法和Floyd算法對比分析
Dijkstra算法本質上是貪心算法,下一條路徑都是由當前更短的路徑派生出來的更長的路徑。不存在回溯的過程。如果權值存在負數,那么被派生出來的可能是更短的路徑,這就需要過程可以回溯,之前的路徑需要被更短的路徑替換掉,而Dijkstra算法是不能回溯的。它每一步都是以當前最優選擇為前提的。所以,按照Dijkstra的算法邏輯,它是不能計算負權圖的。
Floyd算法實際上是一個動態規划算法。 每一個點對u和v之間的最短路徑,可能會經過N個點,這些中間點記為k。 假定u到k之間的最短路徑已經找好,k到v之間的最短路徑已經找好,那么求u到v之間的最短路徑,就是遍歷各個可能的k點,然后求(u,k)+(k,v)之間的最小值。 所以這實際上將大規模的問題自頂向下划分為了小規模的問題,這就是動態規划思想。因為動態規划是可以回溯的,它可以計算負權圖。
---------分割線君-----------
Dijkstra算法和Floyd算法的區別之處:
總結來說就是
1.Dijkstra不能處理負權圖,Flyod能處理負權圖;
2.Dijkstra處理單源最短路徑,而Flyod是處理多源最短路徑
這個區別有個博主寫的特別好,生動又形象,來吧!傳送門:最短路徑——Dijkstra算法和Floyd算法
3.Dijkstra時間復雜度為O(n^2)
Flyod時間復雜度為O(n^3) 空間復雜度為O(n ^ 2)
=>題目中如果是單源點正權圖,就用Dijkstra,如果是任意兩個點之間的最短路徑或者是負權圖,就用Floyd
