本質區別
bfs 的重點在於佇列,而 dfs 的重點在於遞迴。這是它們的本質區別。
dfs 演算法
是一種利用遞迴(實質上是用棧來儲存未訪問的結點,先進後出)實現的搜尋演算法,直到找到解或走不下去為止。簡單來說,其搜尋過程和 「不撞南牆不回頭」 、「樹的先序遍歷」類似。
bfs演算法
是一種利用佇列(用佇列來儲存未訪問的結點,先進先出)實現的搜尋演算法。簡單來說,其搜尋過程和 「湖面丟進一塊石頭激起層層漣漪」 、「樹的層次遍歷」類似。
應用方向的不同
bfs 常用於找單一的最短路線,它的特點是 「搜到就是最優解」;
dfs 常用於找所有解的問題,找到的不一定是最優解。
比如:這道題:求綠點到紅點的最短路徑。就適合用bfs來做,而dfs雖能做出來但不適合。
怎麼學bfs和dfs?只有乙個方法:去做題。
bfs框架
#include
#include
#include
#include
using
namespace
std;
const
int maxn=100;
bool vst[maxn][maxn]; // 訪問標記
int dir[4][2]=; // 方向向量
struct state // bfs 佇列中的狀態資料結構
;state a[maxn];
bool checkstate(state s) // 約束條件檢驗
void bfs(state st)
for(int i=0;i<4;i++)
}q.pop(); // 隊首元素出隊。其實前面取了q.front()就可讓隊首元素出隊了。
}return;
}int main()
dfs框架//該dfs 框架以2d 座標範圍為例,來體現dfs 演算法的實現思想。
#include
#include
#include
using
namespace
std;
const
int maxn=100;
bool vst[maxn][maxn]; // 訪問標記
intmap[maxn][maxn]; // 座標範圍
int dir[4][2]=; // 方向向量,(x,y)周圍的四個方向
bool checkedge(int x,int y) // 邊界條件和約束條件的判斷
void dfs(int x,int y)
for(int i=0;i<4;i++)
return; // 沒有下層搜尋節點,回溯
}int main()
參考bfs和dfs演算法原理(通俗易懂版) DFS和BFS演算法
一 深度優先遍歷 深度優先搜尋,是圖論中的經典演算法。其利用深度優先搜尋演算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。遞迴定義 圖的深度優先遍歷類似於樹的前序遍歷。採用的搜尋方法的特點是盡可能先對縱深方向進行搜尋。這種搜尋方法稱為深度優先搜...
演算法強化 BFS和DFS
演算法過程 1.首先將根節點放入佇列中 2.從佇列中取出第乙個節點,進行訪問,並將其所有未訪問過的鄰居加入佇列彙總 3.若隊列為空,則演算法結束 時間複雜度 不確定,v 代表節點數量,e 代表邊的數量 鄰接表表示時,查詢所有頂點的鄰接點所需時間為o e 訪問頂點的鄰接點所花時間為o v 總的時間複雜...
演算法 dfs和bfs的演算法實現
bfs主要應用於連通圖的遍歷,它的核心思想是從乙個頂點開始,輻射狀地優先遍歷其周圍較廣的區域,即逐層遍歷,bfs最經典的應用場景為最短路徑,很多最短路徑演算法都是基於bfs實現,bfs通常基於佇列的思想實現,其實現過程如下 1 頂點入佇列 2 隊列為空,演算法結束,佇列非空,演算法繼續執行 3 出佇...