廣度優先搜尋 BFS

2022-06-26 15:33:10 字數 964 閱讀 1957

定義

維基百科:

給定圖g=(v,e)和乙個可識別的源結點s,廣度優先搜尋對圖g中的邊進行系統性的探索來發現可以從源結點s到達的所有結點。該演算法能夠計算從源結點s到每個可到達結點的距離(最少的邊數),同時生成一棵「廣度優先搜尋樹」。該樹以源結點s為根結點,包含所有可從s到達的結點。該演算法始終是將已發現結點和未發現結點之間的邊界,沿其廣度方向擴充套件,也即是說,演算法需要在發現所有距離源結點s為k的所有結點之後,才會發現距離源結點s為k+1的其他結點。

dijkstra單源最短路徑演算法和prim最小生成樹演算法都採用了和寬度優先搜尋類似的思想。

基本實現思想

(1)頂點v入佇列。

(2)當佇列非空時則繼續執行,否則演算法結束。

(3)出佇列取得隊頭頂點v;訪問頂點v並標記頂點v已被訪問。

(4)查詢頂點v的第乙個鄰接頂點col。

(5)若v的鄰接頂點col未被訪問過的,則col入佇列。

(6)繼續查詢頂點v的另乙個新的鄰接頂點col,轉到步驟(5)。

(7)直到頂點v的所有未被訪問過的鄰接點處理完。轉到步驟(2)。

廣度優先遍歷圖是以頂點v為起始點,由近至遠,依次訪問和v有路徑相通而且路徑長度為1,2,……的頂點。為了使「先被訪問頂點的鄰接點」先於「後被訪問頂點的鄰接點」被訪問,需設定佇列儲存訪問的頂點。

偽**

(1)初始化佇列q;visited[n]=0;

(2)訪問頂點v;visited[v]=1;頂點v入佇列q;

(3) while(佇列q非空)   

v=佇列q的對頭元素出隊;

w=頂點v的第乙個鄰接點;

while(w存在) 

如果w未訪問,則訪問頂點w;

visited[w]=1;

頂點w入佇列q;

w=頂點v的下乙個鄰接點。

附:bfs的有趣應用:

BFS廣度優先搜尋

廣度優先搜尋,利用佇列實現,結束標誌是隊列為空的時候 承接dfs的演算法實現的講例,對於迷宮問題我們也可以採取廣度優先搜尋實現 include iostream include cstdio include cstdlib using namespace std int map 55 55 int ...

bfs廣度優先搜尋

這一課我們來學習圖的另一種遍歷方法 廣度優先搜尋 breadth first search,簡稱 bfs 這是一種連通圖的常用遍歷策略,通常用於求起點到各點的最短路徑,以及求兩點之間的最優路徑等問題。首先我們先來看看廣度優先搜尋的具體方法吧 對於乙個連通圖,我們假設一開始所有頂點均未被訪問,廣度優先...

廣度優先搜尋bfs

bfs即廣度優先搜尋演算法,其是搜尋演算法中的一種。1.dfs常用於尋找是否存在解 其從a節點出發,選取乙個臨近點b,然後不斷深入,在搜尋完b的下屬節點 ehif 後,回到a再搜尋臨近a的c節點,以此類推。2.bfs則用於在最短的時間或最少的移動距離內找到解 其往往從a節點出發,搜尋周圍所有的圍繞節...