一、深度優先搜索
它的定義是:遞歸探索圖,必要時要回溯,同時避免重復。
關於深度優先搜索的偽代碼如下:
左邊DFS-Visit(V, Adj.s)是只實現visit所有連接某個特定點(例如s)的其他點。右邊是實現整張圖的visit,即DFS(v, Adj)。DFS-Visit是DFS的重要組成模塊。
用上圖右側的實例圖解釋下運作過程:
- 先從a出發,DFS-Visit到b上。
- 遞歸到b上,從b出發,DFS-Visit到e上。
- 遞歸到e上,從e出發,DFS-Visit到d上。
- 遞歸到d上,從d出發,本來是要DFS-Visit到b上的,因為DFS要避免重復,所以這里就斷了。
- 由於b已經被visit過了,現在從c出發,DFS-Visit到f上。
- f不能visit自己,且e被visit過了,這里就斷了。
- 之后c,d,e,f都被visit過了,所有就完成了。
DFS的時間復雜度如下(這里不做多余的解釋):
二、邊分類
Edge Classification可以解決兩個問題:cycle detection和topological sort。
它有四種邊:
- tree edge:即帶有parent pointer的邊,通過該邊可以visit到新的點。
- forward edge:點到樹中的子輩。
- backward edge:點到樹中的父輩。
- cross edge:在兩個無父輩關系的子樹之間。
(如果是無向圖,只存在tree edge和backward edge)
三、循環檢測
如果圖G有個循環,那么DFS就存在反向邊back edge。反過來也成立,即如果DFS就存在反向邊back edge,圖G就有個循環。
四、拓撲排序
在Job scheduling問題上,給定有向非循環圖(DAG),排序點使得所有變從低位指向高位。這里使用拓撲排序Topological sort可以實現:使用DFS,然后反着輸出點的完成時間。這這里面有個常理就是對於任何從u到v的邊即e =(u,v),都滿足v完成早於u完成。