• 沒有找到結果。

簡介圖論演算法

N/A
N/A
Protected

Academic year: 2022

Share "簡介圖論演算法"

Copied!
12
0
0

加載中.... (立即查看全文)

全文

(1)

簡介圖論演算法

黃國卿

1736 年, 瑞士數學家尤拉解決了七橋問 題。 從此開啟圖論這門學問。 它與拓樸學、 代 數學、 組合數學等學科關係極為密切。 其應用 也極為廣泛, 已經滲透到物理學、 化學、 電子 學、 生物學、 經濟學、 系統工程及計算機科學 等學科領域。 基於上述原因, 引起了越來多的 人對圖論的興趣與重視。

圖論的問題, 基本上有兩大類, 一是存在 性問題, 一是最佳化問題。 本文所討論的都是 這兩類的例子。 1920年, 當電腦被引進後, 尤 其是演算法與圖論的結合, 更促進了圖論的 蓬勃發展。 我們將以一些例子說明如何利用 演算法解決圖論的問題。

什麼是演算法呢? 粗略地說, 一個 解決問題的方法就可稱之為演算法 (Algo- rithm)。 由於想借助電腦來幫我們計算, 所以 它的敘述方式很像電腦程式。 其結構大致分 為輸入、 執行步驟、 輸出三部份。

以下我們介紹本文會用到的一些圖論名 詞。 圖是由一些點 (有限或無窮), 及一些連 接兩點的邊所形成的, 記作 G; 圖的點所形 成的集合, 稱為點集, 記作 V ; 圖的邊所形 成的集合, 稱為邊集, 記作 E。 所以一個圖 可用 G = (V, E) 來表示。 如果限制兩點

之間最多只連一個邊, 這樣的圖稱為單圖。 本 文中的圖都是有限的單圖。 如果圖 H 滿足 V(H) ⊆ V (G) 且 E(H) ⊆ E(G) 則稱 H 是 G 的一個子圖。 如果 H 是 G 的子圖 且 V (H) = V (G), 則稱 H 是 G 的生成 子圖。 假設 v 是 G 中的一個點。 點 v 所連 的邊數稱為 v 的秩。 比較 G 中所有點的秩, 最大的秩數稱為 G 的最大秩, 記作 ∆(G)。

圖 G 中的一條路徑是一個有限非空的點和邊 的交錯序列, 其中的點兩兩不相同。 如圖一, P = ae1be5ce7d, 是一條 (a, d)- 路徑。 點 a 稱為起點, 點 d 稱為終點。 為簡化起見, 可將 它記為 P = abcd。 又 Q = abchia 也是一 條路徑, 但起點與終點相同, 這樣的路徑稱為 圈。 路徑 (圈) 的長度是指其所含的邊數。 如 P 的長度為3。 奇圈是指長度為奇數的圈, 如 Q = abchia; 偶圈是指長度為偶數的圈, 如 R= cdf gc。 假設點 x、 點 y 是圖 G 中的任 意兩點, 若存在一條 (x, y)- 路徑, 則稱 G 是 連通圖, 如圖一。 反之, 則稱 G 為非連通圖, 如圖二。

1

(2)

圖一

圖二

假設 G 是一個連通圖且 e 是 G 的一個邊。

如果 G 去掉 e 這個邊後形成一個非連圖, 則 稱 e 是 G 的一座橋, 如圖一中的 e11。 一 個不含有圈的圖稱為無圈圖, 而一個連通的 無圈圖稱為樹圖。 如圖三。

圖三

關於樹圖, 有個簡單的定理: 一個樹圖的點數 比邊數多一。 對 G 中的每一個邊 e 賦以一個 實數值 W (e), 此值稱為 e 的權值。 賦了權 的圖稱為賦權圖。 而一個子圖的權是指子圖

上所有邊的權值加總。

本文所敘述的演算法, 我們只說明想法, 證明則予以省略。 有興趣的讀者, 可自行試試 看或閱讀相關的參考書籍。

一、 圖的連通性

首先考慮如下的問題, 給定一個圖 G, 如何判斷 G 是否為連通圖, 換句話說, 對 G 中的任意兩點 x, y, 是否存在 (x, y)-路徑?

