一、搜尋方法:
深度搜尋常用於解決圖的遍歷問題(尤其是矩陣圖如迷宮問題等),比如求解從某乙個點到另乙個點的最短距離,則只需遍歷所有路徑,在遍歷同時記錄路徑長度,最後一定能找到最短的距離,但這種方法複雜度較高,因為要遍歷完所有結點才能找到。
深度搜尋是回溯法的主要方法,沿著一條路一直走,走不通再回溯到上一節點,選擇其他路徑。
三、深度搜尋模板(對於矩陣圖)
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 演算法,其過程要來說是對每乙個可能的分支路徑深入到不能...