一,廣度優先搜尋的思想
訪問完所有結點後,我們可以知道從源結點s開始能到達哪些結點以及經過的路徑長度,以此生成乙個「廣度優先搜尋樹」,s作為其根結點,其餘為s可以到達的結點v,s到v的距離為圖g中s到v的最短路徑長度。
二,bfs演算法介紹
準備階段:我們有個圖g=(v,e),確定了乙個源結點s,為了記錄圖的搜尋情況,我們引進三個顏色:白色——代表未被訪問的結點,灰色——已被訪問的結點,但他的後續結點未被訪問完,黑色——自己和其後續結點都已被訪問的結點,初始狀態下,所有結點都是白色,即都未被訪問過。
演算法過程:我們從源結點s開始,尋找s的鄰結點,並將這n個鄰結點標為灰色,表示已經被訪問過,將源結點s標為黑色,表示他的鄰結點都已經被訪問過了,然後從這n個鄰結點開始按順序依次訪問其鄰結點,重複上述操作,直到所有結點都標為了黑色,搜尋完成。我們在搜尋的過程中同時需要構建一棵「廣度優先搜尋樹」,一開始這棵樹只有源結點s,然後每訪問到乙個白色結點,就將其加入該樹,放在其父結點後,由於每個結點只能被訪問一次,所以乙個結點最多只有乙個父結點。
三,bfs偽**
bfs(g,s)
1. for each vertex u∈g.v-
2. u.color=white
3. u.d=∞
4. u.π=null
5. s.color=gray
6. s.d=0
7. s.π=null
8. q=∅
9. enqueue(q,s)
10. while q≠∅
11. u=dequeue(q)
12. for each v∈g.adj[u]
13. if v.color==white
14. v.color=gray
15. v.d=u.d+1
16. v.π=u
17. enqueue(q,v)
18. u.color=black
在1-4行,對所有除了源結點s的結點進行初始化,將它們的顏色標為白色,s到它們的距離d設為無窮大,它們的前驅結點設為空;在5-7行,對源結點s進行初始化,顏色設為灰色,到源結點的距離d設為0,前驅結點設為空;在8-9行,定義了乙個先進先出的佇列q,並設定為空,這個佇列用於存放依次被訪問到的結點(後續會將其彈出,因此這個佇列存放的是當前還沒被訪問完的結點),因此我們先將源結點s放進去;在10-18行,進行的是結點的訪問工作,當佇列不為空時,即有結點沒被訪問完,我們定義乙個結點變數u,從佇列中彈出該未被訪問的結點並存放到u中,然後遍歷u的鄰結點v,如果是白色的那麼就設為灰色,並且讓其到源結點的距離d=u到源結點的距離+u到v的距離(如果每條邊沒有被賦值,則預設+1),然後讓v的前驅結點設為u,隨後將v入隊,這樣一來佇列中就存放這u的所有鄰結點v,這些v都沒被訪問完,最後把u的顏色設為黑色表示他已經被訪問完了。
以書上的例子為例,圖a中,我們將源結點設為s,並將所有結點進行初始化,佇列中有s;圖b中我們彈出佇列鐘的首元素,即s,搜尋s的鄰結點,r、w並標為灰色,距離為1,並將w和r加入佇列中,發現s的鄰結點都被找到了,將s標為黑色;圖c中彈出佇列中的首元素w,尋找w的鄰結點,有s、t、x,其中t和x是白色的,即沒被搜尋到的,將t和x入佇列......直到最後,隊列為空,所有元素都被遍歷到了。
四,bfs的複雜度
1.空間複雜度
由於每個結點和每條邊都要被儲存,所以空間複雜度為o(v+e)
2.時間複雜度
對結點初始化的複雜度為o(v),在訪問結點時,需要遍歷每一條邊,因此搜尋時的複雜度為o(e),因此總時間複雜度為o(v+e)
五,bfs的**
**中圓形表示白色,三角形表示灰色,正方形表示黑色,其他結點在構造時已經初始化完畢所以沒有寫上去
void bfs(graph * graph, node * startnode)
} u->setshape(square);
}}
《演算法導論》筆記 第22章 22 2 廣度優先搜尋
在給定圖g v,e 和乙個特定的源頂點s的情況下,廣度優先搜尋棵發現從s可達的所有頂點,並計算s到這些可達頂點之間的最短邊數。廣度優先樹,根為s,且包括所有s的可達頂點。樹中從s到v的路徑對應於圖g中從s到v的一條最短路徑,即包含最少邊數的路徑。對有向圖無向圖都適用。如果u處於從根s到頂點v的路徑中...
廣度優先搜尋演算法
廣度優先搜尋 bfs 這個是第乙個研究的課題,廣度優先搜尋也叫寬度優先搜尋,英文為breadth first searth,開始看的時候一頭霧水,基本也能懂大致意思,但是還不是真正的理解,今天又仔細看看,大致理解上又更深了一層吧。下面來總結下,自己的一些體會,以及對它的獨到的理解。大的方面來說它是一...
廣度優先搜尋演算法
在深度優先搜尋中,深度越大的結點越先得到擴充套件。如果把它改為深度越小的結點越先得到擴充套件,就是廣度優先搜尋法。廣度優先搜尋演算法的基本思想 1 建立乙個空的狀態佇列ss 2 建立乙個空的狀態庫sb 3 把初始狀態s 0 存入佇列ss中 4 若佇列狀態是目標狀態,則搜尋成功,演算法執行中止。如該狀...