如果能畫出 G, 就很容易知道 G 是否為連通 圖。 如圖 1.1。 然而, G 的邊或點很多時, 想畫 出 G 會有些困難, 有時也不經濟。 不過, 可 透過電腦記錄圖 G (如記錄 G 的點邊關係)。

此時就需要用演算法來檢驗 G 的連通性。

圖1.1 (a) 連通圖

圖1.1 (b) 非連通圖

(3)

假設 G 有 n 個點, 檢驗 G 是否為連通 圖的想法如下。 任選一點 v 且標為1號。 然後 找出一個跟 v 相連且未標號的點, 如找到點 u。 將點 u 標為2 號並記錄 uv 這個邊。 從點 u 出發, 重覆前面的步驟, 直到找到一點 z 且 跟 z 相連的點均已有標號。 (此時, 已有標號 的點形成一條 (v, z)-路徑。) 這時, 找出標號 為 z 的前一號的點, 記作 α, 點 α 稱為點 z 的父親。 再從 α 出發, 繼續搜尋的步驟。 我 們總是可以重覆“往下”搜尋或往回走再繼續 搜尋的步驟, 直到所有標號 1, 2, 3, . . . , n 全 部用完或回到標號為1的點。 如果所有標號均 被使用過, 則 G 是一個連通圖, 如果還有點 尚未被標號, 則 G 是一個非連通圖。

上述的想法就是所謂深度搜尋 (Depth- First Search) 的主要精神。 在解決圖論的存 在性或最佳化問題時, 深度搜尋是一個簡單 且重要的演算法。 後面還會有例子介紹。

依據深度搜尋的想法, 演算法敘述如下。

深度搜尋演算法

輸入: n 個點的圖 G = (V, E) 步驟1: 任選一點 v, 令 k = 1。

ℓ(v) = k (點 v 的標號) S = {v} (收集已標過號的點) T = φ (收集作記錄的邊)

α= v (當作父親也就是開始搜尋的點)

步驟2: 令 k = k + 1。

(i) 如果 S = V , 則輸出結果。

(ii) 如果 S 6= V , 則考慮步驟 2.1 和

步驟 2.2兩種情形。

步驟2.1: 存在一點 u ∈ V \S 跟 α 相連, 令 ℓ(u) = k, S = S ∪ {u},

T = T ∪ {αu}, α = u, 重覆步驟 2。

步驟2.2: 所有 V \S 中的點都不跟 α 相 連。 如果 ℓ(α) = 1, 則輸出“G 是非 連通圖”。

如果 ℓ(α) > 1, 令 w 為α 的父親 且 α = w,

重覆步驟 2.1。

輸出: 所有點的標號及 T 。

我們以圖 1.1 來說明深度搜尋是如何執 行的。 假設從點 a 開始。 點 a 標為1號。 點 b 與點 a 相連且未標號, 點 b 標為 2 號且記錄 ab 這個邊。 依此類推, 點 c、 點 d、 點 e 分別 為標為 3、4、5號且記錄 bc、cd、de 三個邊。 此 時, 跟點 e 相連的點都已標號, 於是回頭看點 d。 同樣地, 跟點 d 相連的點也都已標號, 於 是回頭看點 c。 點 g 與點 c 相連且未標號, 點 g 標為 6 號並記錄 cg 邊。 重覆上述步驟, 直至點 j 標為 10號為止。 執行後的結果如圖 1.2。 其中圈號代表標號, 打勾代表所記錄的 邊。

如果圖 G 是連通圖, 觀察執行深度搜 尋演算法所記錄的邊, 可以發現由這些邊所 構成的圖會是 G 的一個生成樹。 從而我們可 證明下面的定理。

定理: 圖 G 是連通圖若且唯若 G 含有 一個生成樹。

(4)

圖1.2

圖1.3

二、 單行道問題

假設在某一城市中有一些重要的地點及

連接這些地點的雙向街道。 由於車輛的增加, 使得交通愈來愈擁塞且空氣污染亦愈形嚴重。

