1. 程式人生 > >Floyd最短路算法的解釋.

Floyd最短路算法的解釋.

bsp 先後 結點 優化 ini 空間 計算 方程 適用於

適用於有向/無向圖,本質上是一個動態規劃.

D[k][i][j]代表經前k個結點中轉,i到j的距離.可以寫出方程:

D[k][i][j]=min{D[k-1][i][j], D[k-1][i][k]+D[k-1][k][j]}.

比如一個路徑5->1->4->2->3.

k=1時,算出了5->4的最短路.k=2時,計算了4->3,k=3時,無改變.k=4時,計算5->3,k=5,無改變.

最後,算出了5->3的最短路.

觀察這個過程,發現路徑中的任意一個結點,何時經過它來優化最短路,它出現的先後順序,完全無所謂.即無後效性.

而這個狀態轉移方程可以用流動數組原理優化.在空間縮減一維.

程序寫為:

for (int k=0; k<n; k++)
    for (int i=0; i<n; i++)
        for (int j=0; j<n; j++)
            if (D[i][k] + D[k][j] < D[i][j])
                D[i][j] = D[i][k] + D[k][j];

Floyd最短路算法的解釋.