算法導論 | 22.3 深度優先搜索

概念

  1. 「發現」 : 指節點第一次被訪問
  2. 「時間戳」 :對於每一個節點u,有兩個時間戳u.d , u.f ,分別表示發現節點u和完成對u的鄰接鏈表掃描的時間(即節點u被塗上黑色的時候)。 注意:在 u.d 時刻,節點u被塗上灰色 ;在 u.f 時刻,節點u被塗上黑色。那麼在 [u.d , u.f ) 這段時間內,節點u是灰色的。
  3. 「真後代」 :在深度優先搜索森林中,節點u的子孫稱爲其真後代
  4. 邊的分類 :樹邊(深度優先森林G.π中的邊),後向邊(指向祖先節點的邊),前向邊(指向後代節點的邊),橫向邊(其餘全部邊,包括同一深度優先樹中鏈接互不爲祖先兩點的邊及鏈接不一樣深度優先樹的邊)。

僞代碼(摘自《算法導論》22.3)

DFS(G)
    for each vertex u ∈ G.V
        u.color = WHITE
        u.π = NIL
    time=0
    for each vertex u ∈ G.V
        if u.color == WHITE 
            DFS-VISIT(G,u)
DFS-VISIT(G,u)
    time = time + 1
    u.d = time
    u.color = GRAY
    for each v ∈ G:Adj[u]
        if v.color == WHITE
            v.π=u
            DFS-VISIT(G,v)
    u.color = BLACK
    time = time+1
    u.f = time

運行時間:θ(V+E)css

性質

22.6 時間戳關係

u.d<u.f算法

定理 22.7 括號化定理

在對有向圖或無向圖 G=(V,E) 進行的任意深度優先搜索中,對於任意兩個節點 u 和 v 來講,下面三種狀況只有 一種 成立:markdown

  • 區間 [u.d,u.f] 和區間 [v.d,v.f] 徹底分離,在深度優先搜索森林中,節點u不是節點v的後代,節點v也不是節點u的後代
  • 區間 [u.d,u.f] 徹底包含在區間 [v.d,v.f] 內,在深度優先樹中,節點u是節點v的後代
  • 區間 [v.d,v.f] 徹底包含在區間 [u.d,u.f] 內,在深度優先樹中,節點v是節點u的後代
推論 22.8 後代區間的嵌套

在有向或無向圖G的深度優先森林中,節點v是節點u的真後代當且僅當u.d<v.d<v.f<u.f成立ui

定理 22.9 白色路徑定理

在有向或無向圖G=(V,E)的深度優先森林中,節點v是節點u的後代當且僅當在發現節點u的時間u.d,存在一條從節點u到節點v的所有由白色節點所構成的路徑。spa

定理 22.10 無向圖的特殊性

在對無向圖的深度優先搜索中,每條邊要麼是樹邊,要麼是後向邊code

相關文章
相關標籤/搜索