於是有人建議將所有街道都改成單行道以改 善交通狀況 (如台北市的公車逆向道就是一 個例子)。 由於從甲地到乙地的街道改成單向, 所以其他街道的行進方向就必須好好規劃才 能使乙地也能到達甲地。 於是問題就可簡化 成如何給這些街道一個方向才能使任意兩個 地點都能藉著這些單行道互相往返。 以圖論 的觀點來說, 給定一個連通圖, 是否能在每個 邊都給予一個指向使得任何一點都能藉著邊 的指向到達其他各點。 如果能辦得到, 則稱此 圖有一個強連通定向 (strongly connected orientation)。 觀察圖 2.1, 任何其他地點都 無法到達甲地, 而在乙地卻動彈不得! 所以街 道的方向並不能隨意指定。 觀察圖 2.2, e 這 個邊是圖的一座橋。 一旦給予 e 一個指向後, 如果

圖2.1

(5)

圖2.2

從甲地指向乙地, 則乙地不能到達甲地; 如果 從乙地指向甲地, 則甲地不能到達乙地。 於是 有橋存在的圖一定沒有強連通定向。 如果在 圖 2.2中加進一個邊, 如圖2.3, 則新的圖並沒 有橋而且存在一個強連通定向。 我們不禁會 問, 一個沒有橋的連通圖是否有一個強連通 定向呢? 這個答案是肯定的。 1939年, Rob- bins 證明了如下的定理。

定理: 圖 G 有一個強連通定向若且唯若 G 是一個沒有橋的連通圖。

圖2.3

事實上, 如果 G 是非連通圖, 則一定沒 有強連通定向。 所以只需考慮連通圖即可。 類 似圖 2.2 的說明, 如果一個連通圖有橋, 則一 定沒有強連通定向, 也就是說, 一個有強連通 定向的圖不會有橋的存在。 有待克服的是給

定一個沒有橋的連通圖, 如何給予每個邊一 個指向, 使之成為一個強連通定向。 這部份我 們可以用深度搜尋演算法加以解決。 首先對 一個沒有橋的連通圖, 利用深度搜尋演算法 將每一個點標號並且得到一個生成樹 T 。 其 次, 給每個邊一個指向。 任選一邊 e = ij, i, j 為標號且假設 i < j。 如果 e ∈ T , 則由 i 指 向 j; 如果 e 6∈ T , 則由 j 指向 i。 將所有邊 都給予指向後, 就得到圖的一個強連通定向。

再以圖 1.1(a) 為例, 執行上述的演算法, 所得結果如圖 2.4。

圖2.4

三、 圖的點著色 (Vertex Coloring)

圖的點著色是一個古典又有趣的課題, 它有極為廣泛的應用, 目前仍有很多人在研 究。 什麼是圖的點著色呢? 簡單的說, 就是對 圖的點著顏色。 基於實際的理由 (如一個人不 能在同一時間參加兩個會議), 還要要求任意 有邊相連的兩點不可以著相同顏色。 這樣的 一個著色方式稱之為圖的一個點著色法。 如

(6)

圖 3.1 和圖 3.2 各用了三個顏色。 如果每個點 都著不一

圖3.1 圖3.2

樣的顏色, 則一定是一個點著色法。 問題是給 定一個圖 G, 存在一個點著色法的最少顏色 數是多少呢? 這個數目稱為圖的點著色數, 記作 χ(G)。 求圖的點著色數是一個很難的 問題, 到目前仍尚未完全解決。 不過, 對一 些特殊類的圖, 則有不少的結果。 在此我們要 討論點著色數為 2的圖, 這類圖通稱為二部圖 (Bipartite graph)。

圖 3.2用了三個顏色, 不過, 如果以紅綠 兩個顏色依序對點著色就會是一個點著色法。

因此圖 3.2 是一個二部圖。 事實上, 所有的偶 圈都是二部圖。 而一個二部圖是否為偶圈呢?

答案是否定的。 如圖 3.3。

圖3.3

那麼如何判斷一個圖是否為二部圖呢? 圖 3.1 是一個長度為 5 的奇圈, 它的點著色數為 3。 其實, 所有奇圈的點著色數都是 3。 因此, 一個含有奇圈的圖, 其點著色數必定大於或 等於 3。 這保證此圖一定不是二部圖。 換句話 說, 一個二部圖一定不含有奇圈。 可是, 一 個不含奇圈的圖是否為二部圖呢? 1936 年, K¨onig證明了如下的定理。

定理: 一個圖 G 是二部圖若且唯若 G 不含有奇圈。

