深度搜尋 DFS 和廣度搜尋 BFS

2021-09-25 08:35:30 字數 1760 閱讀 3171

一、搜尋方法:

深度搜尋常用於解決圖的遍歷問題(尤其是矩陣圖如迷宮問題等),比如求解從某乙個點到另乙個點的最短距離,則只需遍歷所有路徑,在遍歷同時記錄路徑長度,最後一定能找到最短的距離,但這種方法複雜度較高,因為要遍歷完所有結點才能找到。

深度搜尋是回溯法的主要方法,沿著一條路一直走,走不通再回溯到上一節點,選擇其他路徑。

三、深度搜尋模板(對於矩陣圖)

int dxy[4]

[2]=

void

dfs(

int x0,

int y0,

int x1,

int y1)

for(

int i=

0;i<

4;i++

)//遍歷四個方向每乙個分支,對每乙個分支都進行深度搜尋

}

一、搜尋方法廣度搜尋,顧名思義,就是更大範圍內搜尋,與深度搜尋不同的是,深度搜尋是一次搜尋一條路徑,一直搜尋到走不通為止;而廣度搜尋是同時搜尋所有路徑,相當於一層一層地搜尋,就好比波浪的擴充套件一樣。此搜尋方法跟樹的層次遍歷類似,因此寬度搜尋一般都用佇列儲存結構。搜尋原則:

(1)訪問遍歷出發頂點,該頂點入隊

(2)佇列不空,則隊頭頂點出隊;

(3)訪問出隊頂點所有的未訪問鄰接點並將其入隊;

(4)重複(2)(3),直到隊空或者找到目標點

舉個例子,還是對下面這個圖進行廣度遍歷:

二、用途

雖然看似廣度搜尋一次擴張了很多個點,但實際上任然是乙個結點乙個結點地搜尋,只是它是以層層擴張的方式進行搜尋。廣度搜尋也常用於解決圖的遍歷,在求乙個點到另乙個點的最短距離時,廣度搜尋比深度搜尋更有優勢,因為廣度搜尋是層層遍歷的,所以一定存在某條路徑最先到達目標點,只要找到目標點後就退出,就不用搜尋所有點。

廣度搜尋也是分支限界法的主要演算法(當然,分支限界也可能是廣度搜尋和寬度搜尋的結合)。廣度搜尋最常解決的問題型別是:求從某乙個狀態到另乙個狀態的最小步數,每乙個狀態對應多個(擴充套件結點個數)不同的操作。

三、演算法模板

#include

#include

using namespace std;

struct state

;queueq;

intbfs

(int a,

int b,

int a,

int b)

//返回最小步數

//擴充套件其他結點..

....

//擴充套件結點結束*************************************

}return-1

;//不能到達目標狀態,返回-1;

}

經典例題

迷宮問題

DFS(深度搜尋)和BFS(廣度搜尋)

廣度優先搜尋 bfs 利用對列的特性,讓下一節點全部執行完後,再跳到的下一節點。bfs需要用到佇列,具體的可以由題目的情況而定 一般用來解決,給定位置需要你找出到達位置的最短距離 在對列的使用中,佇列提供了乙個位置使得在幾個方向的前進得以同時進行,也就是說我麼在檢索的時候,由於我們同時開花,因此在到...

深度優先搜尋(DFS)和廣度優先搜尋(BFS)

先說dfs 關於dfs和bfs的搜尋題目,首先要將其轉化為樹,如迷宮,也可轉化為樹來搜尋 dfs是一條鏈一條鏈的搜尋,而bfs是逐層進行搜尋,這是他倆乙個很大的區別 給定整數a1 a2 a3 an,判斷是否可以從中選出若干個數,使得他們的和恰好為k。限制條件 樣例 4 n 1 2 4 7 a陣列 1...

深度優先搜尋(DFS)和廣度優先搜尋(BFS)

深度優先搜尋和廣度優先搜尋都是圖形搜尋演算法,1 深度優先搜尋 是針對圖和樹的遍歷演算法,利用深度優先搜尋演算法可以產生目標圖的相應的拓撲排序表,利用拓撲排序表可以方便的解決了很多相關的圖論問題,如最大路徑問題,一般用堆資料結構來輔助實現dfs 演算法,其過程要來說是對每乙個可能的分支路徑深入到不能...