論DFS(深度優先搜尋)

2021-08-28 20:15:34 字數 1684 閱讀 2457

dfs**師:說了這麼久的深搜(發的有關深搜的題解都說很快會寫關於深搜的總結),今天終於寫完了,(不是博主偷懶,是博主之前也沒有弄得透徹,昨晚鄙人夜觀天象,覺得今天時機成熟了)

首先,深搜肯定是noip競賽必不可少的方法,即使拿不到全分,也可以收收過路費,取得個不錯的成績的;

深搜有乙個基本的模板(當然我在深搜題解上,我都打了這個模板的):

int search(int t)

else}}

}注意事項:

1.第乙個if是符合輸出解的條件,第二個if是符合進一步搜尋的條件;

2.下一步搜尋時,不是使用return search(t+1),直接search(t+1);

(新手可能會注意不到這個關鍵的地方,以至於每次寫完不知道為什麼只得到乙個答案就返回主程式了)

3.for迴圈之後的if可以是多個;

4.for迴圈邊界,例如:

1>方向是四個,那麼邊界肯定就是4;

2>素數環需要嘗試1至20,那麼邊界就是20;

初學的時候,覺得很難記,因為整個模板有兩個if判斷,然後兩個if在剛開始學的時候就亂用(經常被教練罵,開個玩笑),直到看的深搜題多了,做的深搜題多了,慢慢地就對兩個if的實際用途有了一定的了解,那麼接下來我就詳細講講我的深搜心得:

兩個if實際上是有自己的工作和責任的;

第乙個if(也就是search下面的那個if)的作用是:判斷是否達到輸出的條件,如果達到了條件,就輸出解;

第二個if(也就是for迴圈下的那個if)的作用是:判斷是否達到了進一步搜尋的條件,如果達到了就進一步搜尋;

兩個if還是有本質上的差異的,上面的看不懂,我就舉乙個例子;

eg:走迷宮(從起始點到終點,不可以走回頭路,有障礙)

那麼第乙個if應該判斷的條件是是否到達了終點;

if(x==dx&&y==dy)//dx是終點的橫座標,dy是終點的縱座標;

那麼第二個if幹什麼用呢???

它就用來判斷走到下一步需要什麼要求

//這裡使用temp來標記自己走過的路,map上表示有無障礙;

以上這就是兩個if的區別(當然for迴圈下的if可以有多個);

第二個可能有點模糊的地方就是for迴圈:

for迴圈的邊界是列舉的情況數

例如:素數環(題目問度娘啦)每乙個位置都可以放置1到20數字;一共有20種情況;所以迴圈的時候就是

for(int i=1;i<=20;i++)
再例如迷宮的方向問題,總共就只有上下左右四個方向,那麼就可以將方向使用陣列打表,再乙個for迴圈:

int cx[4]=;//打表;

int cy[4]=;//打表;

for(int i=0;i<=3;i++)//初始值為0,所以邊界也要偏移乙個;

最後就是搜尋的執行順序,講起來非常地抽象,但是記住一句話:搜尋每深入一層,就把它看作是乙個平行宇宙,平行宇宙之間的變數互不干擾(全域性變數除外),例如:素數環的第乙個位置for迴圈中的變數i=3;進入下一步,for迴圈變數i還是從1開始的;而當返回到第乙個位置的時候,i的值就是3;也就是不同深度之間的同一變數(全域性變數除外)互不影響;

**:論dfs(深度優先搜尋)

深度優先搜尋DFS

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

深度優先搜尋 DFS

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

深度優先搜尋(dfs)

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