圖的廣度優先遍歷


廣度優先遍歷是最簡單的圖搜索算法之一,也是許多重要的圖算法的模型。

 

圖的表示

對於圖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在一個樣本圖中的推進過程

把結點塗成灰色是為了方便查看推進的順序,實際算法中只需要塗成白色或者黑色。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM