BFS DFS區別,詳解

2021-08-07 03:17:14 字數 1642 閱讀 1041

寫在最前的三點:

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

2、實現bfs和dfs都需要解決的乙個問題就是如何儲存圖。一般有兩種方法:鄰接矩陣和鄰接表。這裡為簡單起見,均採用鄰接矩陣儲存,說白了也就是二維陣列。

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

4、**裡store_graph部分沒有實現該圖,按編號自己輸進去吧。

一、深度優先搜尋遍歷

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

① 訪問v

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

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

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

3、演算法**:

#include

#include

using namespace std;

int a[11]

[11];

bool visited[11]

;void

store_graph()

//鄰接矩陣儲存圖

void

dfs_graph()

//深度遍歷圖

void

dfs(

int v)

//深度遍歷頂點

}int

adj(

int x)

//求鄰接點

intmain()

4、小測試

二、廣度優先搜尋遍歷

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

①訪問v

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

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

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

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

3、演算法**:

#include

#include

#include

using namespace std;

int a[11]

[11];

bool visited[11]

;void

store_graph()

void

bfs_graph()

void

bfs(

int v)

adj=

adj(temp);}

}}intadj

(int x)

intmain()

4、小測試:

寶島探險 BFS DFS

include int a 10 10 0表示海洋,1 9表示陸地的海拔,降落在 6,8 處,計算出該島的面積 有多少個格仔 即從 6,8 處進行廣度優先搜尋,sum struct note int main int startx 6,starty 8 intsum 0 int next 4 2 右...

BFS DFS 最短路徑

def bfs garph,s param garph 圖 param s 開始的節點 return queue 存放所有的順序 seen set seen.add s while len queue 0 vertex queue.pop 0 nodes graph vertex for w in ...

BFS DFS演算法小總結

先說明,這篇部落格記載了一些比較水的,入門的搜尋,如果想找高階點的,這篇可能會讓各位失望的喔!待啥時候這篇部落格寫豐富了再把這句話刪了 bfs 1.迷宮問題 這個題可以說的上是廣搜裡面最經典的一道入門題目了,個人覺得這個例題很好地表現了廣度優先搜尋是如何與佇列先進先出 fifo 的思想聯絡起來的,通...