深度優先搜尋演算法(英語:depth-first-search,簡稱dfs)是一種用於遍歷或搜尋樹或圖的演算法。沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中乙個作為源節點並重複以上過程,整個程序反覆進行直到所有節點都被訪問為止。屬於盲目搜尋。
深度優先搜尋是圖論中的經典演算法,利用深度優先搜尋演算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。(摘自wiki百科)
(來自網路)
演算法實現:利用函式棧來儲存當前搜尋路徑中每個節點的狀態,每搜尋乙個新節點,就標記此節點被使用並遞迴呼叫一次dfs函式,確定此節點在本路徑中無法到達終點,則return上一級函式,更換下一節點。
注意問題:1、回溯後是否要將節點標記重置應該看路徑**是否會對節點能否到達出口產生影響,如果任意路徑到達此節點都不會影響它能否到達終點,則不去除標記,因為即使下一次搜尋到它,也知道它無法到達終點,從而跳過它。
如果不同路徑**會影響,則需要重置標記,保證能被其他路徑再次選取。
2、剪枝,通過對題目的理解,在選取節點遞迴之前,直接判斷此節點能否到達終點,從而減少大量不必要的搜尋過程。
更多技巧需要在寫題目中自己探索~
帶注釋模板:
hdu-1181
1//dfs模板題 hdu 1181
23 #include 4 #include
5 #include 6 #include
7using
namespace
std;
8string str[300];9
int vis[300],i;//
標記陣列,在一條路徑中,被查詢過的節點不能被再次查詢,不然就會使路徑出現迴圈
10int flag = 0;//
用於判定搜尋是否查詢到路徑
11void dfs(string
use)
1226
else
27 dfs(str[k]);//
否則繼續向下搜尋
28//
vis[k]=0
29//
大部分dfs在一條路徑搜尋失敗後都需要回溯到上一狀態
30//
通常需要把從本節點後產生的標記都重置
31//
實際上是否需要重置標記,應該看路徑**是否會對節點能否到達出口產生影響
32//
在本題中。如果str[k]是到所求路徑中的乙個節點,不管從什麼途徑搜尋到了str[k],都不影響他到達終點。33}
34}35}
36int
main() 51}
52 i = 0;//
有多組測試樣例,每完成一組,重置i
53if (flag == 1
)54 cout << "
yes.
"<
55else
56 cout << "
no."
<
58else
59 i++;60}
61return0;
62 }
深度優先搜尋DFS總結
dfs不易混亂的敲碼思路 int dfs int x,int step,int n 王道機試指南第二版,例題9.3 a knight s journey 題目大意 將士每天看著相同的黑白方塊感到越來越無聊並決定去世界各地旅行。騎士按照 日 子規則行走。騎士的世界就是他生活的棋盤。騎士生活在比普通8x...
演算法總結 DFS 深度優先搜尋
目錄二 dfs的具體實現 三 剪枝 四 練習 1.什麼是dfs 深度優先搜尋演算法,又稱dfs depth first search dfs演算法是一種搜尋演算法,而搜尋演算法實質上是一種列舉,即借助計算機的高效能來有目的地列舉乙個問題的部分情況或這個問題的所有情況,進而求出問題的解的一種方法。2....
廣度優先搜尋 深度優先搜尋
前言 這幾天複習圖論演算法,覺得bfs和dfs挺重要的,而且應用比較多,故記錄一下。廣度優先搜尋 有乙個有向圖如圖a 圖a廣度優先搜尋的策略是 從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。1.假設我們以頂點0為原點進行搜尋,首先確定鄰接0的頂點集合s0 2.然後確定頂點1的集合s1 頂點2沒有鄰...