深度優先搜尋 DFS 的C語言實現(遞迴與棧實現)

2021-10-03 09:32:24 字數 1941 閱讀 9457

深度優先搜尋演算法(英語: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 也就是去除沒有用...