資料結構

33
資資資資 資資資資 7 7 第 第第第第 第 第第第第

description

資料結構. 第 7 章 圖形結構. 7-1  認識圖形. Koenigsberg Bridge 問題. 7-1-1  圖形的定義. 圖形 G 是由 V(G) 和 E(G) 所組成,其中 V(G) 是一個有限且非空的集合,代表頂點, E(G) 是一個有限的集合,代表邊 ,寫成 G = (V, E) 。. 7-1-2  圖形的相關名詞. 相關名詞: 相鄰 分支度 長度 簡單路徑 連通 、強連通 、弱連通 循環 加權圖形 自身迴圈 、多重圖形 、簡單圖形 子圖形 連通單元、強連通單元 完整圖形. 7-2  圖形的表示方式. 7-2-1  相鄰矩陣 - PowerPoint PPT Presentation

Transcript of 資料結構

Page 1: 資料結構

資料結構資料結構

第第 77 章 圖形結構章 圖形結構

Page 2: 資料結構

7-17-1  認識圖形  認識圖形 Koenigsberg BridgeKoenigsberg Bridge 問題 問題

A 肯尼茲堡 D

f

e

c dC

a bB

g

C

B

DA

C

B

DA

c

a b f

d

g

e

(a) (b)

Page 3: 資料結構

7-1-17-1-1  圖形的定義  圖形的定義 圖形圖形 GG 是由是由 VV(G) (G) 和和 E(G) E(G) 所組成,其中所組成,其中V(G) V(G) 是一個是一個有限且非空的有限且非空的集合,代表頂集合,代表頂點,點, E(G) E(G) 是是一個有限的集一個有限的集合,代表邊 ,合,代表邊 ,寫成寫成 G = (V, G = (V, E)E) 。。

Page 4: 資料結構

7-1-27-1-2  圖形的相關名詞 圖形的相關名詞相關名詞:相關名詞: 相鄰相鄰 分支度分支度 長度長度 簡單路徑簡單路徑 連通 、強連通 、連通 、強連通 、

弱連通 弱連通 循環循環 加權圖形加權圖形 自身迴圈 、多重自身迴圈 、多重

圖形 、簡單圖形圖形 、簡單圖形 子圖形子圖形 連通單元、強連連通單元、強連

通單元通單元 完整圖形完整圖形

Page 5: 資料結構

7-27-2  圖形的表示方式  圖形的表示方式 7-2-17-2-1  相鄰矩陣 相鄰矩陣 範例範例 7.17.1 :以相鄰矩陣存放無向圖形:以相鄰矩陣存放無向圖形 GG11 。 。

Page 6: 資料結構

範例範例 7.27.2 :以相鄰矩陣存放有向圖形:以相鄰矩陣存放有向圖形 GG22 。 。

Page 7: 資料結構

7-2-27-2-2  相鄰串列  相鄰串列 範例範例 7.37.3 :以相鄰串列存放無向圖形:以相鄰串列存放無向圖形 GG11 。 。

Page 8: 資料結構

範例範例 7.47.4 :以相鄰串列存放有向圖形:以相鄰串列存放有向圖形 GG22 。 。

Page 9: 資料結構

7-2-37-2-3  加權圖形的表示方式  加權圖形的表示方式 範例範例 7.57.5 :以相鄰矩陣存放加權圖形:以相鄰矩陣存放加權圖形 GG66 。 。

Page 10: 資料結構

範例範例 7.67.6 :以相鄰串列存放加權圖形:以相鄰串列存放加權圖形 GG66 。 。

Page 11: 資料結構

7-37-3  圖形的基本運算  圖形的基本運算 7-3-17-3-1  深度優先搜尋  深度優先搜尋 (DFS) (DFS)

開始

從堆疊彈出一個頂點

堆疊已空?

該頂點已經拜訪過?

No

Yes

拜訪該頂點,再將所有與之相鄰且尚未拜訪過的頂點推入堆疊

