1. 程式人生 > >BFS 寬度優先搜尋 演算法摘記

BFS 寬度優先搜尋 演算法摘記

s為初始點 
  
 while  
     從Q中選一點    
     /* 選最先插入進Q的點,則為廣度遍歷,可以說先進先出。*/
     /* 選最後插入進Q的點,則為深度遍歷,可以說後進先出。 */
     if  then    /* N(v):v的鄰接點 */
         
     else 
 return H=(R,T)
 procedure BFS(G,S);
   begin
1.   for 每個節點u∈V[G]-{s} do
        begin
2.        color[u]←White;
3.        d[u]←∞;
4.        π[u]←NIL;
        end;
5.   color[s]←Gray;
6.   d[s]←0;
7.   π[s]←NIL;
8.   Q←{s}
9.   while Q≠φ do
       begin
10.      u←head[Q];
11.      for 每個節點v∈Adj[u] do
12.        if color[v]=White then
              begin
13.             color[v]←Gray;        
14.             d[v]←d[v]+1;
15.             π[v]←u;
16.             Enqueue(Q,v);
              end;   
17.      Dequeue(Q);
18.      color[u]←Black;
       end;
   end; 

過程BFS按如下方式執行,

第1-4行置每個結點為白色,置d[u]為無窮大,每個結點的父母置為NIL,

第5行置源結點S為灰色,即意味著過程開始時源結點已被發現。

第6行初始化d[s]為0,第7行置源結點的父母結點為NIL,第8行初始化佇列0,使其僅含源結點s,以後Q佇列中僅包含灰色結點的集合。

程式的主迴圈在9-18行中,只要佇列Q中還有灰色結點,即那些已被發現但還沒有完全搜尋其鄰接表的結點,迴圈將一直進行下去。

第10行確定佇列頭的灰色結點為u。第11-16行的迴圈考察u的鄰接表中的每一個頂點v。如果v是白色結點,那麼該結點還沒有被發現過,演算法通過執行第13-16行發現該結點。首先它被置為灰色,距離d[v]置為d[u]+1,而後u被記為該節點的父母,最後它被放在佇列Q的隊尾。當結點u的鄰接表中的所有結點都被檢索後,

第17-18行使u彈出佇列並置成黑色。