演算法 dfs和bfs的演算法實現

2022-08-21 08:54:10 字數 1403 閱讀 4561

bfs主要應用於連通圖的遍歷,它的核心思想是從乙個頂點開始,輻射狀地優先遍歷其周圍較廣的區域,即逐層遍歷,bfs最經典的應用場景為最短路徑,很多最短路徑演算法都是基於bfs實現,bfs通常基於佇列的思想實現,其實現過程如下:

​       (1)頂點入佇列

​       (2)隊列為空,演算法結束,佇列非空,演算法繼續執行

​       (3)出佇列取得隊頭元素

​       (4)查詢隊頭元素所有子節點,未遍歷則依次入隊

​       (5)轉步驟2

/* bfs 偽** */

bool

bfs(node n)

q.pop();

//隊首出隊

for (node x in front)

}}  

return

false

;}

深度優先搜尋dfs(depth first search)主要應用於連通圖的遍歷,是從初始結點開始擴充套件,擴充套件順序總是先擴充套件最新產生的結點。這就使得搜尋沿著狀態空間某條單一的路徑進行下去,直到最後的結點不能產生新結點或者找到目標結點為止。當搜尋到不能產生新的結點的時候,就沿著結點產生順序的反方向尋找可以產生新結點的結點,並擴充套件它,形成另一條搜尋路徑。

為了便於進行搜尋,要設定乙個表儲存所有的結點。由於在深度優先搜尋演算法中,要滿足先生成的結點後擴充套件的原則,所以儲存結點的表一般採用棧這種資料結構。

深度優先搜尋演算法的搜尋步驟一般是:

(1)從初始結點開始,將待擴充套件結點依次放到棧中。

(2)如果棧空,即所有待擴充套件結點已全部擴充套件完畢,則問題無解,退出。

(3)取棧中最新加入的結點,即棧頂結點出棧,並用相應的擴充套件原則擴充套件出所有的子結點,並按順序將這些結點放入棧中。若沒有子結點產生,則轉(2)。

/* dfs 偽** */

//遞迴版

bool

dfs(node n)

for (node x in n)

unvisit(x);

//若要遍歷所有路徑,需要重置節點狀態,若只需遍歷所有節點,則不需要重置節點狀態

}  }

return

false; //

本次搜尋無解}//

非遞迴版

bool

dfs(node n)

if(check(s.top()))

visit(s.top());

//標記當前節點已訪問

for (node x in n) }  

return

false; //

搜尋無解}//

上下左右方向遍歷

const

int dir[5] = ;

for (int i = 0; i < 4; i++)

DFS和BFS演算法

本質區別 bfs 的重點在於佇列,而 dfs 的重點在於遞迴。這是它們的本質區別。dfs 演算法 是一種利用遞迴 實質上是用棧來儲存未訪問的結點,先進後出 實現的搜尋演算法,直到找到解或走不下去為止。簡單來說,其搜尋過程和 不撞南牆不回頭 樹的先序遍歷 類似。bfs演算法 是一種利用佇列 用佇列來儲...

DFS和BFS演算法

一 深度優先遍歷 深度優先搜尋,是圖論中的經典演算法。其利用深度優先搜尋演算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。遞迴定義 圖的深度優先遍歷類似於樹的前序遍歷。採用的搜尋方法的特點是盡可能先對縱深方向進行搜尋。這種搜尋方法稱為深度優先搜...

演算法強化 BFS和DFS

演算法過程 1.首先將根節點放入佇列中 2.從佇列中取出第乙個節點,進行訪問,並將其所有未訪問過的鄰居加入佇列彙總 3.若隊列為空,則演算法結束 時間複雜度 不確定,v 代表節點數量,e 代表邊的數量 鄰接表表示時,查詢所有頂點的鄰接點所需時間為o e 訪問頂點的鄰接點所花時間為o v 總的時間複雜...