第7章 圖形與網路 資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第7章 圖形與網路 資料結構設計與C++程式應用 版權所有 禁止重製
圖形的基本術語 圖形(Graph) G = (V,E) 頂點(Vertices,或稱Nodes) 邊(Edges) 無向圖(Undirected Graph) (V1 ,V2) 有向圖(Directed Graph) <V1 ,V2>
圖形的基本術語 完全圖(Complete Graph) 路徑(Path) 路徑之長度(Path Length) 簡單路徑(Simple Path) 迴路(Cycle) 相連的(Connected) 相連單元(Connected Component) 子圖(Subgraph) 緊密相連(Strongly Connected) 緊密相連單元(Strongly Connected Component) 出分支度(Out Degree) 入分支度(In Degree)
圖形的表示法 鄰接矩陣表示法
圖形的表示法 鄰接串列表示法
圖形的表示法 鄰接串列與反鄰接串列 鄰接串列 反鄰接串列
圖形的表示法 鄰接複串列表示法 邊節點
圖形追蹤 先深後廣搜尋法(Depth First Search,簡稱DFS) 1.選擇一個頂點VX當做起始點,並做一個已拜訪過的記號。 2.在所有與VX相連且未被拜訪過的頂點中任選一個頂點,令VY, 做一個已拜訪過的記號,並以VY為新的起點進行先深後廣搜尋。 堆疊
圖形追蹤 先廣後深搜尋法(Breadth First Search,簡稱 BFS) 佇列 1.選擇一個起始頂點VX,並做一個已拜訪過的記號。 3.重複步驟4直到佇列空了為止。 4.從佇列取出一個頂點VX,做一個已拜訪過的記號,並將與VX相連且未 拜訪過的頂點放入佇列中。 佇列
擴張樹(Spanning Tree) 擴張樹 一個包含 N 個頂點的無向相連圖,我們可以找出用圖中的 N-1 個邊來連接所有頂點的樹 若再加入圖形中其餘的邊到擴張樹中必會形成迴路 擴張樹中的任兩個頂點間都是相連的,也就是存在一條路徑可通,但此一路徑不一定是原圖形中該兩頂點之最短路徑。
擴張樹(Spanning Tree) 擴張樹 DFS 擴張樹 BFS 擴張樹
花費最少擴張樹(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=ψ。 花費最少 擴張樹
花費最少擴張樹(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 為止。 花費最少 擴張樹
最短路徑問題(The Shortest Path Problem) 從一個城市出發到其他每一個城市之最短距離(Single Source All Destination) 從頂點V出發到達其餘每一個頂點之最短路徑之演算法為:
最短路徑問題(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]}。
最短路徑問題(The Shortest Path Problem) 從頂點0到其餘每一個頂點之最短徑和花費
最短路徑問題(The Shortest Path Problem) 頂點0到其餘頂點之最短距離選取過程 頂點0到其餘頂點之最短路徑和距離
最短路徑問題(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]便可知道任一頂點對之最短距離
最短路徑問題(The Shortest Path Problem) 任兩頂點對之最短距離 (All Pairs Shortest Paths) 由 A3 得知頂點 0 到頂點 3 之最短距離為 11, 頂點 3 到頂點 1 之最短距離為 2
工作網路和拓樸排序(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。
有趣的圖形問題 柯尼斯伯格之橋 是否有人可以跨越7座橋去拜訪四個城市,且每座橋只經過一次 ? 尤拉定理:每個頂點的分支度皆為偶數時才可以
有趣的圖形問題 彌爾頓(Hamilton)圖形 圖形中是否存在一條路徑可以拜訪每個頂點恰好一次? 左圖:從 A 出發,經 B、C 到 D 恰好拜訪每個城市一次 左圖:無解 為漢彌爾頓圖形及尤拉圖形 非漢彌爾頓圖形但為尤拉圖形
有趣的圖形問題 平面圖 定理1:一個平面圖的區域度數總和等於兩倍邊數和。 定理2:(尤拉公式)一個平面圖滿足下列公式 頂點個數 - 邊數個數 + 區域個數 = 2 定理3:一個平面圖若邊的個數大於等於2,則滿足 3/2 * 區域個數 ≦ 邊的個數 ≦ 3 * 頂點個數 – 6 定理4:(庫托斯基定理) 一個圖形是非平面的若且唯若它含有一個和K3或K5同構之子圖, 其中 K3,K5均為設施圖。
有趣的圖形問題 平面圖 (a)與(b)為平面圖 (c)非平面圖
有趣的圖形問題 彩色圖 N-可著色:一平面圖若最少要用 N 種顏色才能使相鄰區域之顏色互異 4-可著色 (a)相當於(b),是非平面圖,無法著色 (c)可改成(d),為一平面圖,可以著色