給定一個不含奇圈的圖, 要說明此圖是 二部圖, 其實就是要找一個恰好用兩個顏色 的點著色法。 這並不難做到。 任選一點 v, 著 紅色。 跟 v 相連的點著綠色。 假設 u 與 v 相 連, 則跟 u 相連的點都著紅色。 依此類推, 直 到所有的點都著了顏色。 如圖 3.4所示。

圖3.4

演算法要如何敘述呢? 因為只用兩個顏 色, 所以, 如果點 v 已著色, 則跟 v 相連的 點一定要著另一個顏色。 接下來, 該如何繼續 呢? 將跟 v 相連的點著色, 然後將這些點 依序放在一個叫做 queue 的地方, 記作 Q

(7)

(一個 queue 就像火車上放塑膠茶杯的管子, 先放進去的茶杯, 先拿出來使用)。 執行演算 法時, 先找出 Q 中的第一個點 v, 從 Q 中 去掉點 v, 再找出所有跟 v 相連且未著色的 點, 將這些點著跟 v 不同的顏色, 並依序放 在 Q 的末端。 重覆這樣的步驟直到所有的點 都著了顏色。

以 上 的 演 算 法 就 是 所 謂 的 廣 度 搜 尋 (Breadth-First Search) 的主要精 神。 它也常用來解決圖論的問題 (找一個連通 圖的生成樹也可以用廣度搜尋)。

依據上述的想法, 可將演算法敘述如下。

廣度搜尋演算法

輸入: 一 個 不 含 奇 圈 的 連 通 圖。

步驟1: 令 Q = φ。

步驟2: 任 選 一 點 v, 將 v 著 紅 色 並 放 進 Q 中。

步驟3: 令 u 是 Q 中 的 第 一 個 點。 從 Q 中 去 掉 u。

步驟4: 找 出 所 有 跟 u 相 連 且 未 著 色 的 點。 將 這 些 點 著 綠 色 並 把 這 些 點 依 序 放 在 Q的 末 端。

步驟5: 如 果 所 有 點 都 已 著 色, 則 輸 出 結 果。 否 則, 重 覆 步 驟 3。

我 們 用 圖 3.5 及 表 3.1 來 說 明 執 行 廣 度 搜 尋 演 算 法 的 過 程 和 最 後 結 果。

圖3.5

Q中 的 第 一 個 點 點 著 色 Q a(紅) a a b, e(綠) b, e b c, f(紅) e, c, f

e c, f

c d, g(綠) f, d, g f i(綠) d, g, i d h(紅) g, i, h

表 3.1

四、 最小生成樹 (Minimum Spanning Tree)

假設電信總局要在全省設立 30 家電信 局及舖設通訊電纜。 試問, 電信總局應如何 舖設電纜才能使任兩家電信局都可互通訊息 (可透過轉接) 且經費花費最少? 如果不怕 浪費的話, 任意兩家電信局之間都可舖設電 纜, 問題就解決了! 只不過, 這樣做, 納稅人 一定會抗議得沒完沒了! 有沒有更好的辦法 呢? 針對問題, 我們可以構造一個賦權圖再

(8)

加以討論。 令圖的點集是由所有的電信局所 構成, 任意兩點連一個邊並在邊上給一個權 值, 也就是造價 (造價太高的邊, 可以不予考 慮)。 這樣就構成了一個賦權圖。 重點有兩項, 一是連通性, 要保留多少邊才能保持連通性;

一是經費, 在連通性的要求下, 要保留那些邊 才能使經費花費最小。 由圖論的定理得知, 一 個 n 個點的連通圖至少要 n − 1 個邊, 而 一個 n 個點的樹圖恰有 n − 1 個邊。 再利 用例子一的定理, 只要找到一個生成樹就能 保持圖的連通性。 把生成樹上的權值加總, 就 是所需的經費。 直覺上, 考慮所有可能的生成 樹, 找出一個經費最少的生成樹, 問題就解決 了。 可不可行呢? 1857年, Cayley證明了如 下的定理。

定理: 設 n ≥ 2。 則不一樣的 n 個點的 樹圖共有 nn−2 個。

由上面的定理得知, 需要考慮的生成樹 共有 3028 個! 這是一個天文數字, 用最快速 的電腦也沒辦法檢驗。

