Chapter 12 圖型結構 - Ian-Liu-1990/Data-Structure GitHub Wiki
I. 圖形[計算邊數和觀念]
-
頂點Vertex
-
邊Edge
- 路徑: 由一個邊或一個邊以上所組成
- 路徑長度: 所有經過的邊總和
- 簡單路徑: 除了起點和終點可以是相同(亦可以不同),其餘頂點皆不可以重複
- 迴路: 1. 起點和終點必須是相同,2. 是一條簡單路徑,程式實作 - 使用DFS或BFS若pop出已看過,代表有迴路
- 附著: 指邊附著在點上
- 連通: 兩點間存在一條路徑
-
圖形
- 有向連通圖形:
- 強連通頂點: 兩相異頂點V1,V2互相有路徑可到達對方
- 強連通圖形: 任意相異點Vi和Vj皆互相有路徑可到達對方
- 強連通單元: 最大的有向連通子圖
- 無向連通圖形:
- 連通圖形: 任意相異點Vi和Vj皆互相有路徑可到達對方
- 連通單元: 最大的有向連通子圖
- 完全圖形:
- 無向完全圖 : 任意兩頂點間皆"有邊"存在,若有N個頂點,則共有N(N-1)/2
- 有向完全圖 : 任意兩頂點間皆"有邊"存在,若有N個頂點,則共有N(N-1)
- 有向完全圖且沒有迴路 : 若有N個頂點,則共有N(N-1)/2
- 完全子圖: 若G完全圖形的部份G'也為完全圖形,則G'為完全子圖
- 多重圖形: 若一個圖形,同一個邊重複多次
II. 尤拉循環
- 定義: 每一個頂點都必須有偶數的分支度,才能走過全部的邊且每個邊只走一次,回到原頂點
圖形追蹤[申論考點 - 哪一個方法優秀或時間空間複雜度]
III.- 目的 : 如何判斷是否為一個連通圖形任意兩點皆有路徑可以互相到達對方 => 若所有點皆可以被拜訪過就是連通圖
- BFS廣度優先演算法 - 佇列
- 先將圖以鄰接串列表示
- 將首節點Enqueue佇列
- Dequeue佇列並檢查節點是否看過 :
- 有看過 : 忽略
- 沒看過 : Output節點且將他相鄰節點加入佇列
- 反覆直到佇列為Empty
- DFS深度優先演算法 - 堆疊
- 先將圖以鄰接串列表示
- 將首節點Push堆疊
- Pop堆疊並檢查節點是否看過 :
- 有看過 : 忽略
- 沒看過 : Output節點且將他相鄰節點加入堆疊
- 反覆直到堆疊為Empty
鄰接串列時間複雜度 | 鄰接矩陣時間複雜度 | |
---|---|---|
DFS | O(n+e) : 由串列一個一個接尋找 | O(n^2) : 陣列必須將每一行每一列都檢查 |
BFS | O(n+e) | O(n^2) |
展開樹T
IV.-
定義 :
- T是G的子圖
- T包含G所有節點
- T是一棵樹(一種圖型,連通圖且沒有循環)
最小成本展開樹T
V.-
定義 : 以最少的邊連通圖形中所有的頂點,且邊所花費的成本為最少 ->即找出最小成本伸展樹(Spanning Tree)
-
求最小伸展樹演算法
- 不管用1還是2,所求得的Spanning tree為同一個
求最短路徑或最少成本 - 網路圖型 : 兩頂點在最小成本路徑上,不代表為原圖G的最短路徑
VI.限制 - Single Source(起點到其他點)路徑權重不可為負
1. 連結狀態導向-Djkstra : OSPF網路協定,- 演算法步驟 : Greedy貪婪演算法
-
將起始節點初始值為0,其他節點無法直接到達設為無窮大
-
min(d[相鄰i], d[起步j] + d[相鄰E]) : 從相鄰節點開始,且沒有前節點,每次比較到該相鄰節點自己目前路徑距離和起步節點距離 + 相鄰節點距離
-
反覆2的動作直到最後節點
-
- 表示法 : 圖型上每一節點旁標記,[路徑成本, 前一節點]
限制 - Single Source(起點到其他點)的圖型,邊可以為負,但不可以有負的迴路
2. 向量導向-Bellman fold : RIP網路協定,- 演算法步驟 : 不是Greedy貪婪演算法
- 將起始節點初始值為0,其他節點無法直接到達設為無窮大
- 從可以到達的相鄰點開始,每次比較到該相鄰節點自己目前路徑距離和起步節點距離 + 相鄰節點距離
Flody-Warshall : 限制 - "任意兩點"i和j的最短路徑,邊可以負,但不可以有負的迴路
3.- 演算法步驟 : 不是Greedy貪婪演算法
- 由V0~Vn,每次從n=0取第0行與第0列上元素相加
- 相加後與相應位置比較大小,取最小
- 反覆2.直到第Vn完,即為任意兩節點到對方的最短路徑
Johnson’s演算法 : 限制 - "任意兩點"i和j的最短路徑,邊可以負,但不可以有負的迴路
4.有向非循環圖,<= 求工作先後順序
VII. AOV網路拓樸 -- 定義 : 將有向圖節點排列成一組線性順序,且若其中u為v前行節點,則u必須排在v之前
- 應用 : 以頂點表示工作或活動,以邊表示工作之間的先後順序.不會直接給圖,小心工作表格
一個計劃開始到結束至少需要多少時間完成,找到緊要工作並縮短它,可縮短整個計畫完成時間
VIII. AOE邊工作網路拓樸--
最早MAX可能開始時間 - 演算法 : a[j], a[i]皆表示自己工作最早開始時間,d(i, j)表示i完成所需時間
- 將所有工作時間都初設為0:由起始節點依序找相鄰節點,求Max(a[j], a[i+d(i, j)]),沒有前行節點工作再放入堆疊
-
最晚MIN可能開始時間 - 演算法 :
- 將所有工作時間都初設為至少需要完成工作時間:由終節點反向依序找相鄰節點,求Min(a[j], a[i-d(i, j)]),沒有前行節點工作再放入堆疊
-
緊要工作 : 第i"邊"最早工作時間(看起始節點的最早開始時間) = 第"i"邊"最晚工作時間的工作(最晚時間 - 前邊花費時間)
最大流量與最小切割 - 須小心優化回流,當作無向圖處理
VIIII.-
最大流量定義 : 求完整從起點到終點的累積流通量
-
最小切割定義 : 加總需要最小成本邊,可將連接起點子圖與匯合終點子圖分開