• 沒有找到結果。

建中資訊科校內培訓講義– 圖論

N/A
N/A
Protected

Academic year: 2023

Share "建中資訊科校內培訓講義– 圖論"

Copied!
12
0
0

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

全文

(1)建中資訊科校內培訓講義 – 圖論 CK6207 楊鈞百. 2-4 特殊路徑與迴路 這一節要介紹的是幾種特殊的路徑和迴路,其中包括在一開始提到的 Königsburg 七橋問 題所衍生出的尤拉路徑(Eulerian Path)以及尤拉迴路(Eulerian Circuit),以及同是經典迴路之 一的漢米頓迴路(Hamiltonian Circuit)以及其對應的漢米頓路徑(Hamiltonian Path)。 這些經典的特殊路徑或迴路都是很重要的,請大家務必了解、明白其特殊性質。. A.. 尤拉路徑 及 尤拉迴路 (Eulerian Path, Eulerian Circuit). I. 基本概念 所謂的尤拉路徑(Eulerian Path) 是指一條經過圖中每一條邊皆恰好一次的路徑,而類似 地,尤拉迴路(Eulerian Circuit, 或稱 Euler Tour)則是一條起點與終點重合的尤拉路徑,若存 在這樣的一個 Cycle,則該圖被稱為 Eulerian 或 unicursal。 II. 性質 1. 尤拉路徑: a.如果是無向圖,則它要是連通的而且最多只能有兩個奇數分支度的點。 b.如果是有向圖,則只有在恰好有一個點入分支度比出分支度多一、有一個點出分 支度比入分支度多一時,或者是所有的點的出分支度皆等於入分支度時,該圖才 存在尤拉路徑,當然,該圖必須連通。 2. 尤拉迴路: a. 如果是無向圖,則它要是連通的而且圖中每一個頂點的分支度都必須是偶數。 b.如果是有向圖,則必須要連通且所有點的出分支度皆等於入分支度。 III. 演算法 由上面所提到的,我們可以知道對於這類問題可以藉由兩個條件分類,一為「路徑」或 是「迴路」,二是對象為「有向圖」或「無向圖」,因此共可以分為四大類,在此,我們特 別舉出「在無向圖中找尤拉迴路」的方法。 那我們該怎麼找出要求的尤拉迴路呢? 首先,假如我們已經確定有一圖 G 存在著尤拉迴路(即該圖為 Eulerian),則我們觀察到: 1. 尤拉迴路可以由任意點開始。 2. 若我們由點 v 開始對圖 G 作 DFS 遍歷,則當走到死路時,該點必為 v。 3. 假設完整尤拉迴路的邊序列為 SE,若我們將其中連續一段的子尤拉迴路刪 除,剩餘下來餘序列 (Complement Sequence) SEC 仍是由一個或多個尤拉迴 路所組成。 知道了這些特性後,我們便可以很簡單的得到一個在無向圖中找出尤拉迴路的演算法: 我們可以從圖中的任意一點出發作 DFS 遍歷,途中記下經過的那些邊。之後當遇到死路(無 法再移動)時,在回溯的過程中輸出剛剛所經過的那些邊。如此這般地作下來,當完成整個圖 的 DFS 遍歷時,我們所輸出的邊序列即為一個合法的尤拉迴路序列。 而至於這個記錄邊的步驟,我們可以用堆疊(Stack)來實作。 12 | 頁.

