深度優先遍歷(DFS)

2021-10-21 13:33:32 字數 2603 閱讀 2473

深度優先搜尋是一種列舉所有完整路徑以遍歷所有情況的搜尋方法。使用遞迴可以很好的實現深度優先遍歷,因此,只能說遞迴是實現深度優先遍歷的一種實現方式。

給定乙個序列,列舉這個序列所有的子串行

例如子串行包含,,,,,,

選擇最優子串行,使它的某個特徵是所有子串行中最優的。

這個問題也就是從n個整數中,選擇k個數的所有方案。

n件物品,重量w[i]

,價值c[i]

,選出若干,使總重量不超過v,找出價值最大的值

思路

使用dfs遍歷判斷

結束條件,所有的可能序列遍歷一遍

岔路口分支:選擇當前物品,或者不選擇當前物品。

**

#include

const

int maxn =20;

int w[maxn]

,c[maxn]

;int n,v;

int maxc =0;

void

dfs(

int index,

int sumw,

int sumc)

return

;//即使不是最大的maxc也要return 出去

}dfs

(index +

1,sumw,sumc)

;dfs

(index +

1,sumw+w[index]

,sumc+c[index]);

//注意下標的差1

改進(剪枝)

原先直接加入當前物品,也不管不顧是否已經超出了總重量,

現在在加入之前,提前加入判斷條件

#include

const

int maxn =20;

int w[maxn]

,c[maxn]

;int n,v;

int maxc =0;

void

dfs(

int index,

int sumw,

int sumc)

dfs(index +

1,sumw,sumc);if

(sumw+w[index]

<= v)

}int

main()

for(

int i =

0; i

)dfs(0

,0,0

);printf

("%d\n"

,maxc)

;return0;

}

n個整數中選擇k個數,使得整數和恰好等於給定的整數x,如果有多種方案,選擇平方和最大。
這裡加入了如何儲存最優方案,先用乙個temp用來存放該過程的乙個序列,如果是當前最優,則交給ans

#include

#include

using

namespace std;

const

int maxn =20;

int w[maxn]

;int n,k,x;

int maxseq =0;

vector<

int> temp,ans;

void

dfs(

int index,

int nowk,

int sum,

int sumseq)

return

;//即使不是最大的maxc也要return 出去}if

(index == n||nowk> k ||sum > x)

//選擇當前的

temp.

push_back

(w[index]);

dfs(index +

1,nowk +

1,sum +w [index]

,sumseq + w[index]

* w[index]);

temp.

pop_back()

;dfs

(index +

1,nowk ,sum ,sumseq)

;//不選擇

}int

main()

dfs(0,

0,0,

0);for

(auto it = ans.

begin()

;it!=ans.

end(

);it++

)printf

("\n");

printf

("%d\n"

,maxseq)

;return0;

}

深度優先遍歷DFS

本文章 中的圖用鄰接矩陣來表示,所以演算法複雜度為o v 2 如果用鄰接表來表示,那麼演算法的複雜度為o v e dfs可用來判斷圖中是否有環,展現無向圖中的連通分支。通過dfs,形成乙個由多棵深度優先樹所組成的深度優先森林。將原先圖中的邊新增到該森林之後,可以將所有邊定義為以下四類 1.樹邊 森林...

如何實現深度優先遍歷(DFS)

dfs實現步驟如下 訪問頂點v,並標記v已經訪問 查詢v的第乙個鄰接頂點w 若w存在,則繼續執行,否則演算法結束 若w未被訪問,則使用dfs遞迴訪問w 查詢v的下乙個鄰接節點,並記為w,轉到步驟 對上圖進行dfs,則訪問順序為 a b d c e 使用偽 如下 vector g maxn int v...

演算法基礎 DFS(深度優先遍歷)

brycezou 163.com dfs的基本思想 從圖的某個頂點開始,一路向前,當沒有 新的 未被訪問的 頂點可訪問時逐層回退,繼續去發現新的頂點 直到源點可達的所有頂點都被訪問為止。這一過程類似於樹的前序遍歷。本文基於圖的鄰接表形式,分別給出了遞迴版本和非遞迴版本的dfs演算法 本 旨在清晰地展...