BFS 廣度優先搜尋

2022-05-01 19:06:10 字數 1161 閱讀 9970

最簡單的搜尋包含 dfs 和 bfs,他們分別有著下面不同的用途和區別:

區別於用途:

1.bfs是用來搜尋最短徑路的解是比較合適的,比如求最少步數的解,最少交換次數的解,因為bfs搜尋過程中遇到的解一定是離根最近的,所以遇到乙個解,一定就是最優解,此時搜尋演算法可以終止。這個時候不適宜使用dfs,因為dfs搜尋到的解不一定是離根最近的,只有全域性搜尋完畢,才能從所有解中找出離根的最近的解。(當然這個dfs的不足,可以使用迭代加深搜尋id-dfs去彌補)

2.空間優劣上,dfs是有優勢的,dfs不需要儲存搜尋過程中的狀態,而bfs在搜尋過程中需要儲存搜尋過的狀態,而且一般情況需要乙個佇列來記錄。

3.dfs適合搜尋全部的解,因為要搜尋全部的解,那麼bfs搜尋過程中,遇到離根最近的解,並沒有什麼用,也必須遍歷完整棵搜尋樹,dfs搜尋也會搜尋全部,但是相比dfs不用記錄過多資訊,所以搜素全部解的問題,dfs顯然更加合適。

下面是廣度優先搜尋的基本思想與模板

bfs用到了佇列的一些操作,其基本思想步驟是:

1.首先將根節點放入佇列中。

2.從佇列中取出第乙個節點,並檢驗它是否為目標。

3.如果找到目標,則結束搜尋並回傳結果。否則將它所有尚未檢驗過的直接子節點加入佇列中。若隊列為空,表示整張圖都檢查過了——亦即圖中沒有欲搜尋的目標。結束搜尋並回傳「找不到目標」。

4.重複步驟2。

其基本模板如下:

初始化佇列q

q=;標記s為已訪問

while(!q.empty())

所有與u相鄰且未訪問過的點進入佇列;(可以通過設乙個方向陣列for一遍實現)

標記u為已訪問;

}

乙個完整的程式如下:

#include#include#includeusing namespace std;

const int maxn=2e5+5;

int v[maxn];

int n,k,t,ans[maxn];

queueq;

void bfs(int start,int last)

if(ne==last) break;}}

}int main()

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節點出發,搜尋周圍所有的圍繞節...