標籤:ase 開始 最小 最短路徑 min 利用 大於 路徑 a演算法
(一)單源最短路徑演算法
1. Dijksta演算法
要求圖G(V,E)的所有邊的權重都為非負值。
運用了貪心演算法的思想,但是較好地的是,其找到的解一定是最優解。
演算法主要思想:
用數組d[]表示開始節點A到其餘節點的路徑長度;用w(u,v)表示節點u到v的權值,若兩節點無直接路徑,則該值為無窮大;矩陣Q儲存每次迴圈每個節點的dv]值,總結點數為n。
初始時,開始節點到自身距離d[A]初值為0,到其餘節點d[V]初值為無窮大。
迴圈:對每個節點進行判斷,若d[v]大於d[u]+w(u,v),則令d[v]=d[u]+w(u,v),即進行一次鬆弛操作。一次操作後,選取本次迴圈中d[i]最小的節點i為下次迴圈的節點u,這也是貪心的思想所在,即每次迴圈選取路徑最短的節點為中間節點。
上述進行迴圈n-1次。
則d[v]為從初始節點到節點v的最短路徑。
時間複雜度:O(V.Texteact-min+E.Tdecrease-key)。
2. Bellman-Ford演算法
圖G(V,E)中的邊的權重可以為負值。
思想:
在上述Dijkstra演算法的思想上,增加了一個判斷是否有負環路的操作,如果有負環路,則表示該圖中不存在從初始節點到目標節點的最短路徑。
判斷是否存在負環路:鬆弛操作進行完後,判斷若d[v]>d[u]+w(u,v),則表示有負環路,報告錯誤。
時間複雜度:O(VE)。
(二)全源最短路徑演算法
3. Floyd-Warshall演算法
要求圖G(V,E)的所有邊的權重都為非負值。
思想:
用Ck(i,j)表示第k次迴圈後的矩陣C(i,j),k從1到n。
該演算法的架構為三層迴圈,最外層為迴圈次數,即一共產生n個矩陣C(,),裡面兩層迴圈即n=k時對C(,)進行遍曆填寫。
C(i,j)表的填寫為鬆弛操作:若C(i,j)>C(i,k)+C(k,j),則C(i,j)=C(i,k)+C(k,j)。
時間複雜度:O(n^3)。
4. Johnson演算法
圖G(V,E)中的邊的權重可以為負值。
思想:
對權重重新賦值,使其新的權重不小於0,且保持各該圖的最小路徑關係,再利用Bellman-ford演算法進行計算。
時間複雜度:O(VE+V^2LGV)。
匆忙寫的,難免有錯誤的地方,要是發現了歡迎指正。
圖論中四個最短路徑演算法