廣度優先算法描述
(1)給定圖G=<V,E>和一個可以識別的源結點s,廣度優先搜索對圖G中的邊進行系統性的探索來發現可以從源結點到達所有節點的路徑。該算法能夠計算出從源結點s到每個可到達的結點的距離,同時生成一顆廣度優先搜索樹。該數已源結點s為根節點,包含所有的可能從s到達的點。對於每一個從源結點s可以達到的jiedianv,在廣度優先搜索樹里面從結點s到達結點v的簡單路徑對應的就是s到v的最短路徑。
(2)下面結合例子看一下廣度優先搜索的具體流程。例子中,每一個結點可能被置為白色、灰色或者黑色。最開始的時候,所有的結點都被置為白色。在算法一步步執行過程中,這些結點可能變為灰色或者黑色。搜索過程中,結點第一次被遇到就稱結點被發現,此時結點的顏色將發生改變。因此,凡是灰色或者黑色的結點都是一被發現的結點。除此之外,廣度優先搜索將灰色和黑色結點加以區別,以此確保搜索按照廣度優先進行。(如果變<u,v>∈E且結點u是黑色,那么與結點u相連的結點v可能是灰色,也可能是黑色。也就是說,所有與黑色結點相連的結點可能是黑色或者灰色,都已被發現。所有與灰色結點相連的結點可能是白色,換而言之,灰色結點代表的就是已知和未知兩個集合的邊界)。
(3)廣度優先搜索的算法描述
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
(4)如圖所示是一個BFS的過程
①初始時候,將源結點s置為灰色,並且加入集合Q中,Q是一個先進先出的隊列,如圖所示
②第二步,將s結點置為黑色,並出隊列,同時與之相連的r和w結點置為灰色,並加入隊列中,更新r、w結點的路徑距離
③第三步,將w置為黑色,並出隊列,同時將與之相連的t和x結點置為灰色,加入隊列中,更新t、x結點的路徑距離
④第四步,將r結點置為黑色,並出隊列,同時將與之相連的v結點置為灰色,加入隊列中,跟新結點v的路徑距離
⑤第五步,將t結點置為黑色,並出隊列,同時將與其相連的結點u置為灰色,加入隊列中,更新結點u的路徑距離
⑥第六步,將x結點置為黑色,並出隊列,同時將與之相連的結點y置為灰色,加入隊列中,更新結點y的路徑距離
⑦第七步,將結點v置為黑色,出隊列
⑧第八步,將結點u置為黑色,出隊列
⑨將最后一個結點y置為黑色,出隊列,此時隊列為空Q=∅
(5)下面分析一下偽代碼
除了源結點之外,算法的2~5行是將所有結點在初始情況下塗為白色,將每個結點值距離屬性置為∞,將每個結點的父節點設置為NIL。第6行將源結點s置為灰色,這是默認的初始情況,表示從源結點開始搜索。第9~10行對隊列Q進行初始化,因為在初始時刻,隊列中只有源結點s。
算法第11~19行的while循環一直執行,知道圖中不再有灰色結點為止。即Q=∅
最短距離
(1)給定G=<V,E>,G為一個有向圖或者無向圖,設s∈V為任意結點,則對於任意邊<u,v>∈E,σ(s,v)≤σ(s,u)+1
簡單證明一下:如果結點u是可以從結點s到達的結點,則結點v也是必然可以從s到達的結點。在這種情況下,從源結點s到結點v的最短路徑距離不可能比s到u的最短距離加上邊(u,v)更長。由此可以得出結論。
(2)設G=<V,E>為一個有向圖或者無向圖,假定BFS以給定結點s∈V作為源結點在圖G上,則在BFS結束的時候,對於每一個結點v∈V,BFS所計算出的v.d滿足v.d≥σ(s,v)
簡單證明一下:BFS歸結出的算法中,通過對算法里面的入隊列ENQUEUE操作的次數進行數學歸納來總結這個定理。
歸納假設是:對於所有結點v∈V,v.d≥σ(s,v)
歸納的基礎是BFS在將源結點加入Q之后開始。這時候,s.d=0 == σ(s,s),並且此時對於其他節點的d=∞顯然大於σ(s,v),所以歸納假設成立
對於歸納步,表示為從結點u進行鄰接鏈表搜索時發現的白色結點v。有歸納假設得到u.d≥σ(s,u)。由算法v.d = u.d + 1和上面(1)可知,v.d = u.d + 1≥σ(s,u)+1≥σ(s,v)。除此之外,因為結點v被加入到隊列之后會被置為灰色,不會再一次入隊列,所以此時得到的v.d不會變化