330 likes | 541 Views
資料結構. 第 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 相鄰矩陣
E N D
資料結構 第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 相鄰矩陣 • 範例7.1:以相鄰矩陣存放無向圖形G1。
7-2-2 相鄰串列 • 範例7.3:以相鄰串列存放無向圖形G1。
7-2-3 加權圖形的表示方式 • 範例7.5:以相鄰矩陣存放加權圖形G6。
7-3 圖形的基本運算 7-3-1 深度優先搜尋 (DFS)
範例7.7:[DFS] 假設下列圖形的起始頂點為A,試寫出其深度優先搜尋結果。
範例7.9:[BFS] 假設下列圖形的起始頂點為A,試寫出其廣度優先搜尋結果。
7-3-3 連通單元 • 只要呼叫dfs(0) 或bfs(0) 函數,令它從第一個頂點開始走訪,一旦在走訪完畢後還有其它尚未拜訪過的頂點,就表示該圖形不是一個連通圖形 ,下圖即為一例。 show_connected() { int v; for(v = 0; v < n; v++) if (visited[v] == FALSE){ dfs(v); printf("\n"); } }
7-3-4 擴張樹 • 圖形的擴張樹 (spanning tree) 指的是以圖形內最少的邊數連接所有頂點所形成的樹,而樹 (tree) 則是連通且沒有循環的圖形 。
G15的DFS樹 G15的BFS樹
7-4 最小擴張樹 • Kruskal演算法
7-5 最短路徑 • 最短路徑 (shortest path) 又分成「某個頂點到其它頂點的最短路徑」和「任意兩個頂點的最短距離」兩種情況。 以加權圖形表示城市之間的交通路線
使用Dijkstra演算法求取某個頂點到其它頂點的最短路徑:每次都要從尚未選擇的頂點中選擇距離最短者Vx ,然後檢查有沒有其它尚未選擇的頂點Vi因為行經Vx而使距離變短,如此重複V - 1次,直到找出第V - 1個頂點的最短路徑,整個演算法才宣告結束。
7-5-2 任意兩個頂點的最短距離 • 方法一:分別以加權圖形的每個頂點做為起始頂點執行Dijkstra演算法。 • 方法二:使用Floyd演算法,其步驟如下 : • 使用admatrix[V][V] 陣列存放加權圖形的相鄰矩陣。 • 定義Ak[i][j] 為Vi到Vj的最短距離,而且中間只能經過索引小於等於k的頂點。 • 定義A0[i][j] 為admatrix[i][j] 。 • 根據下式依序求取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) 的距離
範例7.18:[Floyd演算法] 針對加權圖形G17找出任意兩個頂點的最短距離。
解答: 1. 3. 2. 4.
7-6 拓樸排序 • 頂點工作網路 (AOV網路,activity on vertex network) • 前行者 (predecessor)、後繼者 (successor) • 立即前行者 (immediate predecessor) 、立即後繼者 (immediate successor) • 拓樸排序 (topology sort),例如V0→V1→V2→V3→V4→V5→V6→V7和V0→V1→V2→V3→V4→ V6→V5→V7
範例7.20:[拓樸排序] 針對有向圖形G18找出其拓樸排序。 1. 2.
3. 4. 5. 6.
7. 8. 9.輸出V7,所有頂點均輸出完畢,得到拓樸排序為V0→V1→V2→V3→V4→V5→V6→V7。