圖形與網路
DESCRIPTION
Chapter 7. 圖形與網路. 7.1 前言. 圖形 (Graph) 結構具有以下重要特徵: 圖形結構基本上是由 頂點 (Vertices) 與 邊 (Edges) 兩個部分所構成 。 圖形結構是否具有方向性來將圖形結構分成兩大類: 無向圖 (Undirected Graph) 與 有向圖 (Directed Graph) 。 圖形的另一特點是資料也可以儲存在圖形的個別邊上。邊上的資料可用以表示從這個邊的一個頂點至另一個頂點的 花費 ( 或成本 ) 。 這種成本存在邊上的圖形稱為 「網路」 。. 7.2 圖形的基本術語. - PowerPoint PPT PresentationTRANSCRIPT
資料結構導論 - C語言實作 1
圖形與網路
Chapter 7
資料結構導論 - C語言實作 2
7.1 前言 圖形 (Graph) 結構具有以下重要特徵:
圖形結構基本上是由頂點 (Vertices) 與邊(Edges) 兩個部分所構成 。
圖形結構是否具有方向性來將圖形結構分成兩大類:無向圖 (Undirected Graph) 與有向圖 (Directed Graph) 。
圖形的另一特點是資料也可以儲存在圖形的個別邊上。邊上的資料可用以表示從這個邊的一個頂點至另一個頂點的花費 ( 或成本 ) 。
這種成本存在邊上的圖形稱為「網路」 。
資料結構導論 - C語言實作 3
7.2 圖形的基本術語圖形 (Graph) 可利用頂點 (Vertices ,或稱 Nodes) 與邊 (Edges) 來加以描述,也就是說圖形可以視為由頂點和邊所組成的集合 。
圖形結構會根據邊是否有方向性來區分為有向圖 (Directed Graph) 和無向圖 (Undirected Graph) 兩類。
資料結構導論 - C語言實作 4
7.2.1 無向圖的基本概念 一個無向圖 G = (V , E)
V 是所有頂點所組成的集合E 代表所有的邊所組成的集合
無向圖的邊可以利用 (V1 ,V2) 或 (V2 ,V1)來表示,其中 V1 ,V2 V
│V│ 來表示此無向圖的頂點的個數 │E│ 代表此無向圖邊的個數
資料結構導論 - C語言實作 5
無向完全圖無向完全圖 (Undirected Complete Grap
h)一個無向圖 G = (V , E) 其圖形中每一個節點均與其他的節點直接相連
也就是任意一個節點會與透過 |V|-1 條邊與其他的節點相連接
一個包含 N 個頂點的無向完全圖總共會有 N(N-1)/2 個邊。 A
EB
DC
圖 7.1 無向完全圖
資料結構導論 - C語言實作 6
分支度 , 路徑 , 長度無向圖中頂點的分支度 (Degree)
紀錄了連接該頂點的邊之數目無向圖中共邊的兩點 (V1 ,V2) 而言
稱 V1 和 V2 兩頂點相鄰 (Adjacent)
VX 到 VY 的路徑 (Path)從頂點 VX 到頂點 VY 所經過的頂點串列路徑所經過之邊的總數為該路徑之長度
(Path Length)
資料結構導論 - C語言實作 7
簡單路徑 , 迴路在無向圖中的任一條路徑其起點和終點可以相同
簡單路徑 (Simple Path)若是某一給定的路徑除了起點和終點外,其餘的頂點均只經過一次的路徑
迴路 (Cycle)若是一個簡單路徑的起點與終點是相同的我們將它稱為一個迴路
資料結構導論 - C語言實作 8
7.2.1 無向圖的基本概念一個無向圖中如果任意兩個頂點 VX 與
VY 間有路徑相通,則稱 頂點 VX 和 VY 是相連的 (Connected) 。
如果一個無向圖中任意兩個頂點皆是相連,則我們稱這個無向圖是相連的無向圖 (Connected Graph) 。
資料結構導論 - C語言實作 9
7.2.1 無向圖的基本概念一個無向圖不是相連的,此無向圖會由兩個或兩個以上的不交集的相連子圖所組成。
個別相連子圖 (Connected Subgraph) 也可稱為相連單元 (Connected Component) 。
資料結構導論 - C語言實作 10
7.2.2 有向圖的基本概念 一個有向圖 G = (V , E)
V 是所有頂點所成的集合E 代表所有的邊所成的集合
有向圖的邊是利用 <V1 ,V2> 來描述,表從 V1 到 V2 有路可通<V1 ,V2> 與 <V2 ,V1> 是不同的,因為有向圖的邊是具有方向性的
│V│ 來表示此有向圖的頂點的個數 │E│ 代表此有向圖邊的個數
資料結構導論 - C語言實作 11
7.2.2 有向圖的基本概念有向圖中邊是具有方向性的有向圖的表示法中路徑 (Path) 也是具有方向性在有向圖中從頂點 VX 到頂點 VY 所經過的頂點串列稱之為 VX 到 VY 的路徑 (Path) 。
而路徑所經過之邊的總數為該路徑之長度(Path Length) 。
C
B
A
圖 7.2 有向圖
資料結構導論 - C語言實作 12
7.2.2 有向圖的基本概念有向圖中的任一條路徑其起點和終點可以相同
若是某一給定的路徑除了起點和終點外,其餘的頂點均只經過一次的路徑稱之為簡單路徑 (Simple Path)
若是一個簡單路徑的起點與終點是相同的我們將它稱為一個迴路 (Cycle)
資料結構導論 - C語言實作 13
7.2.2 有向圖的基本概念一個有向圖 G = (V , E) 其圖形中每一個節點均與其他的節點直接相連任意一個節點會與透過 |V|-1 條邊與其他的節點相連接
這樣的有向圖我們將之稱為有向完全圖 (Directed Complete Graph)
我們發現一個包含 N 個頂點的有向完全圖總共會有 N(N-1) 個邊 B
DC
A
圖 7.3 有向完全圖 (Directed Complete Graph)
資料結構導論 - C語言實作 14
7.2.2 有向圖的基本概念在無向圖和有向圖表示中,針對頂點分支
度 (Degree) 的定義是不同的無向圖因為一個邊表示兩個頂點互相連通
所以只有定義個別頂點的分支度在有向圖中的頂點分支度分成
出分支度 (Out Degree) 和入分支度 (In Degree) 兩部分
資料結構導論 - C語言實作 15
7.2.2 有向圖的基本概念有向圖的任意兩個頂點 VX 和 VY , VX 到 VY 存在一條路徑可以連通這兩個節點,且 VY 到 VX 也有路徑可以連通,稱此有向圖為緊密相連(Strongly Connected) 。
一個非緊密相連的有向圖中,其中具有緊密相連關係的最大子圖稱緊密相連單元 (Strongly Connected Component) 。
B
A
圖 7.2 的緊密相連單元 (Connected Component)
資料結構導論 - C語言實作 16
7.3 圖形的表示法7.3.1 相鄰矩陣表示法 (Adjacent Matrix)7.3.2 相鄰串列表示法7.3.3 相鄰複串列表示法
資料結構導論 - C語言實作 17
7.3.1 相鄰矩陣表示法 (Adjacent Matrix)
利用一個大小是 NN 的二維陣列 DATA來表示一個包含 N 個頂點的圖形若在給定的圖形中頂點 i 到頂點 j 是相連
的 ( 存在一個邊連接這兩個頂點 ), 陣列對應元素 DATA[i][j] 會被設定為 1
否則 DATA[i][j] 會被設定為 0
資料結構導論 - C語言實作 18
7.3.2 相鄰串列表示法
圖 7.5 (a) 無向圖 G1 (b) 有向圖 G2
D
C
B
A
CB
DA
0 01 11 10 10 01 11 11 0
A B C DABCD
圖 7.5(a) 中無向圖 G1 之相鄰矩陣表示結果
資料結構導論 - C語言實作 19
7.3.2 相鄰串列表示法相鄰串列表示法 (Adjacent List) 是利用串列結構來紀錄給定的圖形中頂點的相鄰關係
相鄰矩陣中矩陣元素 DATA[i][j] 值為 1表示對應的頂點 i 與頂點 j 是相連的
A C D 0
B D 0
B
A B
頂點串列A
B
C
D
D 0
B 0
C 0A
頂點串列A
B
C
D
D 0
C 0
B 0
無向圖的相鄰串列表示法 有向圖的相鄰串列表示法
資料結構導論 - C語言實作 20
7.3.3 相鄰複串列表示法相鄰複串列的結構中個別節點是用以表示給定圖形的一個邊的資料,因此相鄰複串列的節點又被稱為邊節點
它包含了標記欄,邊的頂點欄 VX,邊的頂點欄 VY , VX鏈結欄和 VY鏈結欄等五個欄位
標記欄 Vx Vy Vx鏈結欄 Vy鏈結欄
圖 7.10 相鄰複串列的邊節點結構
資料結構導論 - C語言實作 21
7.3.3 相鄰複串列表示法
D
C
B
AN1 N2
N3N5 N4
A
頂點串列
A
B
C
D
B N2 N3
N1
A D 0 N3
N2
邊 (A,B)
邊 (A,D)
B D N5 N4
邊 (B,D)
N3
N4
C D N5 0 邊 (C,D)
N5
C 0 0 邊 (B,C)B
(a) 無向圖 (b) 圖 7.11(a) 的相鄰複串列表示法
圖 7.11 相鄰複串列
資料結構導論 - C語言實作 22
7.3.3 相鄰複串列表示法
頂點串列
A
B
C
D
A B
N1
A D 0
N2
B D 0
N3 N4
C D 0
N5
B C 0 0
圖 7.12 相鄰複串列
資料結構導論 - C語言實作 23
7.4 圖形追蹤 (Graph Traversal)
從圖形之某一個頂點 VX出發,找尋所有可以從 VX到達的頂點,這樣的動作我們稱它為圖形的追蹤 (Graph Traversal)
常見圖形追蹤方法有兩種:深度優先搜尋法 (Depth First Search, DFS)廣度優先搜尋法 (Breadth First
Search,BFS)
資料結構導論 - C語言實作 24
7.4.1 深度優先搜尋法1. 假設 VX是起始搜尋頂點,設定此頂點已
被拜訪過。 2. 從與起始搜尋頂點 VX連接且未被拜訪過
的頂點中選出一個頂點。假設該頂點為 VY,設定此頂點已被拜訪過。並記錄其前一個搜尋頂點是 VX,以 VY為新的搜尋頂點進行深度優先搜尋。
3. 如果與頂點 VX連接的頂點皆已被拜訪過,則回到頂點 VX的前一個被搜尋頂點。假設此頂點是 Vz,則以 Vz為新的起點搜尋頂點進行深度優先搜尋。
資料結構導論 - C語言實作 25
7.4.1 深度優先搜尋法我們發現深度優先搜尋法可以利用堆疊
(Stack) 來記錄深度優先搜尋過程中的資訊,並以遞迴 (Recursive) 的方式進行圖形追蹤的處理 。
透過深度優先搜尋法的追蹤可將給定的圖形分割成為一棵樹或是一片樹林,我們將這兩種狀況分別稱為深度優先擴張樹 (Depth First Spanning Tree) 以及深度優先擴張樹林 (Depth First Spanning Forest) 。
資料結構導論 - C語言實作 26
7.4.1 深度優先搜尋法
C
E
B
A
D F
G H
I
A CB
A
CE
B
D
D G
CEG
CEI
E
CE
HC
CE
HF
C F
CE
HH
H
CE
:拜訪
(1) (2) (3) (4) (5) (6) (7) (8) (9)
CE
I
(10)
EI I I
HI
IHI
深度優先追蹤過程
A , B , D , G , E , C , F , H , I 是本例找到的一組解
資料結構導論 - C語言實作 27
7.4.2 廣度優先搜尋法1. 選擇一個起始頂點 VX,並設定此頂點
已經被拜訪過。 2. 將與 VX相連的所有頂點放入佇列。 3. 若佇列不是空的則從佇列取出一個頂點
VY,並設定此頂點已被拜訪過。並將與 VY相連且未拜訪過的頂點放入佇列中。
4. 重複步驟 3 直到佇列是空的。
資料結構導論 - C語言實作 28
7.4.2 廣度優先搜尋法廣度優先搜尋法 BFS 可以使用佇列
(Queue) 的概念來搜尋相連的頂點,上一節所介紹的深度優先搜尋法 DFS 則是使用堆疊的概念來搜尋相鄰的頂點。
廣度優先搜尋法的追蹤可以將圖形分割成為一棵樹或是一片樹林,我們將這兩種狀況分別稱為廣度優先擴張樹(Breadth First Spanning Tree) 以及廣度優先擴張樹林 (Breadth First Spanning Forest) 。
資料結構導論 - C語言實作 29
7.4.2 廣度優先搜尋法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
E
B
A
D F
G H
II
I
(11) H I
(12) I I
I
I
(13) I
廣度優先追蹤過程
A , B , C , D , E , F , G , H , I 是本例找到
的一組解
資料結構導論 - C語言實作 30
7.5 擴張樹和花費最少擴張樹 一個無向相連圖 (Undirected Connected
Graph)G = (V,E)其中 |V|=N 而且 |E| N-1
我們可以利用圖形中的 N-1 個邊建立一棵可以連接所有頂點的樹,我們將這樣的一棵樹稱為擴張樹 (Spanning Tree)
資料結構導論 - C語言實作 31
7.5 擴張樹和花費最少擴張樹 擴張樹具有下列基本的特性: 1.若要加入圖形中其餘的邊到擴張樹中必會形成
迴路 (Cycle)
2.擴張樹中的任兩個頂點間都是相連的 也就是存在一條路徑可通,但此一路徑不一定是原
圖形中該兩頂點之最短路徑
(a) DFS 擴張樹 (b) BFS 擴
張樹
資料結構導論 - C語言實作 32
圖形與樹的差異 樹的子樹間除了透過共同的樹根外,沒
有其他方法可以讓個別子樹相連 如果將兩個子樹的節點直接相連,就變
成圖形,不再是樹 樹狀結構中是不允許迴路存在的
(a) DFS 擴張樹 (b) BFS 擴
張樹
資料結構導論 - C語言實作 33
產生擴張樹的方法 DFS 與 BFS 擴張樹
依照 DFS 與 BFS 搜尋方法所找出的頂點順序,循序地挑選對應的邊,即可產生
針對給定的圖,其 DFS 與 BFS 擴張樹不是唯一 因為 DFS 與 BFS 搜尋法針對給定的圖的頂點順序是
不唯一的
C
E
B
A
D F
G H
I
C
E
B
A
D F
G H
I(a) DFS 擴張樹 (b) BFS 擴
張樹
資料結構導論 - C語言實作 34
7.5 擴張樹和花費最少擴張樹
CB
A
D
G
T1 T2 T3 T4
T5 T6 T7 T8
CB
A
D
CB
A
D
CB
A
D
CB
A
D
CB
A
D
CB
A
D
CB
A
D
T9 T10 T11 T12
CB
A
D
CB
A
D
CB
A
D
CB
A
D
CB
A
D
擴張樹 |E|= |V| -1
資料結構導論 - C語言實作 35
7.5 擴張樹和花費最少擴張樹一個給定的網路所建立的花費最少擴張
樹 (Minimum Cost Spanning Tree) 指的是在所有可能的擴張樹中其個別邊的加權值總和 (即總成本 ) 最少的
花費最少擴張樹的所有邊的加權值之總和會是所有可能的擴張樹中最少的
但是不表示在最少成本擴張樹中連接任意兩頂點的成本一定會最少
資料結構導論 - C語言實作 36
7.5.1 Prim's Method
給定一個網路 G=(V, E) ,其中 V 是頂點的集合而 E 是邊的集合。每個邊都有其對應的成本1. 令 A=V , B= , T= ,其中為空集合 2. 從 A 中任選一個頂點 VX,將之從 A搬移
到 B ,並將此頂點加入花費最少擴張樹 T
3. 找出一條連接 A 和 B 的最少花費邊 (VY,Vz) ,其中 VY A , Vz B ,且邊(VY,Vz) 加到 T 不會造成迴路
資料結構導論 - C語言實作 37
7.5.1 Prim's Method4. 將頂點 VY 自 A搬移到 B ,並將頂點 VY與邊
(VY,Vz) 加入 T 。5. 重複步驟 (3)-(4) 直到 A= 。
9
3
6A B
C
D E
8
4
2
5
7
3
A B
C
D E
4
2
5
(a) G (b) G 的花費最少擴張樹
T
最少成本擴張樹中並非連接任意兩頂點的成本一定會最少
資料結構導論 - C語言實作 38
7.5.2 Kruskal’s Method 從網路 G=(V,E) 中挑選出前 N-1 個花費較
少並且不會產生迴路 (Cycle) 的邊,循序地將這些邊以及相關頂點加入擴張樹 T 中即可建立出花費最少的擴張樹1. 令花費最少擴張樹 T= 。 2. 從網路的邊集合 E 中選取其中花費最少的邊
(VX ,VY) 。 3. 測試如果將這個邊 (VX,VY) 加入到擴張樹 T 中會不
會產生迴路。若不會產生迴路則將這個邊與相關頂點加入到 T 中,否則從網路的邊集合 E 中刪除(VX,VY) 。
4. 重複步驟 (2)-(3) ,直到擴張樹 T 的邊數等於 N-1 為止。
資料結構導論 - C語言實作 39
7.5.2 Kruskal’s Method
C
D
2
3
C
D E
2
3
A
C
D E
4
2
3
A B
C
D E
4
2
5
(a) (b)
(c) (d)
9
3
6A B
C
D E
8
4
2
5
7
資料結構導論 - C語言實作 40
7.6 最短路徑問題在圖形網路的應用中我們有時需要找出
任意兩個頂點間的最短距離從某一個特定的頂點到其他所有頂點的距離
為了找出圖形網路中單一節點與其他所有頂點的最短距離以及圖形網路中任兩個頂點的最短距離,我們將在下面的段落詳細地介紹這兩個問題的解決方法
資料結構導論 - C語言實作 41
7.6.1 單一頂點到其他頂點之最短距離 一個有向網路 G = (V,E) 為了找出這個網路中的某個特定頂點到其他所有頂點之最短距離
用一個二維的成本相鄰矩陣 COST[N][N]來儲存N=|V|針對網路中所有的有向邊 (i,j) 將這個邊的成本存入 COST[i][j]
否則 COST[i][j] = ∞
資料結構導論 - C語言實作 42
7.6.1 單一頂點到其他頂點之最短距離利用一維陣列 FLAG[N] 來紀錄個別頂點的狀態若起點到第 i 個頂點的最短距離已經被找出來則 FLAG[i]=1
否則 FLAG[i]=0
利用一個一維陣列 DIST[N] 來存放從起始頂點到達頂點 i 之最短路徑
資料結構導論 - C語言實作 43
7.6.1 單一頂點到其他頂點之最短距離1. 設定成本矩陣 COST 之起始值,即對於每一個邊,令
COST[i][j]= 邊 <i,j> 之距離,若 <i,j>E
COST[i][j]=∞ ,若 <i,j>E
2. 設定 FLAG 和 DIST 兩矩陣之初值,即對每一頂點 i
FLAG[i]=0
DIST[i]=COST[s][i] ,其中 s 是起始頂點
資料結構導論 - C語言實作 44
7.6.1 單一頂點到其他頂點之最短距離3. 處理起始頂點 s ,設定
cnt = 1
FLAG[s]=1
DIST[s]=0
4. 選取一個頂點 x ,使得 x 是所有未被選取之頂點中 DIST[x] 是最少者
DIST[x] = min {DIST[y]}
其中 FLAG[y] = 0
資料結構導論 - C語言實作 45
7.6.1 單一頂點到其他頂點之最短距離5. 處理挑選出的頂點 x ,設定
FLAG[x]=1
cnt = cnt + 1
6. 更新尚未被選取的頂點 (FLAG[y]=0) 之距離矩陣值,即令
DIST[y]=min { DIST[y] , DIST[x]+COST[x][y]}
7. 當 cnt < N 時重複步驟 (4)-(6)
資料結構導論 - C語言實作 46
7.6.1 單一頂點到其他頂點之最短距離
1
0
2
3
4
5
6
80
40
50 60
70
30
10
40
20
80
90 COST =
∞
0 1 2 3 4 5 6
0123456
∞∞∞∞∞∞
80
∞20
∞∞∞∞
40
∞∞∞
∞
∞40
∞60
∞∞
∞∞
∞
∞
∞∞
70
∞∞
∞∞90
1030
∞
∞
80
50
∞
∞∞
∞
∞
∞
G 的成本相鄰矩陣 網路圖 G
資料結構導論 - C語言實作 47
7.6.1 單一頂點到其他頂點之最短距離
資料結構導論 - C語言實作 48
7.6.1 單一頂點到其他頂點之最短距離
資料結構導論 - C語言實作 49
7.6.2 任意兩頂點之最短距離 有向網路圖形中,要找出任意兩個頂點的最短距離可以利用單一頂點到其他任何頂點的最短距離的做法
依序分別以每一個頂點當做起始頂點,便可找出任兩頂點的最短路徑和距離
資料結構導論 - C語言實作 50
7.6.2 任意兩頂點之最短距離首先,我們會將給定有向網路 G = (V,E)的所有頂點加以編號假設有 N 個頂點,其編號依序為 0, 1, 2, …,
N-1
另外,我們利用一個二維的成本相鄰矩陣 COST[N][N] 來紀錄頂點間的距離如果存在一個邊 <i,j>E 則將 <i,j> 之距離存
入 COST[i][j]否則 COST[i][j]=∞
資料結構導論 - C語言實作 51
7.6.2 任意兩頂點之最短距離為了找任兩個頂點 i 和 j 經過不同編號節點的最短距離,我們定義陣列 AK[N][N] 其中個別元素 AK[i][j] 是頂點 i 到 j 的最短距離
其經過的頂點編號不超過 K
定義 A-1[i][j]=COST[i][j]上述的二維陣列的它們具有一個重要的特性
AK[i][j]= min { AK-1[i][j] , (AK-1[i][K] + AK-1[K][j])} , 0 k N-1≦ ≦
資料結構導論 - C語言實作 52
7.6.2 任意兩頂點之最短距離1
0
45
3
2
9
12
153
2
49
0
0 1 2 3
0123
46
5
09
03
129
02
4
(b) A-1 (c) A0(a)
6
∞∞
15
0
0 1 2 3
0123
46
5
09
03
129
02
4
1311
15
(d) A1 (e) A2 (f) A3
0
0 1 2 3
0123
46
5
09
03
129
02
4
1311
8
0
0 1 2 3
0123
46
5
09
03
119
02
4
1311
8
0
0 1 2 3
0123
46
5
09
03
119
02
4
126
8
任兩頂點之最短距離
資料結構導論 - C語言實作 53
7.7 工作網路和拓樸排序 頂點工作網路 (Activity On Vertex
Network) ,簡稱 AOV 網路
AOV 網路以及其對應相鄰矩陣表示法
資料結構導論 - C語言實作 54
7.7 工作網路和拓樸排序 立即先行者 (Immediate
Predecessor) 立即後繼者 (Immediate Successor) 拓樸排序的處理步驟
1. 任選一個沒有先行者之頂點,將之輸出,並自 AOV 網路中刪除該頂點以及與該頂點相連接的邊
2. 重複步驟 (1) 直到 AOV 網路的 N 個頂點皆已經被處理為止
資料結構導論 - C語言實作 55
7.7 工作網路和拓樸排序
0
A B C D
ABCD
000
1
00
1
00
01
0
0
0
0
E
01
01
E 0 0 00 0
F
00
11
1F 0 0 00 0 0
(a) (b)
B C D
BCD
00 0
0
1
0
0
0
0
E
1
01
E 0 00 0
F
0
11
1F 0 00 0 0
(c)
(d) (e)
FF 0
(f)
C DCD
00 0
0E
01
E 0 0 0
F
11
1F 0 0 0 0
DD 0
E0
E 0 0
F11
F 0 0 0
E
E 0F
1F 0 0
拓樸排序