2014-06-14

Dijkstra's Algorithm

Dijkstra's Algorithm是用來計算single-source最短路徑的演算法,
然而限制為Graph裡edge的weight不能是負值。



使用一個set S,裡面存一些node,
這些node代表已經確認、
從source到該node的最短距離值已經計算完成。
(也就是下圖中的黑點)

以及使用一個min-priority queue Q,
以每個node裡的值當做鍵值排序。
一開始除了source以外都是∞,
因此在程式碼第5行,s會最先被取出。


在第7行的for-loop中,
會更新每個與u相鄰的node的值,
而Q裡面node的排序也會跟著改變。

因為Q是min-priority queue,
所以在第5行,每次從Q取出的node,都是值最小的node,
然後在第6行把該node加入set S中。

換句話說,
每次都會取出目前值最小的node,
然後透過該node再去更新其他node與source的最短距離。

Introduction to Algorithms Fig. 24.6


(a)
一開始的圖,
source為s並初始化為0,其餘node皆初始化為∞。
表格中的數值,也就是node裡的值,
代表從source到該node的最短距離。

--------------
s  t  x  y  z
0  ∞  ∞  ∞  ∞
--------------

S = { }
Q = {s, t, x, y, z} (s.distance=0,其他的都是∞,假設使用字母順序排列)


(b)
此時Q裡第一個node是s,
因此由s去更新與s相連的node:t、y的值。

t = s + (s,t) = 0 + 10 = 10
y = s + (s,y) = 0 + 5 = 5

此時s已經加入set S中,
而Q裡面的排序也更新,
目前Q裡第一個node是值最小的y。
(藍色代表S裡的node,橙色代表Q裡值最小的node,也就是下次檢查此node的out edge)

--------------
s  t  x  y  z
0  10 ∞  5  ∞
--------------

S = {s}
Q = {y, t, x, z}


(c)
從Q裡取出y,並加入S,
接著由y去更新與y相連的node:t、x、z的值。

t = y + (y,t) = 5 + 3 = 8    <-- 因為8小於上次計算結果的10,因此把t的值更新為8
x = y + (y,x) = 5 + 9 = 14
z = y + (y,z) = 5 + 2 = 7

--------------
s  t  x  y  z
0  8  14 5  7
--------------

S = {s, y}
Q = {z, t, x}


(d)
--------------
s  t  x  y  z
0  8  13 5  7
--------------

S = {s, y, z}
Q = {t, x}


(e)
--------------
s  t  x  y  z
0  8  9  5  7
--------------

S = {s, y, z, t}
Q = {x}


(f)
--------------
s  t  x  y  z
0  8  9  5  7
--------------

S = {s, y, z, t, x}
Q = { }

因為Q已經是空集合,
程式碼的第4行測試失敗,
最短路徑計算完成。

沒有留言:

張貼留言