View
256
Download
0
Embed Size (px)
Citation preview
第 7 章 圖形與網路第 7 章 圖形與網路
資料結構設計與 C++ 程式應用 版權所有 禁止重製
資料結構設計與 C++ 程式應用Fundamentals of Data Structures and Their Applications Using C++
資料結構設計與 C++ 程式應用Fundamentals of Data Structures and Their Applications Using C++
資料結構設計與 C++ 程式應用 版權所有 禁止重製
圖形的基本術語 • 圖形 (Graph)
– G = (V , E)
• 頂點 (Vertices ,或稱 Nodes)
• 邊 (Edges)
• 無向圖 (Undirected Graph)– (V1 ,V2)
• 有向圖 (Directed Graph)– <V1 ,V2>
A
EB
DC
A
B
C
資料結構設計與 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
資料結構設計與 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
資料結構設計與 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
資料結構設計與 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
鄰接串列
反鄰接串列
資料結構設計與 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
資料結構設計與 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)
資料結構設計與 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
資料結構設計與 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
資料結構設計與 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 擴張樹
資料結構設計與 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花費最少
擴張樹
資料結構設計與 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花費最少
擴張樹
資料結構設計與 C++ 程式應用 版權所有 禁止重製
最短路徑問題 (The Shortest Path Problem)
• 從一個城市出發到其他每一個城市之最短距離 (Single Source All Destination)– 從頂點 V 出發到達其餘每一個頂點之最短路徑之演算法為:
資料結構設計與 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] }。
資料結構設計與 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
資料結構設計與 C++ 程式應用 版權所有 禁止重製
最短路徑問題 (The Shortest Path Problem)
– 頂點 0 到其餘頂點之最短距離選取過程
– 頂點 0 到其餘頂點之最短路徑和距離
資料結構設計與 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] 便可知道任一頂點對之最短距離
資料結構設計與 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
資料結構設計與 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
資料結構設計與 C++ 程式應用 版權所有 禁止重製
有趣的圖形問題 • 柯尼斯伯格之橋
– 是否有人可以跨越 7座橋去拜訪四個城市,且每座橋只經過一次 ?– 尤拉定理:每個頂點的分支度皆為偶數時才可以
12
3
4
56
7
D
CA
B
1 2
3
4
5 6
7
D
A
B
C
資料結構設計與 C++ 程式應用 版權所有 禁止重製
有趣的圖形問題 • 彌爾頓 (Hamilton) 圖形
– 圖形中是否存在一條路徑可以拜訪每個頂點恰好一次?– 左圖:從 A 出發,經 B 、 C 到 D 恰好拜訪每個城市一次– 左圖:無解
12
3
4
56
7
D
CA
B
A
B
C D
E
F
G
為漢彌爾頓圖形及尤拉圖形 非漢彌爾頓圖形但為尤拉圖形
資料結構設計與 C++ 程式應用 版權所有 禁止重製
有趣的圖形問題 • 平面圖
定理 1 :一個平面圖的區域度數總和等於兩倍邊數和。定理 2 : (尤拉公式 ) 一個平面圖滿足下列公式 頂點個數 - 邊數個數 + 區域個數 = 2定理 3 :一個平面圖若邊的個數大於等於 2 ,則滿足 3/2 * 區域個數 ≦ 邊的個數 ≦ 3 * 頂點個數 – 6定理 4 : (庫托斯基定理 )
一個圖形是非平面的若且唯若它含有一個和 K3 或 K5同構之子圖,
其中 K3 , K5均為設施圖。
(a) K 3 (b) K 5
資料結構設計與 C++ 程式應用 版權所有 禁止重製
有趣的圖形問題 • 平面圖
– (a) 與 (b) 為平面圖– (c)非平面圖
r 1
r 2
r 4r 3
(a) (b) (c)
資料結構設計與 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
黃
黃 黃黃藍
藍
藍
藍