使用C/C++語言 楊正宏 編著 全華科技圖書股份有限公司 印行.

Slides:



Advertisements
Similar presentations
資料結構與演算法 第6章 圖形 徐熊健.
Advertisements

圓的一般式 內容說明: 由圓的標準式展出圓的一般式.
中二數學 第五章 : 二元一次方程 二元一次方程的圖像.
Chapter 12 圖形結構 12.1 圖形的一些專有名詞 12.2 圖形資料結構表示法 12.3 圖形追蹤 12.4 擴展樹
第四章 數列與級數 4-1 等差數列與級數 4-2 等比數列與級數 4-3 無窮等比級數 下一頁 總目錄.
第7章 图论基础与应用 PART A 《可视化计算》.
Minimum Spanning Trees
第九章 圖形結構.
Chapter 5 迴圈.
GRAPH THEORY 圖論 第二組 晏彩霞 陳弘益 王文斕.
第8章 圖形結構(Graphs) 8-1 圖形的基本觀念 8-2 圖形的表示法 8-3 圖形的走訪 8-4 擴張樹
Graph Theory 第四組 林宗翰 吳家豪.
Chap5 Graph.
7.5 擴張樹 (Spanning Tree) 一個無向相連圖 G 的子圖 G’ 如果可用最少的邊來連接G 的
Graph Theory Part II Applications in daily life
Chapter 4 Spanning Trees
Chap5 Graph.
第8章 圖形結構(Graphs) 8-1 圖形的基本觀念 8-2 圖形的表示法 8-3 圖形的走訪 8-4 擴張樹
Chapter 6 Graph Chang Chi-Chung
Activity Networks AOV網路 AOE網路.
第八章 图 图的基本概念 图的存储结构 图的遍历与连通性 最小生成树 最短路径 活动网络.
The Greedy Method.
演算法方式總覽 The Divide-and-Conquer Strategy (個各擊破)(binary Searching、Quick Sort…. ) The Greedy Method(貪婪演算法) (Prim MST、Kruskal MST、Djikstra's algorithm) Dynamic.
圖論 (Graph Theory) B 電機四 大鳥 B 電機四 酋長 B 電機四 炫大
Graph 2 Michael Tsai 2012/5/1 連載: 學生上課睡覺姿勢大全
4B冊 認識公倍數和最小公倍數 公倍數和最小公倍數的關係.
Graph Theory Graph theory is the study of the properties of graph structures. It provides us with a language with which to talk about graphs.
Chapter 5 Fundamental Properties of Graphs and Digraphs
(Circular Linked Lists)
Chapter 7 圖形與網路 資料結構導論 - C語言實作.
Chapter 7 圖形與網路 資料結構導論 - C語言實作.
資料結構 第7章 圖形結構.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Chap3 Linked List 鏈結串列.
第一章 直角坐標系 1-1 數系的發展.
Chapter12 Graphs Definitions Applications Properties
第 九 章 圖形結構 課程名稱:資料結構 授課老師:________ 2019/2/22.
Ch 3 Dynamic Programming (動態規劃).
Ch07 圖形與網路 淡江大學 周清江
Chapter 2 Basic Concepts in Graph Theory
第9章 基本图算法 本章内容将包含基本的图形表示法,以及先深搜寻,先广搜寻,拓朴排序,Strongly Connected Components。
数据结构概论 第7章 图 董黎刚 浙江工商大学信电学院 2019年4月8日.
連通性 (Connectivity) 將公司標幟插入此投影片 選取〔插入〕功能表 中的〔圖片〕選項 選取〔從檔案〕指令 選取該圖片檔案
最短路徑 The Shortest Path.
Definition of Trace Function
§1 图与网络的基本概念 §2 树图与最小生成树 §3 最短路问题 §4 最大流问题 §5 最小费用最大流问题
小學四年級數學科 8.最大公因數.
本章結構 網路簡介 最短路徑問題 最小展開樹問題 最大流量問題 10-1.
101北一女中 資訊選手培訓營 深度優先搜尋(DFS)的進階應用 Nan.
圖論的介紹 第二組 徐榮德 鄭又齊 陳俊嘉.
圓的定義 在平面上,與一定點等距的所有點所形成的圖形稱為圓。定點稱為圓心,圓心至圓上任意一點的距離稱為半徑,「圓」指的是曲線部分的圖形,故圓心並不在圓上.
103資訊學科培訓 圖論 - BFS & DFS & 應用 講者:林庭宇.
MicroSim pspice.
鄧姚文 資料結構 第八章:圖(Graph) 鄧姚文
交流電路(R-L) R-L Series Circuits ATS電子部製作.
网络模型 Network Modeling Operations Research 运 筹 学
動畫演示 Node規範了一些基本的方法,像是增加節點、刪除節點、讓節點做一些事、取得第n個節點等等
例題 1. 多項式的排列 1-2 多項式及其加減法 將多項式 按下列方式排列: (1) 降冪排列:______________________ (2) 升冪排列:______________________ 排列 降冪:次數由高至低 升冪;次數由低至高.
Elementary Graph Algorithms
1757: Secret Chamber at Mount Rushmore
第一章 直角坐標系 1-3 函數及其圖形.
1 試求下列三角形的面積: 在△ABC中,若 , ,且∠B=45° 在△PQR中,若 , ,且∠R=150° (1) △ABC面積 。
在直角坐標平面上兩點之間 的距離及平面圖形的面積
All Sources Shortest Path The Floyd-Warshall Algorithm
Advanced Competitive Programming
圖形結構 Graph Structure chapter 9 德明科技大學資訊科技系.
10303: How Many Trees? ★★☆☆☆ 題組:Contest Archive with Online Judge
Graph 1 Michael Tsai 2012/4/24 連載: 學生上課睡覺姿勢大全
11621 : Small Factors ★★☆☆☆ 題組:Problem Set Archive with Online Judge
JAVA 程式設計與資料結構 第二十一章 Graph.
Presentation transcript:

使用C/C++語言 楊正宏 編著 全華科技圖書股份有限公司 印行

第八章 圖 形(1/2) 8-1 前言 8-2 圖形的基本觀念 8-3 圖形的資料表示法 8-1 前言 8-2 圖形的基本觀念 8-3 圖形的資料表示法 8-3-1 相鄰矩陣(Adjacency Matrix) 8-3-2 相鄰串列(Adjacency List) 8-3-3 相鄰多重串列(Adjacency Multilist) 8-3-4 索引表格法(Indexed Table)

第八章 圖 形(2/2) 8-4 圖形的追蹤(Graph Traversal) 8-5 擴張樹(Spanning Tree) 8-6 拓樸排序(Topological Sorting) 8-7 最短路徑(Shortest Path)

前言(1/3) 圖形結構提供了簡單的方式來描述一個問題、系統、或狀況等。 與樹狀結構最大的差異是樹狀結構是描述節點與節點之間層次的關係。 瑞士的數學家尤拉(Euler) 解決Koenigsberg bridge problem,這就是著名的七橋問題。

前言(2/3) 3 4 7 A地 D地 5 1 2 6 Koenigsberg bridge

前言(3/3) 尤拉迴路(Eulerian cycle) 邊(Edge)代表各橋,以節點(Vertices)代表4個城市。 C 5 7 3 2 A D 1 4 6 B

圖形的基本觀念 一個圖形(graph)係由有限個節點(Vertices)的集合(V)及節點與節點間相連接邊(Edges)之集合(E)組合而成,我們可以將圖形表為G=(V, E)。 四種圖形結構: 無方向圖形(undirected graph, 簡稱graph) 有方向圖形(directed graph, 簡稱digraph) 相連圖形(connected graph) 不相連圖形(disconnected graph)

無方向圖形(1/9) 圖8-2.2 圖8-2.1 圖8-2.3

無方向圖形(2/9) 重要術語 完整圖形(Complete graph): 具有n個頂點的無方向圖形,若共有〝n(n-1)/2〞條邊,則稱此無方向圖形為完整圖形(Complete graph),如圖8-2.1。 相鄰(Adjacent): 在圖形的某一邊(V1, V2)中我們稱頂點V1與頂點V2是相鄰的。但在有方向圖形中稱<V1, V2>為V1是adjacent to V2或V2是adjacent from V1,如圖8-2.1中V1與V2是adjacent,圖8-2.3中V2與V3也是。 附著(Incident): 我們稱邊(V1, V2)附著在頂點V1與頂點V2上。我們可發現在圖8-2.3中附著在頂點2的edge有<1, 2>, <2, 1>及<2, 3>。

無方向圖形(3/9) 重要術語 子圖(Subgraph): G的〝子圖(Subgraph)〞是一個圖G‘,有V(G‘) ≦ V(G)和E(G‘)≦E(G)兩個性質。 路徑(Path): 圖形中從頂點Vp到頂點Vq的一條路徑是指一串由頂點所成的連續序列Vp, Vi1, Vi2, ..., Vin,Vq其中(Vp, Vi1),(Vi1, Vi2)….,(Vin, Vq)都是E(G)上的邊。例如:我們將路徑(1, 2), (2, 4), (4, 3)寫成1, 2, 3, 4。在圖8-2.1上的兩條路徑,1, 2, 4, 3與1, 3, 4, 2其長度為3。 路徑長度(Path length): 指路徑上所包含邊的數目稱之為路徑的長度。

無方向圖形(4/9) 重要術語 簡單路徑(Simple path): 指路徑上除了起點和終點可能相同外,其他的頂點都是不同的。例如:圖8-2.1的1, 2, 4, 3是一條簡單路徑。 循環(Cycle): 循環(cycle)是一個簡單路徑,其起點與終點為同一個頂點。 連通(Connected): 無方向圖形中,若從V1到V2有路徑可通,則稱頂點V1和頂點V2是相連的。如果每個的成對頂點Vi, Vj都有路徑由Vi通到Vj,則稱圖形是相連的。 連通單元(Connected component): 或稱單元(Component),是指該圖形中最大的連通子圖(maximal connected subgraph),如下圖8-2.4和圖8-2.5。

無方向圖形(5/9) E F H G D A C B 圖8-2.4 圖8-2.5

無方向圖形(6/9) 圖8-2.6 圖8-2.7 圖8-2.8

無方向圖形(7/9) 圖8-2.6是一個完整圖形。 圖8-2.6中V1與V2是相鄰,圖8-2.8中V4與V5是相鄰。 圖8-2.6中(V1, V2),(V2, V3),(V3,V4),(V4, V5),(V5, V1)是一條路徑。 圖8-2.6中(V1, V2),(V2, V3),(V3, V1),(V1, V4),(V4,V5)亦是一條路徑, 圖8.2_6中(V1, V2),(V2, V3),(V3, V4),(V4, V5)這條路徑長度為4。

無方向圖形(8/9) 圖8-2.6中(V1, V2),(V2, V3),(V3, V4),(V4, V5)是一條簡單路徑。 圖8-2.7和圖8-2.8都是圖8-2.6的子圖。 圖8-2.7中(V1, V2), (V2, V4), (V4, V1)是一條循環。 圖8-2.6,圖8-2.7與圖8-2.9都是連通的,圖8-2.8不是連通的。 圖8-2.6有兩個連通單元。

無方向圖形(9/9) 圖8-2.9

有方向圖形(1/4) 重要術語 完整圖形(Complete graph) 路徑(Path) 緊密連通(Strongly Connected) 緊密連通單元(Strongly Connected Component) 多重圖形(multigraph) 分支度(degree) 內分支度(in-degree) 外分支度(out-degree)

有方向圖形(2/4) 圖8-2.13 圖8-2.12 圖8-2.14

有方向圖形(3/4) Eulerian cycle: Eulerian chain: 形成Eulerian cycle的條件是從任何一個頂點開始,經過每個邊一次,再回到出發的那一個頂點時稱之,亦可稱為Eulerian Walk,其充分且必要條件為每個頂點的分支度必須都是偶數。 Eulerian chain: 形成Eulerian的條件是從任何一個頂點開始,經過每邊一次,不一定要回到原出發點時稱之,其充分且必要條件為祇有兩個頂點的分支度是奇數,其餘必須均為偶數。

有方向圖形(4/4) 1 2 3 4 5 1 2 3 4 5 圖8-2.15 Eulerian cycle 圖8-2.16 Eulerian chain

圖形的資料表示法 相鄰矩陣(Adjacency Matrix) 相鄰串列(Adjacency List) 相鄰多重串列(Adjacency Multilist) 索引表格法( Indexed Table)

相鄰矩陣(1/3) 將圖形中的n個頂點(Vertices),以一個n × n的二維矩陣來表示,其中若A(i, j)=1,則表示graph中有一條邊(Vi, Vj)存在。反之,A(i, j)=0則沒有。 圖8-3-1.1

相鄰矩陣(2/3) 相鄰矩陣 圖8-3-1.2

相鄰矩陣(3/3) 無方向圖形之相鄰矩陣是具備對稱性的,且對角線皆為零,所以在圖形中只需要儲存上三角形或下三角形即可,所需要儲存空間為n(n-1)/2。 若要求無方向圖中某一頂點相鄰邊的數目(即分支度),只要算算相鄰矩陣中某一列所有1的和或某一行所有1的和。 若要求有方向圖形的內分支度或外分支度。相鄰矩陣裡,列中的1之和便是外分支度,而行中的1之和,便是內分支度。

相鄰串列(1/2) 將圖形中的每個頂點皆形成串列首,而在每個串列首後的節點表示它們之間有邊相連。 每個節點結構 圖8-3-2.1 Vertex Link 圖8-3-2.1

相鄰串列(2/2) 相鄰串列 圖8-3-2.2

相鄰多重串列 節點的結構: M V1 V2 Link1 for V1 Link2 for V2 1 3 4 2 圖8-3-3.1

索引表格法(1/2) 為一種儲存圖形的資料結構,採用一維陣列儲存頂點,建立一索引表格並且對應到相當的位置。 操作方式: 以一個一維陣列來循序儲存相鄰頂點。 建立一個索引表格,n個頂點須建立n個位置於索引表格中,分別對應於陣列中與第一個與該頂點相鄰的位置。

索引表格法(2/2) B C D 圖8-3-4.1 A

圖形的追蹤(Graph Traversal) 圖形是由有限個節點組合而成,節點與節點之間是由邊相互連接,對於每個節點之拜訪順序,也就是圖形之追蹤。 二種追蹤法: 深度優先搜尋法(Depth First Search, DFS) 廣度優先搜尋法(Breadth First Search, BFS)

深度優先搜尋法(1/2) 以縱向為先,首先選定一個任意節點,假設為V0,由拜訪V0開始。 V0的相鄰節點有V1,V2,…,Vi;然後拜訪V1,再拜訪V1的相鄰節點中的某一節點,如此一直重覆。 若其所有相鄰節點均已被拜訪過,則回到上一個被拜訪過的節點,它還含有未被拜訪過的相鄰節點Vp,就再拜訪Vp。

深度優先搜尋法(2/2) 拜訪可能順序: V1 V2 V4 V5 V6 V3 V1 V2 V4 V6 V5 V3 圖8-4.1 2 4 1

廣度優先搜尋法(1/2) 任意選擇某一個開始的節點,假設它為V0,因此先拜訪V0然後以任意的順序去拜訪V0的相鄰節點。 假設V0的相鄰節為V1,V2,…,Vi,當這些節點都拜訪過後,再接著拜訪V1的相鄰節點。 當V1相鄰節點都拜訪過後,再拜訪V2的相鄰節點,如此重覆直到圖形上的所有節點都被拜訪過。

廣度優先搜尋法(2/2) 拜訪可能順序: V1 V2 V3 V4 V5 V6 V1 V3 V2 V4 V5 V6 圖8-4.1 2 4 1 6 3 5

圖形的追蹤範例(1/2) 求下圖之DFS與BFS之搜尋順序。 1 3 2 4 5 6 7 8 圖8-4.2 1 2 3 4 5 6 7 圖8-4.3

圖形的追蹤範例(2/2) 圖8-4.2解答: 圖8-4.3解答: DFS搜尋順序:1→2→4→8→5→6→3→7 BFS左先搜尋:1→2→3→4→5→6→7→8 BFS右先搜尋:1→3→2→7→6→5→4→8 圖8-4.3解答: DFS搜尋順序:1→2→5→6→3→7→4 BFS左先搜尋:1→2→3→4→5→6→7 BFS右先搜尋:1→4→3→2→7→6→5

擴張樹(Spanning Tree) 在一個非方向圖形中以最少的邊線連結起所有頂點,而連結後卻不會形成迴圈,稱 之。 一擴張樹中任兩個點間,只有一條路徑可通。 由於拜訪節點的順序不同,因此產生兩種不同的擴張樹: 深度優先搜尋法擴張樹(Depth First Search Spanning Tree):以深度優先搜尋方式產生的擴張樹。 廣度優先搜尋法擴張樹(Breadth First Search Spanning Tree):廣度優先搜尋法方式產生的擴張樹。

擴張樹範例(1/4) 繪出擴張樹 <解>產生三個擴張樹 圖8-5.1 圖8-5.2

擴張樹範例(2/4) 求DFS擴張樹和BFS擴張樹 1 2 3 4 5 6 7 圖8-5.6 1 3 2 4 5 6 7 8 圖8-5.3

擴張樹範例(3/4) 圖8-5.3 之DFS擴張樹 圖8-5.3 之BFS擴張樹 圖8-5.4 圖8-5. 5 DFS為1→2→4→8→5→6→3→7 BFS為1→2→3→4→5→6→7→8

擴張樹範例(4/4) 圖8-5.6 之DFS擴張樹 圖8-5.6 之BFS擴張樹 1 2 3 4 5 6 7 圖8-5.8 圖8-5.7 1

最小成本擴張樹 (Minimum Cost Spanning Tree) 含有權重之邊線造成之擴張樹其權重總和會有所不同,其每邊的加權值之和是最小者,則稱之。 以最少成本為原則,須滿足下列限制: 只能使用這個圖裡的邊。 只能使用n-1個邊(若有n個節點)。 所使用的邊不能產生一個環路。 兩種方法: 克如斯卡(Kruskal)法 普瑞(Prim’s)法

Kruskal 將整個圖形所有邊線之權重依小到大列出一表。 由權重最小者開始做連接工作,若連接結果不會造成迴圈則成立,若造成迴圈則不予採用。 演算法: 令花費最少之擴張樹 T =  。 從E中選取花費最少的邊(Vx, Vy)(2)。 如果(Vx, Vy)不會使T產生迴路則將之加入T中,否則自E中刪除(3)。 重複 (2) 和(3) 步驟,直到T的邊等於n-1為止。

Kruskal範例(1/3) 利用克如斯卡法算出下圖的最小成本擴張樹 圖8-5.9 2 1 6 5 4 3 17 14 12 19 31 16 9

Kruskal範例(2/3) 列出整個圖形之權重表

Kruskal範例(3/3) 結果: 圖8-5.10 14 cost=46 3 1 4 2 5 6 16 9

Prim’s (1)從任一頂點開始,找出其權重最輕的一條邊。 (2)由此兩點向外再找,找一條權重最輕的邊線連接起來唯,這個權重次輕的邊線必須與剛才相連接的頂點相接。 (3)利用規則(2)將所有頂點相連,但不可造成迴圈。 建立擴張樹步驟: 令A=V,B= ,T= 。 從A中任選一的頂點,將之從A搬移至B,並加入T。 找出一條連接A和B的最少花費邊E (a, b) ,其中aA,bB,且邊(a, b)加到T不會造成迴路(c)。 將頂點a自A搬移到B,並將頂點a 與邊(a, b)加入T(d)。 重複(c),(d) 直到A= 。

Prim’s範例(1/6) 利用普瑞法求最小成本擴張樹 圖8-5.13 2 1 6 5 4 3 17 14 12 19 31 16 9

Prim’s範例(2/6) 解題步驟 步驟一:令A集合為{1, 2, 3, 4, 5, 6},B集合為 ,則T為。 步驟二:取頂點“1”,故A集合為{2, 3, 4, 5, 6},B集合為{1} ,則T為: 步驟三:可選路徑有:(1, 2)=14,(1, 6)=19,(1, 5)=17 ,取頂點“2”,得(1, 2)=14,而故A集合為{3, 4, 5, 6},B集合為{1, 2} ,則T為

Prim’s範例(3/6) 解題步驟 步驟四:可選路徑有:(1, 5)=17,(1, 6)=19,(2, 6)=9,(2, 4)=4,(2, 3)=3,取頂點“3”,得(2, 3)=3,A集合為{4, 5, 6},B集合為{1, 2, 3},則T為

Prim’s範例(4/6) 解題步驟 步驟五:可選路徑有:(1, 5)=17, (1, 6)=19,(2, 6)=9, (2,4)=4, (3,4)=8取頂點“4”,得(2, 4)=4,A集合為{ 5, 6},B集合為{1, 2, 3, 4},則T為:

Prim’s範例(5/6) 解題步驟 步驟六:可選路徑有:(1, 5)=17, (1, 6)=19,(2, 6)=9,(3,4)=8,(4,5)=16,(4,6)=12,放棄路徑(3, 4),因為已造成迴路。取頂點“6”,得(2, 6)=9,A集合為{ 5},B集合為{1, 2, 3, 4, 6},T則為:

Prim’s範例(6/6) 解題步驟 步驟七:由於步驟大都相同故省略一些小細節。取頂點“5”,得(4, 5)=16,而A為,故結束搬移。最後得答案T則為: 14 3 1 4 2 5 6 16 9 圖8-5.14

拓樸排序(Topological Sorting) 用來分析整個AOV網路,將網路中事件的優先次序以線性方式列出來。 先從內分支度為0的節點開始,因內分支度為0表示此節點沒有先行者(Predecessor),所以可先完成此節點延伸的點,然後將此節點所延伸的工作都予以刪除,再由內分支度為0的節點繼續輸出拓撲順序(Topological ordering)。

拓樸排序範例(1/3) 由於節點1沒有內分支度,因為首先輸出拓撲順序為V1,然後將V1所引出的邊刪除。 2 4 1 3 5 圖8-6.1 圖8-6.2

拓樸排序範例(2/3) 由於節點2沒有內分支度,所以輸出拓撲順序為V2,然後將V2所引出的邊刪除。 4 2 3 5 圖8-6.2 圖8-6.3

拓樸排序範例(3/3) 重覆此步驟直到最後…(如圖8-6.4至圖8-6.6所示),所以整個拓撲順序為V1,V2,V3,V4,V5。 圖8-6.5 圖8-6.6

拓樸排序 無法做拓撲排序的圖形如圖8-6.7所示,到輸出V2時,此時圖形如圖8-6.9所示,其中已經沒有一個節點的內分支度為0了,因此做拓撲排序時,網路一定不能有循環存在。 2 4 1 3 5 圖8-6.9 圖8-6.7 圖8-6.8

最短路徑 圖形的每個邊都給予加權值,此加權值可能是成本或距離,這個圖形即可構成一個網路系統。 在這個網路系統中,選擇一個起始節點叫Vs,另外選擇一個終止節點叫Vt,如何求出由Vs到Vt的最短距離就是最短路徑(Shortest Path)。 網路系統上,三個常用到的最短路徑: 由某一個固定節點到另一個固定節點的最短路徑。 由某一個固定節點到其他各節點的最短路徑。 由各節點到其他各節點的最短路徑。

Dijkstra 演算法 設L為N個位置的陣列,用來儲存由某點到各點的最短距離,B為某一個起始點,A[B, I]表示為B點到I點的距離,V是網路中所有項點的集合,S亦是節點的集合。 設定L[I] = A[B,I](I = 1,N)(B為固定節點) S = [B], V = [1,2,…, N] 假如{V-S}是空集合,則停止,否則找到一個K節點使得 L[K]是極小值,並把K放入集合S中。 根據下列原則調整陣列L中之值。 L[I] = min(L[I], L[K] + A[K,I])((I,K) E) (此處I是指與K相鄰的各節點),回到步驟2繼續執行。

Dijkstra範例(1/6) 圖8-7.1表示的是台灣幾個重要的城市,邊是兩城市之間所需花費的成本,以相鄰矩陣A表示,如圖8-7.2 ,試求台北到南投需花費的最小成本。 台南 高雄 30 台東 圖8-7.1 2 3 8 7 9 5 4 1 6 花蓮 新竹 台中 屏東 南投 40 45 50 80 100 台北 150 20 1 2 3 4 5 6 7 8 9 1 0 40 ∞ ∞ ∞ ∞ ∞ 45 80 2 ∞ 0 45 ∞ ∞ ∞ ∞ ∞ ∞ 3 ∞ ∞ 0 50 ∞ ∞ ∞ ∞ ∞ 4 ∞ ∞ ∞ 0 30 ∞ ∞ ∞ ∞ 5 ∞ ∞ ∞ ∞ 0 40 ∞ ∞ ∞ 6 ∞ ∞ ∞ ∞ ∞ 0 ∞ ∞ ∞ 7 ∞ ∞ ∞ ∞ ∞ 150 0 ∞ ∞ 8 ∞ ∞ ∞ ∞ ∞ ∞ 40 0 20 9 ∞ ∞ ∞ ∞ 100 ∞ ∞ ∞ 0 8-7.2

Dijkstra範例(2/6) 假設有一人要從台北到高雄,應如何走才最有效率,亦即是如何求出台北至高雄的最短距離。 從台北出發,所以F=1;S={1},V={1, 2, 3, 4, 5, 6, 7, 8,9},L={0,40, ∞, ∞,∞,∞,∞,45,80};L陣列的L[2]=40表示從台北到新竹的成本為40,L[3]=∞表示從台北到台中的成本為無窮大。從L陣列可比較出L[2]的成本最少,因此把頂點2加入S陣列中,於是S={1, 2},V-S={ 3, 4, 5 ,6, 7, 8, 9},而且與頂點2相鄰的頂點為頂點3,即 L[3]=min(L[3], D[2]+A[2,3])=min(∞,40+45)=85 此時L陣列變成L={0,40,85,∞,∞,∞,∞,45,80}。

Dijkstra範例(3/6) 從V-S={3, 4, 5 ,6, 7, 8, 9}中找出L陣列成本最小的,即L[8]=45,因此將頂點8加入S陣列,於是S={1,2,8},V-S{ 3, 4, 5 ,6, 7, 9},而且與頂點8相鄰的頂點為頂點7和頂點9,即 L[7]=min(L[7], L[8]+A[8,7])=min(∞, 45+40)=85 L[9]=min(L[9], L[8]+A[8,9])=min(80, 45+20)=65 此時L陣列變成L={0,40,85,∞,∞,∞,85,45,65}。 從V-S={ 3, 4, 5 ,6, 7, 9}中找出L陣列成本最小的,即L[9]=65,因此將頂點9加入S陣列,於是S={1,2,8,9},V-S{ 3, 4, 5 ,6, 7},而且與頂點9相鄰的頂點為頂點5,即 L[5]=min(L[5], L[9]+A[9,5])=min(∞, 65+100)=165 此時L陣列變成L={0,40,85,∞,165,∞,85,45,65}。

Dijkstra範例(4/6) 從V-S={3, 4, 5 ,6, 7}中找出L陣列成本最小的,即L[3]=85,因此將頂點3加入S陣列,於是S={1,2,3,8,9},V-S{ 4, 5 ,6, 7},而且與頂點3相鄰的頂點為頂點4,即 L[4]=min(L[4], L[3]+A[3,4])=min(∞, 85+50)=135 此時L陣列變成L={0,40,85,135,165,∞,85,45,65}。 從V-S={4, 5 ,6, 7}中找出L陣列成本最小的,即L[7]=95,因此將頂點7加入S陣列,於是S={1,2,3,7,8,9},V-S{ 4, 5 ,6},而且與頂點7相鄰的頂點為頂點6,即 L[6]=min(L[6], L[7]+A[7,6])=min(∞, 85+150)=235 此時L陣列變成L={0,40,85,135,165,235,85,45,65}。

Dijkstra範例(5/6) 從V-S={ 4, 5 ,6}中找出L陣列成本最小的,即L[4]=135,因此將頂點4加入S陣列,於是S={1,2,3,4,7,8,9},V-S{5 ,6},而且與頂點4相鄰的頂點為頂點5,即 L[5]=min(L[5], L[4]+A[4,5])=min(165, 135+30)=165 此時L陣列變成L={0,40,85,135,165,235,85,45,65}。 從V-S={5 ,6}中找出L陣列成本最小的,即L[5]=165,因此將頂點5加入S陣列,於是S={1,2,3,4,5,7,8,9},V-S={6},而且與頂點5相鄰的頂點為頂點6,即 L[6]=min(L[6], L[5]+A[5,6])=min(235, 165+40)=205 此時L陣列變成L={0,40,85,135,165,205,85,45,65}。

Dijkstra範例(6/6) 最後V-S陣列只剩6,將6加入S陣列中,於是V-S為一空集合。此時可由L陣列看出頂點1到其它節點所花費的最小成本,台北到南投的最小成本是65。

Warshall’ s 演算法 Q(e) ,若存在一個Vi到Vj的邊。 Qi j = ∞ ,沒有Vi到Vj的邊。 設G是一個有m個節點V1,V2,…,Vm且有加權的有向圖形。亦即G中的每一邊e,給予一個加權值Q(e)。於是G便可以用矩陣Q=(Qij)的形式表示如下: 將圖形G以相鄰矩陣Q0來表示。 根據下列原則來調整矩陣Qk中之值: Qk[i,j]=min(Q k-1[i,j] , Qk-1[i,k]+ Qk-1[k,j]) 其中最後一個矩陣Qm就是我們所求的矩陣。 Q(e) ,若存在一個Vi到Vj的邊。 Qi j = ∞ ,沒有Vi到Vj的邊。

Warshall’ s範例(1/5) 試求台北到南投需花費的最小成本。 Q0 = 將圖8-7.1以相鄰矩陣Q0表示: 1 2 3 4 5 6 7 8 9 1 0 40 ∞ ∞ ∞ ∞ ∞ 45 80 2 ∞ 0 45 ∞ ∞ ∞ ∞ ∞ ∞ 3 ∞ ∞ 0 50 ∞ ∞ ∞ ∞ ∞ 4 ∞ ∞ ∞ 0 30 ∞ ∞ ∞ ∞ 5 ∞ ∞ ∞ ∞ 0 40 ∞ ∞ ∞ 6 ∞ ∞ ∞ ∞ ∞ 0 ∞ ∞ ∞ 7 ∞ ∞ ∞ ∞ ∞ 150 0 ∞ ∞ 8 ∞ ∞ ∞ ∞ ∞ ∞ 40 0 20 9 ∞ ∞ ∞ ∞ 100 ∞ ∞ ∞ 0 Q0 =

Warshall’ s範例(2/5) 根據下列原則來調整矩陣Q1中之值: Q1[i,j]=min(Q0[i,j] , Q0[i,k]+ Q0[k,j]) 1 2 3 4 5 6 7 8 9 1 0 40 ∞ ∞ ∞ ∞ ∞ 45 80 2 ∞ 0 45 ∞ ∞ ∞ ∞ ∞ ∞ 3 ∞ ∞ 0 50 ∞ ∞ ∞ ∞ ∞ 4 ∞ ∞ ∞ 0 30 ∞ ∞ ∞ ∞ 5 ∞ ∞ ∞ ∞ 0 40 ∞ ∞ ∞ 6 ∞ ∞ ∞ ∞ ∞ 0 ∞ ∞ ∞ 7 ∞ ∞ ∞ ∞ ∞ 150 0 ∞ ∞ 8 ∞ ∞ ∞ ∞ ∞ ∞ 40 0 20 9 ∞ ∞ ∞ ∞ 100 ∞ ∞ ∞ 0 Q1 =

Warshall’ s範例(3/5) 根據下列原則來調整矩陣Q2中之值: Q2[i,j]=min(Q1[i,j] , Q1[i,k]+ Q1[k,j]) 1 2 3 4 5 6 7 8 9 1 0 40 85 ∞ ∞ ∞ ∞ 45 80 2 ∞ 0 45 ∞ ∞ ∞ ∞ ∞ ∞ 3 ∞ ∞ 0 50 ∞ ∞ ∞ ∞ ∞ 4 ∞ ∞ ∞ 0 30 ∞ ∞ ∞ ∞ 5 ∞ ∞ ∞ ∞ 0 40 ∞ ∞ ∞ 6 ∞ ∞ ∞ ∞ ∞ 0 ∞ ∞ ∞ 7 ∞ ∞ ∞ ∞ ∞ 150 0 ∞ ∞ 8 ∞ ∞ ∞ ∞ ∞ ∞ 40 0 20 9 ∞ ∞ ∞ ∞ 100 ∞ ∞ ∞ 0 Q2 = 在矩陣中Q2[1,3]= min(Q1[1,3] , Q1[1,2]+ Q1[2,3])=85

Warshall’ s範例(4/5) 根據下列原則來調整矩陣Q3中之值: Q3[i,j]=min(Q2[i,j] , Q2[i,k]+ Q2[k,j]) 1 2 3 4 5 6 7 8 9 1 0 40 85 135 ∞ ∞ ∞ 45 80 2 ∞ 0 45 95 ∞ ∞ ∞ ∞ ∞ 3 ∞ ∞ 0 50 ∞ ∞ ∞ ∞ ∞ 4 ∞ ∞ ∞ 0 30 ∞ ∞ ∞ ∞ 5 ∞ ∞ ∞ ∞ 0 40 ∞ ∞ ∞ 6 ∞ ∞ ∞ ∞ ∞ 0 ∞ ∞ ∞ 7 ∞ ∞ ∞ ∞ ∞ 150 0 ∞ ∞ 8 ∞ ∞ ∞ ∞ ∞ ∞ 40 0 20 9 ∞ ∞ ∞ ∞ 100 ∞ ∞ ∞ 0 Q3 = 在矩陣中Q3[1,4]= min(Q2[1,4] , Q2[1,3]+ Q2[3,4])=135 在矩陣中Q3[2,4]= min(Q2[2,4] , Q2[2,3]+ Q2[3,4])=95

Warshall’ s範例(5/5) 以此類推,最後所得到的陣列Q9即是各點之間的最短路徑。 Q9 = 如Q9[1,6]=205表示為台北 到屏東的最短路徑;Q9[8,6]=160表示為花蓮到屏東的最短路徑。台北到南投的最短路徑為Q9[1,9]=65。 1 2 3 4 5 6 7 8 9 1 0 40 85 135 165 205 85 45 80 2 ∞ 0 45 95 125 165 ∞ ∞ ∞ 3 ∞ ∞ 0 50 80 120 ∞ ∞ ∞ 4 ∞ ∞ ∞ 0 30 70 ∞ ∞ ∞ 5 ∞ ∞ ∞ ∞ 0 40 ∞ ∞ ∞ 6 ∞ ∞ ∞ ∞ ∞ 0 ∞ ∞ ∞ 7 ∞ ∞ ∞ ∞ ∞ 150 0 ∞ ∞ 8 ∞ ∞ ∞ ∞ 120 160 40 0 20 9 ∞ ∞ ∞ ∞ 100 140 ∞ ∞ 0 Q9 =