我們的例子, 就是所謂的最小生成樹問 題。 1956 年, Kruskal 解決了這個問題。 主 要的想法是從邊著手。 給定一個 n 個點的連 通賦權圖, 首先找一個權值最小的邊, 放進 T 中, ( T 是用來記錄最小生成樹的邊)。 在執 行 Kruskal 演算法過程中, 假設 T 中已選 了一些邊, 如果 T 中的邊數是 n − 1 , 則 T 就是一個最小生成樹; 如果 T 中的邊數小於 n− 1, 則在 T 以外找一個權值最小的邊並 且此邊加入 T 後不會產生圈 (因為樹不含有 圈)。 將這個邊放進 T 。 重覆上述的步驟, 直到

T 含有 n−1 個邊。 為了簡化找邊的步驟, 一 開始就可將所有的邊依權值由小而大作排列 (若權值相同, 誰先誰後則無所謂), 接下來只 要依序選邊並檢驗 T 是否含有圈即可。

Krukal 演算法

輸入: 一個 n 個點、 m 個邊的連通賦權圖。

步驟1: 設 w(e1) ≤ w(e2) ≤ . . . ≤ w(em) 令 T = φ (T 用來記錄最小生成樹的 邊)

t= 0 (t 用來計算 T 中的邊數) k= 0 (檢驗第 k 個邊)

步驟2: 令 k = k + 1 步驟2.1:

(i) 如果 T ∪ {ek} 不含圈,

令 T = T ∪ {ek}, t = t + 1。 接步 驟 2.2。

(ii) 如果 T ∪ {ek} 含有圈, 則重覆步驟 2。

步驟2.2:

(i) 如果 t = n − 1, 則計算 w(T ) 並輸 出結果。

(ii) 如果 t < n − 1, 則重覆步驟 2。

輸出: T 及 w(T )。

我們以圖 4.1、 圖 4.2 及表 4.1 來說明 Kruskal 演算法的執行過程和最後結果。 首 先邊的排序為 ab, bc, de, f g, ad, be, dg, ce, bd, cf, eg, ef 。

(9)

圖4.1

ek T t

φ 0

ab {ab} 1

bc {ab, bc} 2 de {ab, bc, de} 3 f g {ab, bc, de, f g} 4 ad {ab, bc, de, f g, ad} 5

be 造成圈 5

dg {ab, bc, de, f g, ad, dg} 6 表4.1

圖4.2 w(T ) = 17

1957 年, Prim 用另一種想法也解決了 最小生成樹問題。 主要的想法是由一點開始,

逐次加點、 加邊, 使之“長成”最小生成樹。 首 先, 任選一點 v, 令 B = {v}, T = φ。 在 執行 Prim 演算法過程中, 假設 B 中已有一 些點, T 中已有一些邊。 如果 B = V , 則輸 出 T 及 w(T )。 如果 B 6= V , 則找出一個權 值最小的邊 uv 且 u 6∈ B, v ∈ B。 將點 u 放進 B, 邊 uv 放進 T 。 重覆上述步驟, 直到 B = V 。

Prim 演算法

輸入: 一個連通賦權圖 G = (V, E)。

步驟1: 令 T = φ (T 用來記錄最小生成樹 的邊)。

任選一點 v, 令 B = {v} (B 用來 記錄T 中的點)。

步驟2:

(i) 如果 B = V , 則計算 w(T ) 並輸出 結果。

(ii) 如果 B 6= V , 找出 u 6∈ B, v ∈ B 且權值最小的邊vu。

令 B = B ∪ {u}, T = T ∪ {uv}。

重覆步驟 2。

輸出: T 及 w(T )。

(10)

uv B T

{a} φ

ab {a, b} {ab}

bc {a, b, c} {ab, bc}

be {a, b, c, e} {ab, bc, be}

de {a, b, c, d, e} {ab, bc, be, de}

dg {a, b, c, d, e, g} {ab, bc, be, de, dg}

f g {a, b, c, d, e, f, g} {ab, bc, be, de, dg, f g}

表4.2

再以圖 4.1 為例, 我們用表 4.2 及圖 4.3 來說明 Prim 演算法的執行過程和結果。

圖4.3 w(T ) = 17

在 Prim 演算法中, 因為是由小樹長成 大樹, 所以少了檢驗 T 是否有圈的步驟, 不 過卻多了選邊的步驟。 在 Kruskal 演算法中, 有檢驗 T 是否有圈的步驟, 但因為邊已依序 排好, 所以少了選邊的步驟。 兩個演算法各有 所長。 選擇上, 如果邊數多, 就用 Prim 演 算法; 如果邊數少, 就用 Kruskal 演算法。

