深度優先搜尋演算法(英語:depth-first-search,dfs)是一種用於遍歷或搜尋樹或圖的演算法。沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中乙個作為源節點並重複以上過程,整個程序反覆進行直到所有節點都被訪問為止。屬於盲目搜尋。
dfs 可以使用棧實現也可以使用遞迴實現,使用遞迴比較好理解但是在某些語言或者環境下,對規模較大的圖使用遞迴思路會導致棧溢位。
首先是遞迴版本
#include
using
namespace std;
#define n 100
// 未訪問狀態
#define undiscovered 0
// 已訪問狀態
#define discovered 1
// 訪問結束狀態
#define visited 2
int n, m[n]
[n];
// status:狀態 dtime: 訪問時間 ftime: 結束訪問時間
int status[n]
, dtime[n]
, ftime[n]
;int _clock;
void
dfs_visit
(int u)}
ftime[u]
=++_clock;
status[u]
= visited;
}void
dfs(
)for
(int u =
0; u < n; u++)}
intmain()
}dfs()
;return0;
}
棧實現版本
#include
using
namespace std;
static
const
int n =
100;
static
const
int undiscovered =0;
static
const
int discovered =1;
static
const
int visited =2;
int n, m[n]
[n];
int status[n]
, dtime[n]
, ftime[n]
, _clock;
int next_v[n]
;int
next
(int u)
return-1
;}void
dfs_visit
(int r)
}else}}
void
dfs(
) _clock =0;
for(
int u =
0; u < n; u++
)for
(int i =
0; i < n; i++)}
intmain()
}dfs()
;return0;
}
遞迴版本好理解,沒啥好說的,重點要說一下棧實現版本中的next函式以及next_v 陣列
next函式的作用是找該節點的下乙個相鄰頂點,next_v 陣列是將圖中所有的頂點的訪問狀態記錄下來,這樣可以保證當同時有兩個節點可以走時,每次都是走編號比較小的那個節點。
[2] (日)渡部有隆. 挑戰程式設計競賽 2 演算法和資料結構. 北京:人民郵電出版社, 2016.09.
C語言實現迷宮問題 深度優先搜尋
c語言實現迷宮問題 這裡寫自定義目錄標題 小白一枚,c語言實現迷宮問題,思路為,先將初始點 i,j,di 入棧,進入迴圈,先出棧,之後判斷臨近點 row,col 如果這個點可行,留下標記 在0,1迷宮中用2來標記走過的路,然後將i,j,di入棧 然後更新點座標,找到為止,如下 勿噴,嘻嘻 inclu...
DFS(深度優先搜尋) (C )
1 演算法用途 用於遍歷圖中的節點,有些類似於樹的深度優先遍歷。這裡唯一的問題是,與樹不同,圖形可能包含迴圈,因此我們可能會再次來到同一節點。2 基本思想 深度優先遍歷圖的方法是,從圖中某頂點v出發 1 訪問頂點v 2 依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍歷 直至圖中和v有路徑相通的頂...
深度優先搜尋DFS
作為搜尋演算法的一種,dfs對於尋找乙個解的 np 包括npc 問題作用很大。但是,搜尋演算法畢竟是 時間複雜度是o n 的階乘級演算法,它的效率比較低,在資料規模變大時,這種演算法就顯得力不從心了。關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用...