25
第 7 第 第第第第第 第第第第第第第 C++ 第第第第 第第第第 第第第第 第第第第第第第 C++ 第第第第 Fundamentals of Data Structures and Their Ap plications Using C++

第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

  • View
    256

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

第 7 章 圖形與網路第 7 章 圖形與網路

資料結構設計與 C++ 程式應用 版權所有 禁止重製

資料結構設計與 C++ 程式應用Fundamentals of Data Structures and Their Applications Using C++

資料結構設計與 C++ 程式應用Fundamentals of Data Structures and Their Applications Using C++

Page 2: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

圖形的基本術語 • 圖形 (Graph)

– G = (V , E)

• 頂點 (Vertices ,或稱 Nodes)

• 邊 (Edges)

• 無向圖 (Undirected Graph)– (V1 ,V2)

• 有向圖 (Directed Graph)– <V1 ,V2>

A

EB

DC

A

B

C

Page 3: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

圖形的基本術語 • 完全圖 (Complete Graph)• 路徑 (Path)• 路徑之長度 (Path Length)• 簡單路徑 (Simple Path) • 迴路 (Cycle) • 相連的 (Connected) • 相連單元 (Connected Component) • 子圖 (Subgraph)• 緊密相連 (Strongly Connected) • 緊密相連單元 (Strongly Connected Component)• 出分支度 (Out Degree)• 入分支度 (In Degree)

A

B

C

A

EB

DC

D

CB

AB

C

Page 4: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

圖形的表示法 • 鄰接矩陣表示法

D

C

B

A

DC

BA

0 01 11 10 10 01 01 01 0

A B C DABCD

0 11 11 00 00 00 00 01 0

A B C DABCD

Page 5: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

圖形的表示法 • 鄰接串列表示法

D

C

B

A

DC

BA

A C D 0

B D 0

B 0

A B 0

頂點串列A

B

C

D

A 0

B C

0

B 0

頂點串列A

B

C

D

D 0

Page 6: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

圖形的表示法 • 鄰接串列與反鄰接串列

DC

BA

A 0

B C

0

B 0

頂點串列A

B

C

D

D 0

A

B 0

A 0

頂點串列A

B

C

D

D 0

A 0

鄰接串列

反鄰接串列

Page 7: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

圖形的表示法 • 鄰接複串列表示法

– 邊節點 標記欄 V x V y V x鏈結欄 V y鏈結欄 D

C

B

AN1 N2

N3N4

A

頂點串列

A

B

C

D

B N2 N3

N1

A D 0 N3

N2

邊 (A,B)

邊 (A,D)

B D N4 0 邊 (B,D)N3

N4

B C 0 0 邊 (B,C)

頂點串列

A

B

C

D

A B

N1

A D 0

N2

B D 0

N3 N4

B C 0 0

Page 8: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

圖形追蹤• 先深後廣搜尋法 (Depth First Search ,簡稱 DFS)

1. 選擇一個頂點 VX 當做起始點,並做一個已拜訪過的記號。2. 在所有與 VX 相連且未被拜訪過的頂點中任選一個頂點,令 VY ,

做一個已拜訪過的記號,並以 VY 為新的起點進行先深後廣搜尋。 • 堆疊

C

E

B

A

D F

G H

A CB

A

CE

B

D

D G

CEG

CEE

E

CEHC

CEHF

C F

CEHH

H

CEH

:拜訪

(1) (2) (3) (4) (5) (6) (7) (8) (9)

Page 9: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

圖形追蹤• 先廣後深搜尋法 (Breadth First Search ,簡稱 BFS)

1. 選擇一個起始頂點 VX ,並做一個已拜訪過的記號。2. 將所有與 VX 相連的頂點放入佇列。3. 重複步驟 4 直到佇列空了為止。 4. 從佇列取出一個頂點 VX ,做一個已拜訪過的記號,並將與 VX 相連且未

拜訪過的頂點放入佇列中。 • 佇列

C

E

B

A

D F

G H

front rear(1)

(2) B C

拜訪A

B

(3) DC CE

(4) D E DE F

A

(5) E

(6)

F(7)

G(8)

H

(9)

(10)

EE GF

FE

H

G

GF

G

H

G H

G H

G H

G H

H H

Page 10: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

擴張樹 (Spanning Tree) • 擴張樹

– 一個包含 N 個頂點的無向相連圖,我們可以找出用圖中的 N-1 個邊來連接所有頂點的樹

– 若再加入圖形中其餘的邊到擴張樹中必會形成迴路 – 擴張樹中的任兩個頂點間都是相連的,也就是存在一條路徑可通,但

