1. BFS的應用
圖的BFS算法可以用來求從圖中一個頂點到其余各個頂點的最短路徑。如果對圖中每個頂點都使用一次BSF,就可以求出從圖中每個頂點到其余各個頂點的最短路徑。
2. DFS的應用
2.1 拓撲排序
DFS算法可以用來求一個有向無回路圖的拓撲排序,算法的偽代碼如下:
從偽代碼中可以看出,圖中的各個節點是按完成時間 f 降序順序排序的。然后依次輸出排序后的結果就能得到一個拓撲排序。
2.2 找出圖中的所有強聯通分支
DFS算法也可以找出一個有向圖的所有強連通分支。偽代碼如下:
該算法首先調用DFS(G)構造出一個深度優先搜索森林並球出了各個節點的完成時間f[u]。求圖G的矩陣表示的轉置矩陣GT,然后在GT上再次調用DFS(),但是這次不是按隨機順序任意訪問節點,而是按在第一次DFS()中求出的各個節點的f[u]降序順序訪問。這次同樣構造出了一個深度優先搜索森林,其中每一棵深度優先搜索樹就是一個原圖的強連通分支。
讀到這里大家也許會奇怪:為什么這個算法有些詭異?為什么一次DFS搞不定?為什么要計算G的轉置矩陣?為什么第二次DFS要按f[u]的降序排序?
欲知原因,請參見《算法導論》中文版第339頁,有些復雜,不是一兩句話能說明白的。
strongly_connected component算法的實現,未完,待續……