(2) 建中資訊科校內培訓講義 – 圖論 CK6207 楊鈞百. VI. 虛擬碼 Function Find_Eulerian_Circuit ( Graph G, bool[ ] Visited, stack Stack, List Circuit ) 1 2 3 4 5 6 7. Clear List Circuit. Set Visited[ ] all False. For v, all vertices in G If Visited[v]=False Then start DFS G from v, and record the edges which were visited during the DFS. Add the edges in Stack one by one to List Circuit. End If.. 由於圖中的每條邊皆恰經過一次,故這個演算法的複雜度為 O(E)。 § After Story: 在尤拉的解釋之下,著名的七橋問題得到了解決:在 Königsburg 當地的配置下,是不存在一 條尤拉迴路的。當然,這樣的結果不免讓一些一直期待能夠一次走遍所有橋的人感到惋惜,因此,之後 Königsburg 當局還特地建立了第八座橋,讓遊客真的能夠一次走遍而不經過重複的橋。. B.. 漢米頓路徑 及 漢米頓迴路 (Hamiltonian Path, Hamiltonian Circuit). I. 基本概念 漢米頓迴路 (Hamiltonian Circuit) 的定義與尤拉迴路十分的相像,只是漢米頓迴路是指 一個經過圖中每一個「頂點」皆恰好一次(除了起點與終點必相同)的迴圈(Cycle),類似地, 漢米頓路徑(Hamiltonian Path)的部分也是一樣的。 但是,詢問一張圖是否存在著漢米頓路徑或迴圈是 NP-Complete 的。 若一張圖包含一條漢米頓路徑,則我們稱該圖為 traceable graph,而若一張圖包含一個 漢米頓迴路,則我們稱該圖為 Hamiltonian graph。 II. 性質 a.一個頂點數目超過 2 的完全圖必存在一條漢米頓迴路 (Hamiltonian Circuit)。 b.一完全圖中共有. 𝑛−1 ! 2. 條相異的漢米頓迴路。. More Extend Ext. 帶權圖的漢米頓迴路──旅行銷售員問題 (Travelling Salesman Problem, TSP) 這個問題是這樣的:有一個銷售員要前往各大城市之間作商品推銷,而每個城市之間 的連絡道路距離不盡相同。現在,銷售員想要以最短的總路程拜訪每一個城市恰好一次, 請問最佳方案的總路程為多少? 我想,不難發現這個問題與剛剛所提到的漢米頓迴路問題有關,只是這回圖上的邊都 帶有權重(weight),而這個問題亦屬於 NP-Complete 問題,因此我們無法在多項式時間內解 決這一個問題。目前一個較好的方法是使用狀態壓縮 DP,複雜度為 O(2nn2),你能夠自己 想想看嗎? 13 | 頁.

(3) 建中資訊科校內培訓講義 – 圖論 CK6207 楊鈞百. 想一想? ※為何上述提出的找出一條尤拉迴路的演算法是正確的? ※為何在上述找出尤拉迴路的演算法中,記錄邊的步驟我們可以用「堆疊」實作? ※使用上述找出尤拉迴路的演算法所找出的尤拉迴路可能不只一種,為什麼? 那如果限制要輸出字典順序最小的方案,又應該如何修改呢? ※上述提供了一個在無向圖中找出尤拉迴路的演算法,那尤拉路徑呢?有向圖又該怎麼辦? ※想一想為何尤拉迴路和漢米頓迴路明明只是對象為邊和頂點的差別,為何一個可以在多項 式時間內快速求得,而另一個卻是屬於 NP-Complete 問題呢? ~ Note ~. Do Exercise !. 2-4. UVa : 302, 10129 TIOJ : 1084. 14 | 頁.

(4) 建中資訊科校內培訓講義 – 圖論 CK6207 楊鈞百. Chapter 3 常見問題 在這個章節,我們將會舉幾個常見的經典問題以及他們的經典解法,對於以下的每個問 題都是重要的,請務必完全理解其概念及深層的含意。. 3-1 最小生成樹 給定一個無向圖 G,其每條邊都帶有一個權重值(weight),從其邊集 E 中選擇其中的一些 邊,使得這些邊能夠連接所有的點,而且權重總和是最少的。 注意到為了使總 weight 最小,最後挑選出來的邊必不形成 cycle,否則拿掉 cycle 上的其 中一條邊仍符合條件,且 weight 較小;又因為要讓所有點相連,即選出來的邊使這個圖仍然 連通(connected),綜合以上(連通且沒有 cycle),可知選出來的邊形成一棵 Tree。 這就是所謂的最小生成樹問題,即 Minimum Spanning Tree Problem,簡稱 MST Problem。. A. Prim 演算法. – Time Complexity: O(V2) or O(ElgV). I. 基本想法 對於這個最小生成樹問題,我們可以用 Greedy 的想法,由任一個頂點開始擴展 MST, 每次選擇與當前準最小生成樹距離最近的點把它加入現在的這棵樹中,並且更新當前的樹到 每個點的距離。如此反覆操作直到所有的點都被加入樹中,我們便能得到一棵生成樹,而其 必然是最小生成樹。 過程中我們總共考慮了 |V| 個點,且對於每次加一個點時都考慮其他點是否要被加進樹 中,因此整體的時間複雜度為 O(V2)。 II. 正確性 這樣的 Greedy 策略為什麼會是對的呢? 其實道理很簡單,假如經由 Prim 演算法得到的生成樹不是最小生成樹,那麼若假設得到 的生成樹為 T、最小生成樹為 Tm,藉由加入在 Tm 中但沒有在 T 中的邊至 T 中,我們將會得 到一個或多個的 cycle 於 T 中,對於每一個 cycle,顯然只要拔掉該 cycle 中權重最大的那條 邊,則新得到的生成樹 T’必然就是最小生成樹。 但其實這種狀況顯然不會發生,因為若有一條其他的邊 e 加入且化解 cycle 後會使得 Prim 演算法得到的生成樹權重更小,那麼當初顯然就會選到那條邊 e,因此,我們可以知道藉由 Prim 演算法所得到的生成樹必為最小生成樹。 III. 進一步優化 可能有部分的人在看完上面的敘述時就多多少少有想到了,對於 Prim 演算法,我們發 現,在每次選新的點進來時,我們考慮的都是所有剩餘的點之中與當前的樹距離最小的點! 因此,我們很容易能聯想到使用資料結構「Heap」來優化這個部分,而若是經由 Binary Heap 優化過後,Prim 演算法的時間複雜度變為 O(ElgV)。. 15 | 頁.

(5) 建中資訊科校內培訓講義 – 圖論 CK6207 楊鈞百. IV. 虛擬碼 Function Prim’s_Algorithm ( Graph G, bool[ ] Visited, min-heap Heap ) 1 2 3 4. Clear Heap. Set Visited[ ] all False. TotalCost ← 0. push node s into Heap, with the distance 0. (s.dist = 0). 5 6 7 8 9 10 11 12. While Heap is Not Empty Do u ← the top element of Heap. Pop Heap. TotalCost ←TotalCost + u.dist For v, all vertices adjacent to u If v is not in Heap Then Push v into the Heap. End If.. 13. If cost(u,v)<v.dist. //s 為圖中任意點. 14 Then v.dist ← cost(u,v), then Adjust the Heap 15 End If. 16 End While.. B. Kruskal 演算法. – Time Complexity: O(ElgV). I. 基本想法 除了剛才提到的 Prim 演算法之外,還有一個也是常常被拿來解決最小生成樹問題(MST Problem) 的演算法──Kruskal 演算法。 Kruskal 演算法的中心思想是這樣的:既然我最後想要得到的是一棵「最小」生成樹,那 麼,當然是希望樹上每條邊的權重越小越好囉?因此,何不從邊權較小的邊開始考慮? 16 | 頁.

(6) 建中資訊科校內培訓講義 – 圖論 CK6207 楊鈞百. 藉由這個想法,我們可以很容易的得到一個可能可以解決最小生成樹問題的演算法:由 最小權重的邊開始,將所有的邊一條條地照著權重大小的順序由小到大加進當前的集合中。 但是這下子就會出現一個問題,有的時候在加進一條新的邊時,會造成 cycle 的出現!然而, 既然叫作最小生成「樹」,那麼 cycle 自然是不被允許的,那怎麼辦呢?既然會加入這條 邊就會形成 cycle,那就不要加吧!如此往復的作下去,當所有的邊都被考慮過時,我們便可 以得到一棵該圖的生成樹。 那麼,我們所得到的這棵生成樹到底是不是最小生成樹呢?答案是,是的! II. 正確性 其實 Kruskal 演算法的正確性也很直觀,同樣思考若得到的不是最小生成樹,那麼必然 會有一條邊 e 加入更好,但若加入該邊 e 後刪掉環中其他邊會更好,表示邊 e 的權重必然較 環中權重最大的那條邊小。然而此事實與 Kruskal 演算法的步驟矛盾,因為 Kruskal 演算法的 過程是將所有邊由權重小到大的順序考慮,若真的存在邊 e,那當時必然會優先考慮到邊 e, 因此反證得知由 Kruskal 演算法所得到的生成樹必為最小生成樹。 III. 實作技巧 在 Kruskal 演算法的過程之中有一個步驟值得一提,就是在加進一條邊時要確認加入該 條邊之後會不會形成 cycle,而此問題等價於詢問該條邊的兩端點在加入這條邊以前是否已經 互相連通。 如果我們每一次都直接去暴力檢查那麼這一步的總複雜度將高達 O(E2)!對於這個瓶頸, 我們可以使用資料結構「並查集」(Disjoint Set) 來解決,藉由並查集能夠高速地查詢兩頂點 是否在同一集合內的性質,檢查這一步便可以做到 O( E α(V) )。 IV. 虛擬碼 Function Kruskal’s_Algorithm ( Graph G, disjoint_set Set ) 1 Initialize Set. 2 TotalCost ← 0. 3 Sort all edges by cost(weight). 4 For e, the edges by sorted order 5 6 7 8. If the two sides of e are in the different set in Set Then TotalCost ← TotalCost + e.cost Merge two set which the two sides of e in. EndIf.. 若使用了並查集(Disjoint Set),則此演算法的瓶頸步驟變成是一開始的排序,若使用一般 的 O(nlgn)排序則複雜度為 O(ElgE),又 E 最多只會到 V2,故 lgE=2lgV,所以複雜度可以寫 成 O(ElgV)。 而如果在排序的那個步驟改使用 Radix Sort 或 Counting Sort 等線性時間(或趨近於線性) 的排序方法,又或者邊集合是原本就已經是 sorted 了,則此演算法複雜度為 O( Eα(V) )。 17 | 頁.

(7) 建中資訊科校內培訓講義 – 圖論 CK6207 楊鈞百. More Extend Ext1. 次小生成樹 (Second-best Minimum Spanning Tree) 我們已經學會了如何求出無向圖的最小生成樹,那麼現在來考慮一個問題:那麼第二 小(次小)的生成樹要怎麼找呢? 次小生成樹的權重可能跟最小生成樹相等,也有可能不存在次小生成樹。. Ext2. 最小樹形圖 (Directed Minimum Spanning Tree, 或稱 Minimum Arborescence) 我們之前所討論的最小生成樹問題都是針對無向圖所作的討論,那有向圖呢?如果改 成有向圖,是否還存在著類似的問題呢?答案是肯定的,有向圖的類生成樹結構我們稱之 為樹形圖,意即從一個點出發對於其他所有點都存在著唯一的一條路徑。 那麼,既然知道了有這種東西存在,我們不禁想要問,那麼最小樹形圖該如何求得呢?. 想一想? ※何時使用 Heap 優化 Prim 演算法會有很大的效果? ※為什麼使用 Heap 優化 Prim 演算法後其複雜度變為 O(ElgV)?試著推導看看。 ※最小生成樹是否唯一?為什麼? ※若除了要算出最小生成樹的總花費(cost)以外還要輸出最小生成樹上的邊集合,該怎麼辦?. Do Exercise !. 3-1. UVa : 10147, 10397 TIOJ : 1211, 1327. 18 | 頁.

(8) 建中資訊科校內培訓講義 – 圖論 CK6207 楊鈞百. 3-2 單源最短路徑 最短路徑問題(Shortest Path Problem)是圖論領域十分經典的問題之一,故名思義,所探討 的是圖中兩頂點之間的最短路徑,又可以略分為兩大類:一種是「單源最短路徑問題」 (Single-source Shortest Path Problem, SSSP),意即有一個固定的起點(互稱源點),目標是計算 出該起點至其他各點的最短路徑,是我們這一節的重點;另一種則是「多源最短路徑問題」 (All-pairs Shortest Path Problem, APSP),我們會在下一節對該種類的問題作討論。. Pre1. Properties of Shortest Path Problem –. 最短路徑問題的特性. ※最短路徑樹 若圖 G 為一連通圖,那麼我們是否能找出以 G 中一頂點 v 為根的一棵生成樹,使得延 著這些邊走到的任一頂點 u,過程的路徑恰好是 v 到 u 的最短路徑 P(v,u)? 最短路徑有以下性質: 1. 最短路徑的子路徑一定也是一條最短路徑。 2. 假如有兩條同長度的最短路徑連接 u, v 則任選一條皆可。 藉由這些性質,我們可以證明出若我們從某個點 v 出發,v 到圖中其他的每個點的最短 路徑之聯集將會形成一棵樹,證明從略。(大家可以自己想想看) 藉由這個結論,我們可以將最短路徑問題轉化成「最短長度問題」。. Pre2. Relax Procedure –. 鬆弛步驟. 有一個很簡單的常識,那就是如 果 A 到 C 加上 C 到 B 的總距離小於 A 到 B 的距離,意即由 A 到 B 經過 C 比不經過 C 距離更短。 那麼若我們原本是直接由 A 走到 B,則我們就可以改成 A 經過 C 再走到 B,而這個過程 我們就稱為鬆弛(Relax)。. A. Bellman-Ford 演算法. – Time Complexity: O(VE). I. 基本想法 Bellman-Ford 演算法的核心思想非常簡單,就是不斷的利用邊集合中的邊對目前的最佳 路徑作鬆弛(Relax)的動作,直到確定各最佳路徑的長度為最佳(得到起點到各點最短路徑 長)。 但是,那麼這鬆弛的動作要做幾次才能確保所得到的長度必定最佳呢? 我們假設對象的圖不存在負圈(也因此才有最短路徑),則任意一條最短路徑皆不會經過 重複的點(因為不會更好),也就是最多只會經過|V|個點。因此,當一個頂點 u 經過鬆弛了|V|-1 次之後,起點到該 u 點的當前最佳長度必然就是最短路徑的長度,否則必包含負圈。 19 | 頁.

(9) 建中資訊科校內培訓講義 – 圖論 CK6207 楊鈞百. II. 虛擬碼 Function Bellman-Ford_Algorithm ( Graph G, int Dist[ ], int Source ) 1 set dist[ ] all INF.. //INF 的意思是無窮大。. 2 3 4. //G.E 為圖 G 的邊集 E。. 5 6 7. Dist[Source] ← 0. For i, i from 1 to |V|-1 For (u,v), each edge in G.E If Dist[u]+cost(u,v)<Dist[v] Then Dist[v] ←Dist[u]+cost(u,v). EndIf.. //Relax. 由於外層迴圈 i 會迭代|V|-1 次,內層迴圈每次都會跑|E|次,故此演算法的時間複雜度很 顯然是 O(VE)。. B. Dijkstra 演算法. – Time Complexity: O(V2)or O(ElgV). I. 基本想法 Dijkstra 演算法是一種貪婪(Greedy)的思維,首先,一開始只有起點被標記成已拜訪,之 後每次都選取距離頂點最近的點,將其標記,並以其連接的邊鬆弛其相鄰的節點,之後重複 操作,選取距離頂點最近的點……直到所有可到達的點都被標記為止。 而 Dijktra 演算法告訴我們結論,當一個點被標記時,它當下距離起點的距離即為最短路 徑的長度;而若至整個演算法結束仍尚未標記,則該點對於起點而言是無法到達的,也就是 與起點之間不存在任何路徑。 II. 正確性 若要證明 Dijkstra 演算法是正確的,則我們必須證明「當一個點被標記成以拜訪時,它 當下距離起點的距離即為最短路徑的長度」這一點。 而對於這一點,我們可以使用反證法證明之:若於標記頂點 u 時,起點 s 到該點 u 當下 距離 d 不是最短,則必有其他條路徑使得起點到該點 u 的距離比當下的距離 d 更短,再由「最 短路徑的子路徑必亦為最短路徑」這個性質可知,若有一條路徑 s→v→u 的長度比 d 更短, 則 s→v 的長度必然小於 d,因此要嘛 1. v 尚未被標記:但此情況應該先標記 v 而非 u,故與 假設矛盾;或者是 2. v 已被標記:但這種情況 u 至原點的距離必然已經被 Relax 成比 d 還短, 故亦矛盾。 因此由反證法我們得知,Dijkstra 演算法是正確的。 然而,由於這一點,Dijkstra 演算法並不適用於有負的邊權重的情況。 III. 進一步優化 不覺得 Dijkstra 演算法跟解決最小生成樹問題的 Prim 算法很相似嗎?都有取距離最近的 點這個步驟,因此,我們不難想到對於 Dijkstra 演算法,也可以使用 Heap 來作優化。 原本以迴圈實現的 Dijkstra 演算法每次尋找距離起點最近的頂點都需要花 O(V)的時間, 故總時間複雜度為 O(V2),而若是用了 Binary Heap 優化後的時間複雜度則變為 O(ElgV)。 20 | 頁.

(10) 建中資訊科校內培訓講義 – 圖論 CK6207 楊鈞百. IV. 虛擬碼 Function Dijkstra’s_Algorithm ( Graph G, min-heap Heap, int Dist[ ], int Source ) 1 set dist[ ] all INF. //INF 的意思是無窮大。 2 3 4 5 6 7 8 9 10 11 12. Dist[Source] ← 0. Clear Heap. push node Source into Heap. While Heap is Not Empty Do u ← the top element of Heap. Pop Heap. For v, all vertices adjacent to u If v is not in Heap Then Push v into the Heap. End If. If Dist[u]+cost(u,v)<Dist[v]. 13. Then Dist[v] ←Dist[u]+cost(u,v), then Adjust the Heap. 14 End If. 15 End While.. ~ Note ~. 21 | 頁.

(11) 建中資訊科校內培訓講義 – 圖論 CK6207 楊鈞百. More Extend Ext1. 偵測負圈 (Negative Cycle Detecting) 在講 Bellman-Ford 演算法時我們提到了所謂的負圈,也就是一個權重和小於零的圈 (cycle),並且知道了如果存在負圈,則不存在最短路徑(只要一直走負圈就會不斷變短)。 那麼,該如何偵測負圈呢?其實,藉由 Bellman-Ford 演算法我們就可以偵測負圈是否 存在,應該如何修改該演算法使得可以用來偵測負圈呢?. Ext2. 第 K 短路問題 (Kth Shortest Path Problem) 前面我們討論了最短路徑問題,現在,我們對這個問題作個延伸──我們要找第 K 短的路徑(K>0),對於這個問題,已經有許多相關的特殊算法用來解決這個問題,不過如果 不是很講究速度的話,其實只要修改一下前面所述的 SSSP 演算法就可以得到找單源第 K 短路的演算法了。 那麼應該如何修改呢?. 想一想? ※請說出這兩種演算法的異同。 ※Bellman-Ford 演算法本質即為不斷的作鬆弛,其實我們可以在某個時間點就結束外層迴圈 (不用真的跑完|V|-1 次),何時可以使用這個 cut 呢? ※為什麼 Dijkstra 演算法不能適用於權重為負的情況?如果硬是要使用又會如何? ※為什麼使用 Heap 優化 Dijkstra 演算法後其複雜度變為 O(ElgV)?試著推導看看。 ※如果除了要知道最短路徑的長度外還要輸出最短路徑的路徑序列(即「過程」)要怎麼辦?. Do Exercise !. 3-2. UVa : 544 TIOJ : 1290. 3-3 多源最短路徑 在上一節我們介紹了 SSSP 問題,而這次要考慮的則是「多源最短路徑問題」(All-pairs Shortest Path Problem, APSP)。所謂的多源最短路徑問題是指起點不固定的一類最短路徑問題, 意即每一個頂點都有可能作為起點,因此,我們可以很容易的得到一些解決多源最短路徑問 題的方法──只要用上一節所介紹的演算法對於每一個頂點都執行一次就可以了,時間複雜 度則是該演算法的原複雜度再乘上 V。 既然如此簡單就能解決 APSP 問題,那這一節要介紹什麼呢?重點就在於,對於 APSP 問題,其實有更簡潔、更容易實現的演算法,這一節我們將介紹解決最短路徑問題的演算法 中大概是最簡潔乾淨的 Floyd-Warshall 演算法。 22 | 頁.

