BFS 寬度優先搜尋 演算法摘記
阿新 • • 發佈:2019-01-10
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彈出佇列並置成黑色。