(Prim 演算法早在1930年便由 Jarnik 所發 現, 當時是發表在捷克的雜誌上, 因此很少人 注意到。)

五、 最短路徑

「從 台 北 到 巴 黎, 怎 樣 的 行 程 最 省 時?」「從台南到花蓮, 怎樣的行程最省錢?」

「從台大到中研院, 怎樣走最快?」 等等, 都是 最短路徑問題。 以第一個問題為例, 將地球上 的城市當成點, 若兩個城市間有飛機直航, 就 連一個邊, 並註明飛航時間, 於是就構成了一 個賦權圖。 假設 P 是一條從甲城市到乙城市 的一條路徑, 定義 P 的長度為 P 上的所有 權值的和, 記作 ℓ(P )。 而從甲城市到乙城市 的最短路徑長度記作 d(甲, 乙)。 那麼我們就 是要求 d(台北, 巴黎) 的值。

以圖 5.1 為例, 若 P = xaby, 則 ℓ(P ) = 7。 若 Q = xcdby, 則 ℓ(Q) = 6。 其實 Q 是一條最短 (x, y)-路徑, 所以 d(x, y) = 6。 當然, xedby, xcby 也都是最 短的 (x, y)-路徑。

圖5.1

一般而言, 一個連通賦權圖的最短路徑 問題有三類:

(1) 給定兩點 u, v, 求 d(u, v)。

(2) 給定一點 v, 求點 v 到其他點的最短路 徑。

(3) 求任兩點之間的最短路徑。

(11)

實際上, 只要考慮問題 (2) 即可。 因為 問題 (1) 是問題 (2) 的特例, 而問題 (3) 只 要重覆利用解決問題 (2) 的方法即可。 Dijk- stra 在 1959 年解決了問題 (2)。 主要想法如 下。

假設 S & V 且 x ∈ S。 令 S = V \S。

如果 P = x · · · uv 是一條從 x 到 S 的 最短路徑, 則 u ∈ S 且 x · · · u 是一條 從 x 到 u 的最短路徑。 於是 d(x, v) = d(x, u) + w(uv)。 因此

d(x, S) = min

u∈S v∈S

{d(x, u) + w(uv)} (5.1)

Dijkstra演算法就是由式子 (5.1) 發展而得。

首先, 令 S0 = {x}。 由式子(5.1) 得知, d(x, S0) = min

u∈S0

v∈S0

{d(x, u) + w(u, v)}

= min

v∈S0

{w(xv)}

= min

xv∈E{w(xv)}

於是 d(x, S0) 很快就可得到。 假設 u1 ∈ S0 且 d(x, u1) = d(x, S0)。 令 S1 = {x, u1}, P1 = xu1。 很明顯地, P1 是一個 最短的 (x, u1)-路徑。 重覆上述的步驟, 假設 Sk= {x, u1, u2, . . ., uk} 且對應的最短路徑 為 P1, P2, . . . , Pk。計算 d(x, Sk)。 從 Sk 中 找到一點 uk+1, 使得

d(x, uk+1) = d(x, Sk) = d(x, uj)+w(ujuk+1), 其中 uj ∈ Sk。 而最短的 (x, uk+1)-路徑 Pk+1 則可由 Pj 再延伸邊 ujuk+1 即可。 重 覆上述步驟, 直到找出所有以點 x 為起點的 最短路徑。

其實, Dijkstra 演算法的第一步是找所 有以點 x 為起點的路徑中長度最短的路徑, 假設找到 P1。 則 u1 就是 P1 的終點。 令 S1 = {x1, u1}。 接下來找出以點 x 為起點, 以 S1 中的點為終點的路徑中長度最短的路 徑, 假設找到 P2。 則 u2 就是 P2 的終點。 依 此類推。 由於每次找到的終點都不一樣, 所以 就可求出點 x 到其他點的最短路徑。 在找終 點的過程中, 可以利用已找到的最短路徑, 以 節省時間。 另一方面, 它並不是固定某一點當 終點再找最短路徑, 而是以路徑的長度來考 量該選那一點當終點。 這是所謂 greedy 演 算法的主要精神所在。 順便一提, Kruskal演 算法和 Prim 演算法都是 greedy 演算法。

Dijkstra 演算法

輸入: 一個 n 個點的連通賦權圖 G = (V, E)及點 x。

步驟1: 令 k = 0 (用來表示已找到了 k 個 點) d(x, x) = 0, Sk= {x}。 (Sk

用來記錄已找到的點)。

如果 xv 6∈ E, 令 d(x, v) = ∞。

步驟2: 如果 k = n − 1, 則輸出結果。

如果 k < n − 1, 考慮所有不在 Sk

中的點 v。

令 d(x, v)

= min{d(x, v), d(x, uk)+

w(ukv)} 找出點 uk+1 使得 d(x, uk+1) = minv6∈Sk{d(x, v)}

令 Sk+1 = Sk∪ {uk+1}, k = k + 1。

重覆步驟 2 輸出: 所有的 d(x, v)。

(12)

我們以圖 5.2來說明 Dijkstra 演算法的 執行過程。

圖5.2

1. S = {x}。 d(x, x) = 0, d(x, y) = 3, d(x, z) = d(x, u) = d(x, v) =

∞, d(x, p) = 10, 將點 y 放進 S。

2. S = {x, y}。

d(x, y) = 3,

d(x, z) = min{∞, 3 + 2} = 5 d(x, u) = min{∞, 3 + 7} = 10, d(x, v) = min{∞, 3 + 4} = 7, d(x, p) = min{10, 3 + 6} = 9 將點z放進S。

3. S = {x, y, z}。 d(x, z) = 5, d(x, u) = min{10, 5 + 1} = 6, d(x, v) = min{7, 5 + ∞} = 7, d(x, p) = min{9, 5 + ∞} = 9, 將點 u 放進 S。

4. S = {x, y, z, u}。 d(x, u) = 6, d(x, v) = min{7, 6 + 2} = 7, d(x, p) = min{9, 6 + ∞} = 9, 將點 v 放進 S。

5. S = {x, y, z, u, v}。 d(x, v) = 7, d(x, p) = min{9, 7 + 3} = 9, 將點 p 放進 S。

最後結果為 d(x, x) = 0, d(x, y) = 3, d(x, z) = 5, d(x, u) = 6, d(x, v) = 7, 最短路徑如圖 5.3所示。

圖5.3

參考資料

1. J. A. Bondy and U.S.R Murty, “Graph Theory with Applications”, 1976.

2. G. Brassard and P. Bratley, “Algorith- mics”, 1988.

3. G. Chartrand and C. R. Oellermann,

“Applied and Algorithmic Graph The- orey”, 1993.

4. M. Gondran and M. Minoux, “Graphs and Algorithms”, 1984.

5. R. P. Grimaldi, “Discrete and Combi- natorial Mathematics”, 1994.

6. F. S. Roberts, “Applied Combina- torics”, 1984.

—本文作者任教於靜宜大學應用數學系—

參考文獻

相關文件

因交通部公路總局通知,於101年06月15日AM08:00起,將針對台中市

ETC用路人,使用電子收費車道,上高速公路前應確認ETC「車內

 另一個較可能被交通工程人員所採取的措施 乃是「單行道管制」,此因在單行道系統中 運行的左轉車流是不會遭遇到對向車流的干

緊接著第二段開始描述表演者表演的過程。首先, 「戲人以二席置街上,持一升入桶中」 ,由 此可看出表演魔術的場地就在街道上,

國道三號到燕巢系統下交流道→上國到十號到在燕巢出口下 交流道→於旗楠公路/鳳東路/台 22 線向左→於角宿路/186 縣道向右轉→於高鐵總廠路/高 36 鄉道向左轉→於海峰路/高 36 鄉道向左轉→於通燕路/高

道德決策者本身必須意識 ( 知覺 ) 到道德問 題,產生道德感受與認知,才會有後續的判斷

中山高→建國高架道路→辛亥路→興隆路: 中山高往台北方向轉建國高架道路於辛亥路交流道下,下 交流道後直行辛亥路於興隆路左轉後約

A1: 資訊系統的操作對於我們來說友善程度沒有那麼高,雖然它每年持 續的在改進啦,其實大家都知道 TIMS 非常的難用,從以前就通道說 TIMS