最近又抽空讀了一遍《算法導論》,關於圖的內容貫穿了多個章節(比如在動態規划一章埋了無權最短路徑的伏筆,后面才專門講),適用條件各異,而且都有證明過程。
如果不打算熟記證明,僅僅是應用,遇到具體場景再去回憶適用於哪種算法不太方便。
以下內容以手頭的機械工業出版社基於原書第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完全問題
不詳細介紹問題的含義。
- 團問題
- 頂點覆蓋問題,在35章介紹了近似算法
- 哈密頓回路問題
- 旅行商問題,在35章介紹了近似算法