演算法導論 22 2 廣度優先搜尋

2021-08-21 05:27:42 字數 2030 閱讀 6358

一,廣度優先搜尋的思想

訪問完所有結點後,我們可以知道從源結點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 若佇列狀態是目標狀態,則搜尋成功,演算法執行中止。如該狀...