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 總的時間複雜...