深度優先搜尋(DFS)

2021-08-28 20:15:34 字數 1032 閱讀 4835

舉例1:部分和問題

給定整數 a1,a2,a3,…,an判斷是否可以從中選中若干數,使他們的和恰好為k.

輸入

n =4;

a=k=

13

輸出

yes
解決方案:

//input

int a[max_n]

;int n, k;

//已經從前i項得到了和sum ,然後對於i項之後的進行分之。

bool dfs

(int i ,

int sum)

void

solve()

舉例2:積水問題

有乙個大小為n*m 的園子,雨後積水。八連通的積水被認為是連線在一起的。請求出園子裡總共有多少水窪?

輸入n=10, m=12

園子如下圖 (『w』表示積水, 『.』 表示沒有積水)

w…ww.

.www…ww.

…w…w…

…w……

……w…

.ww………

輸出3解題思路: 從任意的w開始。不停地把鄰接的部分用』.'代替。 1次dfs後與初始的這個w連線的所有w就都被替換成『.』 , 因此直到圖中不存在w 為止。總共進行dfs的次數就是答案,8個方向共對應了8種狀態轉移,每個格仔作為dfs的引數至多被呼叫一次,所以複雜度為o(8nm)= o(n*m)。

//輸入

int n, m;

char field[max_n]

[max_m+1]

;//園子

//現在位置(x,y)

void

dfs(

int x,

int y)}}

return;}

void

solve()

}}printf

("%d\n"

,res)

;}

引用

[1] 挑戰程式設計競賽(第2版)

深度優先搜尋DFS

作為搜尋演算法的一種,dfs對於尋找乙個解的 np 包括npc 問題作用很大。但是,搜尋演算法畢竟是 時間複雜度是o n 的階乘級演算法,它的效率比較低,在資料規模變大時,這種演算法就顯得力不從心了。關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用...

深度優先搜尋 DFS

深度優先搜尋 縮寫dfs 有點類似廣度優先搜尋,也是對乙個連通圖進行遍歷的演算法。它的思想是從乙個頂點v 0開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上乙個節點,然後從另一條路開始走到底,這種盡量往深處走的概念即是深度優先的概念。你可以跳過第二節先看第三節,還是引用上篇文章的樣例...

深度優先搜尋(dfs)

深度優先搜尋的一般步驟 1 從頂點v出發,訪問v。2 找出剛才訪問過的頂點的第乙個未被訪問的鄰接點,訪問該頂點。以該頂點為新頂點,重複此步驟,直到剛訪問的頂點沒有沒有未被訪問過的鄰接點為止。3 返回前乙個訪問過的仍有未被訪問過的鄰接點的頂點,找出該頂點的下乙個未被訪問過的鄰接點,訪問該頂點。4 重複...