2014-06-14

The Floyd-Warshall Algorithm

Floyd-Warshall演算法是用來計算all-pairs的最短路徑,
考慮的是從vertex i直接到vertex j的距離,
以及vertex i經過一些中介點vertex k到vertex j的距離,
去判斷哪個距離比較短。





用dij(k)表示從vertex i到vertex j的最短路徑距離,
而所有中介點都在set {1,2,...,k} 之內。
之後要計算矩陣D(1)、D(2)、...D(n)
最後D(n) = (dij(n))可以得到最終答案:dij(n) = δ(i,j) for all i,j∈V

而最後為了印出shortest path,
我們還必須記錄每個點的祖先(predecessor)。











定義πij(k)為vertex j的祖先,
其中vertex i經過一些中介點抵達vertex j為最短路徑,
而所有中介點都在set {1,2,...,k} 之內,
之後要計算矩陣Π(1)、Π(2)、...、Π(n)

簡單來講,
就是每當D(k)(i,j)有改變時,就更新Π(k)(i,j)為Π(k-1)(k,j)。

(註:在本篇文章中,我使用D(k)(i,j)代表課本的dij(k)、Π(k)(i,j)代表課本的πij(k)



Introduction to Algorithms Fig.25.1 & Fig. 25.4























































用往前查表的方式填矩陣。(dynamic programming)

k為中介點
D(k)(i,j) = min {D(k-1)(i,j)D(k-1)(i,k) + D(k-1)(k,j)}
                   直接去          先經過k再去
                   (i->j)         (i->k->j)

例:
D(1)(4,5)
= min {D(0)(4,5),D(0)(4,1) + D(0)(1,5)}
= min {∞,-2} = -2
因為D(1)(4,5) ≠ D(0)(4,5),
所以要更新Π(1)(4,5) = Π(0)(1,5) = 1

例:
D(3)(4,2)
= min {D(2)(4,2),D(2)(4,3) + D(2)(3,2)}
= min {5,-1} = -1
更新Π(3)(4,2) = Π(2)(3,2) = 3

例:
D(5)(1,3)
= min {D(4)(1,3),D(4)(1,5) + D(4)(5,3)}
= min {-1,-3} = -3
更新Π(5)(1,3) = Π(4)(5,3) = 4


※Floyd-Warshall演算法的應用:Transitive Closure of a Directed Graph

沒有留言:

張貼留言