(12) 建中資訊科校內培訓講義 – 圖論 CK6207 楊鈞百. A. Flord-Warshall 演算法. – Time Complexity: O(V3). I. 基本想法 Floyd-Warshall 演算法的核心概念在於,利用邊進行鬆弛(Relax)搭配動態規劃(Dynamic Programming)的方式來對點和點之間的最短距離進行維護及更新。 II. 實作方式 我們用三層迴圈來實行動態規劃,以外層的迴圈 k 來枚舉中繼點,內層的 i, j 迴圈來進行 鬆弛更新的動作。 III. 虛擬碼 Function Floyd-Warshall_Algorithm ( Graph G, int Dist[ ][ ] ) 1 Initialize dist[ ][ ]. 2 For k, each the vertex in G.V 3 4. //G.V 為圖 G 的點集 V。. For i, each the vertex in G.V For j, each the vertex in G.V. 5 6 7. If Dist[i][k]+Dist[k][j]<Dist[i][j] Then Dist[i][j] ←Dist[i][k]+Dist[k][j]. EndIf.. //Relax. 由於每一層迴圈都迭代|V|次,故時間複雜度為 O(V3)。. 想一想? ※請想想如果三層迴圈的順序不是 k, i, j 而是 i, j, k 會怎麼樣?又為什麼會變成那樣?. Do Exercise !. 3-3. UVa : 11015, 10048. 23 | 頁.

(13)

參考文獻

相關文件

方向皆保持在 90 度,也就得到不受旋轉影響的性質。 (4) 關鍵點描述子: 關鍵點描述子(keypoint

於是有人建議將所有街道都改成單行道以改 善交 通狀況 (如台北市的公車逆向道就是一 個例子)。 由於從甲地到乙地的街道改成單向, 所以其他街道的行進方向就必須好好規劃才

在日常生活中照顧自己,並養成自 律精神,以應付日常生活中,個人 衞生、個人安全及情緒的問題

SWOT 是一種動態的歷程,作業過程應有其 一貫性,從上、中、下游著眼,必須重視三件事:

系統的排列表達,使用者容易了解到章節架 構的分布,有利於取得需要的資訊,如圖 8 所示。 5.Primary Life Cycle Process 5.1 Acquistion Process

其可分配給單位內的電腦 IP 位址數有 1022 個 此網段為四個連續的 Class C 所組成 22 Internet Protocol 從 IPv4 演進到 IPv6 後,下列那一個欄位已不在 IPv6

L-system Rule:要建立一個 L-system 樹型時,首先會得到一個 L-system Rule,其中 包含了幾項最重要的資訊:遞迴次數、偏轉角度、起始符號以及生長的規則(L-system

Rubenson 所提的期待價量模式,如圖2-2-2所示。認為期待包括