(一)單源最短路徑算法
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)。
匆忙寫的,難免有錯誤的地方,要是發現了歡迎指正。