結束

將起始頂點推入堆疊

No

No

Yes

Page 12: 資料結構

範例範例 7.77.7 :: [DFS] [DFS] 假設下列圖形的起始頂假設下列圖形的起始頂點為點為 AA ,試寫出其深度優先搜尋結果。 ,試寫出其深度優先搜尋結果。

Page 13: 資料結構

解答:解答:

Page 14: 資料結構

7-3-27-3-2  廣度優先搜尋  廣度優先搜尋 (BFS)(BFS)開始

從佇列取出一個頂點

佇列已空?

結束

拜訪起始頂點,再將其放入佇列

No

Yes

拜訪所有與之相鄰且尚未拜訪過的頂點,再將其放入佇列

Page 15: 資料結構

範例範例 7.97.9 :: [BFS] [BFS] 假設下列圖形的起始頂點假設下列圖形的起始頂點為為 AA ,試寫出其廣度優先搜尋結果。 ,試寫出其廣度優先搜尋結果。

Page 16: 資料結構

解答:解答:

Page 17: 資料結構

7-3-37-3-3  連通單元  連通單元 只要呼叫只要呼叫 dfs(0) dfs(0) 或或 bfs(0) bfs(0) 函數,令它從第一個頂函數,令它從第一個頂

點開始走訪,一旦在走訪完畢後還有其它尚未拜點開始走訪,一旦在走訪完畢後還有其它尚未拜訪過的頂點,就表示該圖形不是一個連通圖形 ,訪過的頂點,就表示該圖形不是一個連通圖形 ,下圖即為一例。下圖即為一例。show_connected()show_connected(){{ int v;int v; for(v = 0; v < n; v++)for(v = 0; v < n; v++) if (visited[v] == FALSE){if (visited[v] == FALSE){ dfs(v);dfs(v); printf("\n");printf("\n"); }}} }

Page 18: 資料結構

7-3-47-3-4  擴張樹  擴張樹 圖形的擴張樹 圖形的擴張樹 (spanning tree) (spanning tree) 指的是以圖指的是以圖形內最少的邊數連接所有頂點所形成的樹,形內最少的邊數連接所有頂點所形成的樹,而樹 而樹 (tree) (tree) 則是連通且沒有循環的圖形 。則是連通且沒有循環的圖形 。

B C

A D

G12

B C

A D

G13

B C

A D

G14

(a) (b) (c)

Page 19: 資料結構

圖形圖形 GG1414 幾種可能的擴張樹 :幾種可能的擴張樹 :

B C

A D

B C

A D

B D

A C

Page 20: 資料結構

G15 的 DFS 樹 G15 的 BFS 樹

Page 21: 資料結構

7-47-4  最小擴張樹  最小擴張樹 KruskalKruskal 演算法演算法

Page 22: 資料結構

PrimPrim 演算法 演算法

Page 23: 資料結構

SollinSollin 演算法演算法

Page 24: 資料結構

7-57-5  最短路徑  最短路徑 最短路徑 最短路徑 (shortest path) (shortest path) 又分成「某個頂又分成「某個頂點到其它頂點的最短路徑」和「任意兩個點到其它頂點的最短路徑」和「任意兩個頂點的最短距離」兩種情況。 頂點的最短距離」兩種情況。

以加權圖形表示城市之間的交通路線

Page 25: 資料結構

7-5-17-5-1 某個頂點到其它頂點的最短路徑 某個頂點到其它頂點的最短路徑

起點 終點 最短距離 最短路徑V0 V1 7 V0→V1

V2 3 V0→V2

V3 12 V0→V2→V3

V4 20 V0→V2→V4

V5 13 V0→V2→V5

V6 14 V0→V2→V5→V6

V7 24 V0→V2→V5→V7

Page 26: 資料結構

使用使用 DijkstraDijkstra 演算法求取某個頂點到其它頂演算法求取某個頂點到其它頂點的最短路徑:每次都要從尚未選擇的頂點點的最短路徑:每次都要從尚未選擇的頂點中選擇距離最短者中選擇距離最短者 Vx Vx ,然後檢查有沒有其,然後檢查有沒有其它尚未選擇的頂點它尚未選擇的頂點 ViVi 因為行經因為行經 VxVx 而使距而使距離變短,如此重複離變短,如此重複 V - 1V - 1 次,直到找出第次,直到找出第 V - V - 11 個頂點的最短路徑,整個演算法才宣告結個頂點的最短路徑,整個演算法才宣告結束。 束。

Page 27: 資料結構

7-5-27-5-2  任意兩個頂點的最短距 任意兩個頂點的最短距離 離

方法一:分別以加權圖形的每個頂點做為起始頂點方法一:分別以加權圖形的每個頂點做為起始頂點執行執行 DijkstraDijkstra 演算法。演算法。

方法二:使用方法二:使用 FloydFloyd 演算法,其步驟如下 :演算法,其步驟如下 :1. 使用 admatrix[V][V] 陣列存放加權圖形的相鄰矩陣。2. 定義 Ak[i][j] 為 Vi到 Vj的最短距離,而且中間只能經

過索引小於等於 k的頂點。3. 定義 A0[i][j] 為 admatrix[i][j] 。4. 根據下式依序求取 A0、 A1、…、 AV, AV即為最後的結

果。Ak[i][j] = min{ Ak-1[i][j], Ak-1[i][k] + Ak-1[k][j]}, k ≥ 1 且 A0[i][j] = 邊 (Vi, Vj) 的距離

Page 28: 資料結構

範例範例 7.187.18 :: [Floyd[Floyd 演算法演算法 ] ] 針對加權圖形針對加權圖形GG1717 找出任意兩個頂點的最短距離。 找出任意兩個頂點的最短距離。

Page 29: 資料結構

解答:解答:1. 3. 1. 3.

2. 4. 2. 4.

Page 30: 資料結構

7-67-6  拓樸排序  拓樸排序 頂點工作網路 頂點工作網路 (AOV(AOV 網路,網路, activity on vertex network) activity on vertex network) 前行者 前行者 (predecessor)(predecessor) 、後繼者 、後繼者 (successor)(successor) 立即前行者 立即前行者 (immediate predecessor) (immediate predecessor) 、立即後繼者 、立即後繼者 (imm(imm

ediate successor) ediate successor) 拓樸排序 拓樸排序 (topology sort)(topology sort) ,例如,例如 V0→V1→V2→V3→V4V0→V1→V2→V3→V4

→V5→V6→V7→V5→V6→V7 和和 V0→V1→V2→V3→V4→ V6→V5→V7 V0→V1→V2→V3→V4→ V6→V5→V7

計算機概論 離散數學

C 語言

微積分

資料結構

C++ 語言

工程數學

演算法

V3

V2

V1

V0

V4

V6

V7V5

Page 31: 資料結構

範例範例 7.207.20 :: [[ 拓樸排序拓樸排序 ] ] 針對有向圖形針對有向圖形 GG1818

找出其拓樸排序。找出其拓樸排序。1. 2. 1. 2.

1

20

V0

V1

V2

V3

V5

V6

V7

V4

1

3

1

1

1

G18

1

2

V1

V2

V3

V5

V6

V7

V4

1

3

0

0

0

Page 32: 資料結構

3. 4. 3. 4. 0

2

V2

V3

V5

V6

V7

V4

1

20

0

0

2

V3

V5

V6

V7

V4

1

1

0

5. 6. 5. 6. 2

V5

V6

V7

0

0

Page 33: 資料結構

7.7.

8.8.

9.9. 輸出輸出 V7V7 ,所有頂點均輸出完畢,得到拓樸排序為,所有頂點均輸出完畢,得到拓樸排序為VV00→V→V11→V→V22→V→V33→V→V44→V→V55→V→V66→V→V77 。 。

1

V6

V7

0

0

V7