DFS和BFS演算法

2021-08-14 08:37:12 字數 1768 閱讀 7193

本質區別

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 出佇...