《算法導論》圖相關算法小結


最近又抽空讀了一遍《算法導論》,關於圖的內容貫穿了多個章節(比如在動態規划一章埋了無權最短路徑的伏筆,后面才專門講),適用條件各異,而且都有證明過程。
如果不打算熟記證明,僅僅是應用,遇到具體場景再去回憶適用於哪種算法不太方便。

以下內容以手頭的機械工業出版社基於原書第2版的譯本整理了一下,便於速查。
不包含思考題、標注為“*”的章節和習題內容。

符號定義

一般地,
G=(V, E),其中V代表頂點集合,E代表集合。ω(u, v)代表從頂點u到頂點v的邊的權值。
如果ω(u, v)總為1,則稱G為不加權的圖。

補充定義

  • DAG:有向無回路圖
  • 拓撲排序:將DAG的節點按照一定規則輸出:當有u到v的邊,則u在v前面。
  • 強連通分支:對於圖G(V, E),如果一個頂點集合C⊆G,其中每對頂點u和v,u和v相互都是可以到達的,那么稱C是G的一個強連通分支
  • 最小生成樹:無向連通圖G的子集T,包含了所有頂點,且邊的權值之和為最小。
  • 松弛技術:對於s頂點,d[v]表示s到v的距離。如果d[v] > d[u] + ω(u,v),則更新d[v] = d[u] + ω(u,v)
  • 最大流:對於包含源節點和匯節點的有向非負權圖,最大的流量
  • 最大二分匹配:對於圖G=(V,E),存在邊的子集M⊆E,滿足所有v∈V,M中最多有一條邊與v關聯。最大匹配是最大勢的匹配,即不存在一個邊數更多的M'。

速查表

算法名稱 適用范圍 核心思想 基本步驟 時間復雜度 備注
廣度優先搜索BFS 有向圖/無向圖,不涉及權重 1.隊列 2.頂點按是否訪問過着色 依次訪問一個節點的所有相鄰頂點,訪問時着色並加入隊列。每次循環從隊列出隊。 O(V+E) 可計算不加權的圖最短路徑
深度優先搜索DFS) 有向圖/無向圖,不涉及權重 1.遞歸 2.頂點按是否訪問過着色 依次訪問一個節點的所有相鄰頂點,訪問時着色並遞歸訪問它的相鄰頂點。 O(V+E)
拓撲排序(DFS) DAG DFS 執行DFS,當一個頂點DFS完成時插入鏈表頭,這個鏈表就是拓撲排序結果 O(V+E)
計算強連通分支(DFS) DAG DFS 執行DFS,對圖G倒置后按照節點訪問次序的降序再計算一次DFS,第二次DFS的生成樹即為強連通分支 O(V+E)
最小生成樹-Kruskal算法 無向連通圖 貪心算法 節點集合A初始化為空集,每次選一條安全邊加入A。具體的,初始化每個節點都是一個集合,每次取最小權值的邊,滿足它的節點(u,v)所在集合不相等,此時令A=A∪{(u,v)} O(ElgV)
最小生成樹-Prim算法 無向連通圖 貪心算法 節點集合A初始化為空集,每次選一條安全邊加入A。具體的,初始化所有節點距離A為正無窮,先在A加入一個節點,距離A為0。每次取一個離集合A中所有頂點中最近的邊,加入它和它的頂點u,並將u的所有相鄰節點v的距離更新一次(新距離=min(u到v, key(v))),直到所有頂點都加入了A O(ElgV),可以改進到O(E+VlgV)
單源最短路徑-Bellman-Ford算法 有向圖,權重可為負 松弛技術 松弛多次,次數為頂點數-1 O(VE) 如果有負權回路,返回值false。可用於差分約束問題求解。
單源最短路徑-DAG DAG 拓朴排序、松弛技術 拓朴排序,按序取頂點,對它的所有臨邊松弛 O(V+E)
單源最短路徑-Dijkstra算法 有向圖,邊權重非負 松弛技術 頂點集合S初始化為空集,加入源節點s。選取距離S整體最近的頂點u,松弛u的所有相鄰頂點v,直到所有頂點都並入S O((V+E)lgV) 可以用斐波那契堆優化至O(VlgV+E)
每對頂點最短路徑-Floyd-Warshall算法 有向圖 動態規划 三重循環,k、i、j -> 1 to n, d(k)(i)(j) = min(d(k-1)(i)(j), d(k-1)(i)(k) + d(k-1)(j)(k)) O(n^3)
每對頂點最短路徑-Johnson算法 有向圖,稀疏圖,邊權重非負 重賦權,Dijkstra + Bellman-Ford 較為復雜,略 O(V^2lgV+VE)
最大流-Ford-Fulkerson方法 有向圖,邊權重非負,包含源節點和匯頂點 依賴三種思想及其對應實現 較為復雜,略 基本算法為O(E|f*|) 本書只介紹了基本算法、Edmods-Karp算法等。可用於解最大二分匹配問題

后注

每對頂點間最短路徑也可以用Dijkstra和Bellman-Ford解決但不是最優,具體分析略。

附:圖相關的NP完全問題

不詳細介紹問題的含義。

  1. 團問題
  2. 頂點覆蓋問題,在35章介紹了近似算法
  3. 哈密頓回路問題
  4. 旅行商問題,在35章介紹了近似算法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM