廣度優先遍歷是最簡單的圖搜索算法之一,也是許多重要的圖算法的模型。
圖的表示
對於圖G=(V,E)(V代表圖中結點的集合,E代表圖中所有邊的集合),可以用兩種標准表示方法表示:
1.將圖作為鄰接鏈表的組合
對於圖G=(V,E),其鄰接鏈表表示由一個包含|V|條鏈表的數組Adj構成。
對於每個結點u∈V,鄰接鏈表Adj[u]包含圖G中所有與u鄰接的結點
2.將圖作為鄰接矩陣來看待
對於鄰接矩陣表示來說,我們將圖G的結點編號為1,2,...,|V|,用一個|V|×|V|的矩陣來表示圖G,該矩陣滿足下述條件:
下面分別展示了有向圖跟無向圖的兩種表示方法
廣度優先遍歷
廣度優先遍歷的基本思想如下:
1、從圖中某個頂點V0出發,並訪問此頂點;
2、從V0出發,訪問V0的各個未曾訪問的鄰接點W1,W2,…,Wk;然后,依次從W1,W2,…,Wk出發訪問各自未被訪問的鄰接點;
3、重復步驟2,直到全部頂點都被訪問為止。
首先我們把圖中的每個結點都塗成白色。在算法推進過程中,當第一次遇到該結點時,其顏色會發生改變而且符合下面條件:
所有與黑色結點鄰接的結點都已經被發現,而對於灰色結點來說,其鄰接結點中可能存在未被發現的白色結點。
假定輸入圖G=(V,E)是以鄰接鏈表鎖表示的,下面給出了廣度優先搜索過程BFS的偽代碼
1 BFS(G,s) 2 for each vertex u∈G.V-{s} 3 u.color=WHITE 4 u.d=∞ 5 u.π=NIL 6 s.color=GRAY 7 s.d=0 8 s.π=NIL 9 Q=∅ 10 ENQUEUE(Q,s) 11 while Q≠∅ 12 u=DEQUEUE(Q) 13 for each v∈G.Adj[u] 14 if v.color=WHITE 15 v.color=GRAY 16 v.d=u.d+1 17 v.π=u 18 ENQUEUE(Q,v) 19 u.color=BLACK
其中每個加點的顏色存放在屬性u.color中,u的前驅結點存放在屬性u.π中,屬性u.d記錄從源結點s到結點u之間的距離,用一個先進先出的隊列Q來管理灰色結點集。
下圖描述的是BFS在一個樣本圖中的推進過程
把結點塗成灰色是為了方便查看推進的順序,實際算法中只需要塗成白色或者黑色。