此一路徑不一定是原圖形中該兩頂點之最短路徑。

CB

A

D

CB

A

D

CB

A

D

CB

A

D

CB

A

D

CB

A

D

CB

A

D

CB

A

D

CB

A

D

G T1 T2 T3 T4

T5 T6 T7 T8

Page 11: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

擴張樹 (Spanning Tree) • 擴張樹

C

E

B

A

D F

G H

C

E

B

A

D F

G H

C

E

B

A

D F

G H

DFS 擴張樹

BFS 擴張樹

Page 12: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

花費最少擴張樹 (Minimum Cost Spanning Tree) • 花費最少擴張樹

– P 氏法 (Prim's Method) 1. 令 A=V , B=ψ , T=ψ 。2. 從 A 中任選一個頂點,將之從 A 搬移到 B ,並加入 T 。3. 找出一條連接 A 和 B 的最少花費邊 (a,b) ,其中 aA , bB ,

且邊 (a,b) 加到 T 不會造成迴路。4. 將頂點 a 自 A 搬移到 B ,並將頂點 a 與邊 (a , b) 加入 T 。5. 重複步驟 3 、 4 直到 A=ψ 。

3 5

61A B C

D

E F G

2

12 8

1

2

5

33

A 1 B

D

1

E

2

F

3G

3

C

5花費最少

擴張樹

Page 13: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

花費最少擴張樹 (Minimum Cost Spanning Tree)• 花費最少擴張樹

– K 氏法 (Kruskal’s Method) 1. 令花費最少擴張樹 T=ψ 。 2. 從 E 中選取花費最少的邊 (VX ,VY) 。 3. 如果 (VX,VY) 不會使 T 產生迴路則將之加到 T 中;

否則,自 E 中刪除之。4. 重複步驟 2 、 3 ,直到 T 的邊數等於 N-1 為止。

3 5

61A B C

D

E F G

2

12 8

1

2

5

33

A 1 B

D

1

E

2

F

3G

3

C

5花費最少

擴張樹

Page 14: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

最短路徑問題 (The Shortest Path Problem)

• 從一個城市出發到其他每一個城市之最短距離 (Single Source All Destination)– 從頂點 V 出發到達其餘每一個頂點之最短路徑之演算法為:

Page 15: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

最短路徑問題 (The Shortest Path Problem)

1. 設定花費矩陣 COST 之初值,即對於每一個邊,令 COST[i][j]= 邊 <i,j> 之距離,若 <i,j> E(G) 。 COST[i][j]=∞ ,若 <i,j> E(G) 。2. 設定 MARK 和 DIST 兩矩陣之初值,即對每一頂點令 MARK[i]=0;

DIST[i]=COST[V][i];

3. 處理起始頂點 V ,即令 NODE=2;

MARK[V]=1;

DIST[V]= 0;

4. 當 NODE < N 時重複步驟 5 、 6 、 7 。5. 選取一個頂點 U ,使得 U 是所有未被選取之頂點中 DIST[U] 是最少 者,即 DIST[U] = min {DIST[W]} , MARK[W] = 0 。 6. 將頂點 U 做上記號,即令 MARK[U]=1 。 NODE = NODE+1 。7. 更新剩餘未被選取的頂點 (MARK[W]=0) 之距離矩陣值,即令 DIST[W]=min { DIST[W] , DIST[U]+COST[U][W] }。

Page 16: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

最短路徑問題 (The Shortest Path Problem)

– 從頂點 0 到其餘每一個頂點之最短徑和花費 1

0 7

6

2

5

3

4

160

30

50 80

53 66

60

50

180

800

180

120

140

100

COST =

0 1 2 3 4 5 6 7

01234567

∞∞∞∞∞∞∞

160∞∞∞∞∞∞

∞∞∞

∞∞

∞∞

∞∞∞∞∞

∞∞

∞∞

∞∞

∞∞∞

∞∞∞∞∞∞

∞∞∞∞∞∞∞120

180

66

60 80050

180

53

100140

50

80

30

Page 17: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

最短路徑問題 (The Shortest Path Problem)

– 頂點 0 到其餘頂點之最短距離選取過程

– 頂點 0 到其餘頂點之最短路徑和距離

Page 18: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

最短路徑問題 (The Shortest Path Problem)

• 任兩頂點對之最短距離 (All Pairs Shortest Paths)– 設頂點編號為 0 , 1 , 2 ,…, N-1– 令 A-1[i][j]=COST[i][j]– 並求出 AK[i][j]– AK[i][j]= min { AK-1[i][j] + AK-1[i][k] + AK-1[k][j] }, 0≦k≦N-1 。 – A-1[i][j] 是頂點 i 至頂點 j 之直通距離 – AK[i][j] 是頂點 i 到 j 的最短距離,並且此最短路徑所通過之頂點編

號不超過 K – AN-1[i][j] 便可知道任一頂點對之最短距離

Page 19: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

最短路徑問題 (The Shortest Path Problem)

• 任兩頂點對之最短距離 (All Pairs Shortest Paths)– 由 A3 得知頂點 0 到頂點 3 之最短距離為 11 ,– 頂點 3 到頂點 1 之最短距離為 2

0

1

15 5

2

3

1

2

1

7 13

38

0

0 1 2 3

0123

531

1501

8

01

∞2

0

73

(b) A -1

0

0 1 2 3

531

1501

8

01

∞2

0

73

16

(c) A 0

0123

(a)

0

0 1 2 3

531

1501

8

01

172

0

73

16

(d) A 1

0

0 1 2 3

531

901

8

01

112

0

73

2

(e) A 2

0

0 1 2 3

331

901

8

01

112

0

33

2

(f) A 3

0123

0123

0123

Page 20: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

工作網路和拓樸排序 (Activity Network and Topological Sort) • 頂點工作網路 (Activity On Vertex Network) ,簡稱 AOV

網路– 以頂點來代表工作項目– A 、 B 、 C 、 D 、 E 分別代表五個工作項目– 要待 A 、 B 都完成之後 C 才跟隨 A 、 B 之後完成,因此稱 A 、 B

為 C 的立即先行者 (Immediate Predecessor) – C 為 A 、 B 的立即後繼者 (Immediate Successor)– 拓樸排序:維持 AOV 網路上各頂點之先後關係並依工作項目完成之

先後加以排序– 拓樸排序結果為 A 、 B 、 C 、 D 、 E 或 B 、 A 、 C 、 D 、 E 。

A

B

C

D

E

Page 21: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

有趣的圖形問題 • 柯尼斯伯格之橋

– 是否有人可以跨越 7座橋去拜訪四個城市,且每座橋只經過一次 ?– 尤拉定理:每個頂點的分支度皆為偶數時才可以

12

3

4

56

7

D

CA

B

1 2

3

4

5 6

7

D

A

B

C

Page 22: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

有趣的圖形問題 • 彌爾頓 (Hamilton) 圖形

– 圖形中是否存在一條路徑可以拜訪每個頂點恰好一次?– 左圖:從 A 出發,經 B 、 C 到 D 恰好拜訪每個城市一次– 左圖:無解

12

3

4

56

7

D

CA

B

A

B

C D

E

F

G

為漢彌爾頓圖形及尤拉圖形 非漢彌爾頓圖形但為尤拉圖形

Page 23: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

有趣的圖形問題 • 平面圖

定理 1 :一個平面圖的區域度數總和等於兩倍邊數和。定理 2 : (尤拉公式 ) 一個平面圖滿足下列公式 頂點個數 - 邊數個數 + 區域個數 = 2定理 3 :一個平面圖若邊的個數大於等於 2 ,則滿足 3/2 * 區域個數 ≦ 邊的個數 ≦ 3 * 頂點個數 – 6定理 4 : (庫托斯基定理 )

一個圖形是非平面的若且唯若它含有一個和 K3 或 K5同構之子圖,

其中 K3 , K5均為設施圖。

(a) K 3 (b) K 5

Page 24: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

有趣的圖形問題 • 平面圖

– (a) 與 (b) 為平面圖– (c)非平面圖

r 1

r 2

r 4r 3

(a) (b) (c)

Page 25: 第 7 章 圖形與網路 資料結構設計與 C++ 程式應用 版權所有 禁 止重製 資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications

資料結構設計與 C++ 程式應用 版權所有 禁止重製

有趣的圖形問題 • 彩色圖

– N- 可著色:一平面圖若最少要用 N 種顏色才能使相鄰區域之顏色互異

– 4- 可著色 – (a) 相當於 (b) ,是非平面圖,無法著色 – (c) 可改成 (d) ,為一平面圖,可以著色

(a)

A B C

D E F

A B C

D E F

(b)

A

C

D

F

B

E

(c)

A

C

D

F

B

E

(d)

A

C

D

F

B

E

(e)

r 1

r 2

r 3

r 4r 5 r 6

r 7

r 8

黃 黃黃藍