350 likes | 633 Views
有向圖. 有向圖. 有向圖 是所有邊都有向的圖形 應用 單行道 航班 任務排程. 有向圖的性質. 圖形 G=(V,E) ,其中 每個邊都是沿單一方向前進: 邊 (a,b) 是 從 a 到 b ,但不是 從 b 到 a 如果 G 是簡單圖形,則 m ≤ n*(n-1) 如果我們將入邊與出邊存放在個別的鄰接串列中,我們便可以在正比於其大小的時間中,列出入邊與出邊. 有向圖的應用. 排程 : 邊 (a,b) 意指 在任務 b 可以開始之前,任務 a 必須先被完成. 有向 DFS.
E N D
有向圖 有向圖
有向圖 • 有向圖是所有邊都有向的圖形 • 應用 • 單行道 • 航班 • 任務排程 有向圖
有向圖的性質 • 圖形 G=(V,E),其中 • 每個邊都是沿單一方向前進: • 邊 (a,b)是從 a 到 b,但不是從 b 到 a • 如果 G 是簡單圖形,則 m ≤ n*(n-1) • 如果我們將入邊與出邊存放在個別的鄰接串列中,我們便可以在正比於其大小的時間中,列出入邊與出邊 有向圖
有向圖的應用 • 排程:邊 (a,b) 意指在任務 b 可以開始之前,任務 a 必須先被完成 有向圖
有向 DFS • 我們可以特殊化走訪演算法 (DFS 與 BFS) 以使用在有向圖上,其中我們只會沿著的邊方向進行走訪 • 在有向的 DFS 演算法中,邊有四種型態 • 已拜訪邊 • 反向邊 • 順向邊 • 交錯邊 • 從頂點s 開始的有向 DFS,會判斷出從s 可抵達的頂點 有向圖
可到達性 • 根節點位於 v 的DFS 樹:從 v 經由有向路徑可抵達的頂點 有向圖
強連通性 • 每個頂點都可以到達所有其他的頂點 有向圖
強連通性演算法 • 在 G 中挑選一頂點v • 在 G 中從 v 開始執行 DFS • 如果有一 w 沒有被拜訪到,則印出「否」 • 令 G’ 為將邊反向的 G • 在 G’ 中從 v 開始執行 DFS • 如果有一 w 沒有被拜訪到,則印出「否」 • 否則,印出「是」 • 執行時間:O(n+m) 有向圖
強連通成員 • 最大的子圖,其中每個頂點都可以到達此子圖中所有其他的頂點 • 也可以使用 DFS 在 O(n+m) 時間內完成,但是比較複雜 (類似於雙重連通性) 有向圖
遞移包絡 • 已知一有向圖G,G 的遞移包絡為一有向圖 G*,且 • G* 與G 包含相同的頂點 • 如果G 存在一從u 到v (u ≠ v) 的有向路徑,則G*包含一從u到v 的有向邊 • 遞移包絡會提供關於有向圖的可到達性資訊 有向圖
計算遞移包絡 如果有一條從 A 到 B 的路,也有一條從 B 到 C 的路,那麼就有一條從A 到 C 的路存在。 • 我們可以從每個頂點開始執行 DFS • O(n(n+m)) • 或者是... 使用動態規劃:Floyd-Warshall 演算法 有向圖
Floyd-Warshall 遞移包絡 • 想法 #1:將頂點編號為 1、2、…、n • 想法 #2:考量只使用編號 1, 2、…、k 的頂點做為中介頂點的路徑: 只使用編號 1、…、k 的頂點 (如果尚未包含此邊的話,則將之加入) 只使用編號1、…、k - 1 的頂點 只使用編號 1、…、k- 1 的頂點 有向圖
Floyd-Warshall 演算法 • Floyd-Warshall 演算法會將G 的頂點編號為v1、 …、vn,然後計算一系列有向圖G0, …, Gn • G0=G • 如果G 有一從 vi 到 vj 的有向路徑,且其中介頂點屬於集合 {v1, …, vk} 的話,則Gk包含有向邊(vi, vj) • 我們可得Gn= G* • 在階段k,我們會從Gk- 1計算出有向圖Gk • 執行時間:O(n3),如果areAdjacent 為 O(1) 的話 (例如使用鄰接矩陣) 有向圖
DAG 與拓樸順序 • 有向無迴路圖 (DAG) 是不包含有向循環的有向圖 • 有向圖的拓樸順序,是一種頂點的編號方式 v1、 …、vn 使得對所有邊 (vi , vj) 而言,i < j • 例子:在任務排程圖中,拓樸順序為一滿足先後限制的任務序列 定理 如果有向圖擁有拓樸順序,則若且唯若其為一DAG G 的拓樸順序 有向圖
拓樸排序 • 編號頂點,使得若 (u,v) 在 E 中則意味著 u < v 有向圖
拓樸排序演算法 • 請注意:此演算法不同於Goodrich-Tamassia書中的演算法 • 執行時間:O(n + m)。如何辦到…? 有向圖
使用 DFS 的拓樸排序演算法 • 使用深度優先搜尋來模擬此演算法 • O(n+m) 時間 有向圖
拓樸排序的例子 有向圖
拓樸排序的例子 有向圖
拓樸排序的例子 有向圖
拓樸排序的例子 有向圖
拓樸排序的例子 有向圖
拓樸排序的例子 有向圖
拓樸排序的例子 有向圖
拓樸排序的例子 有向圖
拓樸排序的例子 有向圖
拓樸排序的例子 有向圖