DFS與BFS的區別 用法 詳解?

2021-07-26 02:59:39 字數 1708 閱讀 2056

寫在最前的三點:

1、所謂圖的遍歷就是按照某種次序訪問圖的每一頂點

一次僅且一次。

2、實現bfs和dfs都需要解決的乙個問題就是如何儲存圖。一般有兩種方法:鄰接矩陣和鄰接表。這裡為簡單起

見,均採用鄰接矩陣儲存,說白了也就是二維陣列。

3、本文章的小測試部分的測試例項是下圖:

一、深度優先搜尋遍歷

1、從頂點v出發深度遍歷圖g的演算法

① 訪問v

② 依次從頂點v未被訪問的鄰接點出發深度遍歷。

2、一點心得:dfs演算法最大特色就在於其遞迴特性,使得演算法**簡潔。但也由於遞迴使得演算法難以理解,原因

在於遞迴使得初學者難以把握程式執行到何處了!一點建議就是先學好遞迴,把握函式呼叫是的種種。

3、演算法**:

[cpp]view plain

copy

#include

using

namespace

std;  

inta[11][11];  

bool

visited[11];  

void

store_graph()  

//鄰接矩陣儲存圖

void

dfs_graph()    

//深度遍歷圖

void

dfs(

intv)  

//深度遍歷頂點

}  intadj(

intx)   

//求鄰接點

intmain()    

4、小測試

二、廣度優先搜尋遍歷

1、從頂點v出發遍歷圖g的演算法買描述如下:

①訪問v

②假設最近一層的訪問頂點依次為vi1,vi2,vi3...vik,則依次訪問vi1,vi2,vi3...vik的未被訪問的鄰接點

③重複②知道沒有未被訪問的鄰接點為止

2、一點心得:bfs演算法其實就是一種層次遍歷演算法。從演算法描述可以看到該演算法要用到佇列這一資料結構。我這

裡用stl中的實現。該演算法由於不是遞迴演算法,所以程式流程是清晰的。

3、演算法**:

[cpp]view plain

copy

#include

#include

using

namespace

std;  

inta[11][11];  

bool

visited[11];  

void

store_graph()    

void

bfs_graph()      

void

bfs(

intv)  

adj=adj(temp);  

}  }  

}  int

adj(

intx)     

intmain()    

4、小測試:

DFS與BFS之間的區別

一般來說用dfs解決的問題都可以用bfs來解決。dfs 深搜的同時考慮回溯 bfs 佇列,入佇列,出佇列 dfs 棧,壓棧,出棧 bfs是按一層一層來訪問的,所以適合有目標求最短路的步數,你想想層層搜尋每次層就代表了一步。bfs優先訪問的是兄弟節點,只有這一層全部訪問完才能訪問下一層,也就是說bfs...

BFS和DFS的區別與分析

深度優先遍歷 對每乙個可能的分支路徑深入到不能再深入為止,而且每個結點只能訪問一次。要特別注意的是,二叉樹的深度優先遍歷比較特殊,可以細分為先序遍歷 中序遍歷 後序遍歷 我們前面使用的是先序遍歷 具體說明如下 先序遍歷 對任一子樹,先訪問根,然後遍歷其左子樹,最後遍歷其右子樹。中序遍歷 對任一子樹,...

dfs和bfs的區別

詳見 部落格 回溯法是一種搜尋法,按條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法 例如這張圖,從1開始到2,之後到5,5不能再走了,退回2,到6,退回2退回1,到3,一直進行 void dfs int deep 這裡可能...