1. 程式人生 > >深度優先搜尋(DFS)

深度優先搜尋(DFS)

正如“深度優先搜尋”這一名詞所示,這種搜尋演算法是儘可能“深”地搜尋一個圖。在深度優先搜尋中,對於最新發現的頂點,如果它還有以此為起點而未探測到的邊,就要沿此邊繼續探測下去。深度優先搜尋的先輩子圖形成了一個由深度優先樹組成的深度優先森林。

      除了建立一個深度優先森林外,深度優先搜尋還為每個頂點加蓋時間戳。每個頂點有兩個時間戳:當頂點第一次被發現(並置成灰色)時,記錄下第一個時間戳d[v];當結束檢查v時,記錄下第二個時間戳f[v]。

      頂點v在d[v]時間之前是白色(WHITE),在d[v]到f[v]時間之間是灰色(GRAY),在f[v]時間之後是黑色(BLACK).下面的虛擬碼就是一個基本的深度優先搜尋演算法,輸入圖G可以是有向圖或無向圖,變數time是一個全域性變數,用於記錄時間戳。

procedure DFS(G);
   begin
   for 每個頂點u∈V[G] do
       begin
       color[u]←White;
       π[u]←NIL;
       end;
   time←0;
   for 每個頂點u∈V[G] do
     if color[u]=White
         then DFS_Visit(G,u);
end;

 procedure DFS_Visit(G,u);
  begin
  color[u]←Gray;              Δ白色結點u已被發現
  d[u]←time←time+1;
  for 每個頂點v∈Adj[u] do     Δ探尋邊(u,v)
     if color[v]=White 
          then begin
               π[v]←u;
               DFS_Visit(G,v);
               end;
  color[u]←Black;             Δ完成後置u為黑色
  f[u]←time←time+1;
end;

下圖說明了DFS在圖G上的執行過程。



圖2 深度優先搜尋演算法DFS在有向圖圖1上的執行過程

下圖是具體實現的一個簡單例項: