圖論中四個最短路徑算法


(一)單源最短路徑算法

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)。

 

匆忙寫的,難免有錯誤的地方,要是發現了歡迎指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM