dfs bfs 完全沒這概念啊 QAQ 咋這麼抽象咩 快去找大佬學習哇哇哇~~

序幕(1)來自學姐 “我自有傲骨,不念過往,不畏將來!”的理解
深度優先搜索用棧(stack)來實現,整個過程可以想象成一個倒立的樹形:
1、把根節點壓入棧中。
2、每次從棧中彈出一個元素,搜索所有在它下一級的元素,把這些元素壓入棧中。並把這個元素記爲它下一級元素的前驅。
3、找到所要找的元素時結束程序。
4、如果遍歷整個樹還沒有找到,結束程序。
廣度優先搜索使用隊列(queue)來實現,整個過程也可以看做一個倒立的樹形:
1、把根節點放到隊列的末尾。
2、每次從隊列的頭部取出一個元素,查看這個元素所有的下一級元素,把它們放到隊列的末尾。並把這個元素記爲它下一級元素的前驅。
3、找到所要找的元素時結束程序。
4、如果遍歷整個樹還沒有找到,結束程序。(百度)

一、DFS
1) 算法原理
(1 ) 深度優先搜索即Depth First Search,是圖遍歷算法的一種。用一句話概括就是:“一直往下走,走不通回頭,換條路再走,直到無路可走”。
DFS的具體算法描述爲選擇一個起始點v作爲當前結點,執行如下操作:
a. 訪問 當前結點,並且標記該結點已被訪問,然後跳轉到b;
b. 如果存在一個和 當前結點 相鄰並且尚未被訪問的結點u,則將u設爲 當前結點,繼續執行a;
c. 如果不存在這樣的u,則進行回溯,回溯的過程就是回退 當前結點;
上述所說的當前結點需要用一個來維護,每次訪問到的結點入棧,回溯的時候出棧(也可以用遞歸實現,更加方便易懂)。
Hint: 1、利用結構體,記錄mark和題目要求的基本屬性。
2、用到遞歸,使用遞歸時注意要設置出口,即符合要求時return,注意對遞歸的理解,對於不同情況可能要傳遞不同的參數,但出口都是一樣的。
3、在DFS時可以剪枝,即對明顯不符合條件的情況(基本判斷,比如正方形的四邊一樣長,三角形的兩邊大於第三邊)直接排除,不參與遞歸,在剪枝的時候注意正確的剪枝。所以在DFS超時時可以考慮剪枝。
4、在遞歸發現不符合條件需要返回上一層的時候,要將不符合條件的元素flag消除(DFS、BFS的區別之一)。
(2)如圖1所示,對以下圖以深度優先的方式進行遍歷,假設起點是1,訪問順序爲1 -> 2 -> 4,由於結點4沒有未訪問的相鄰結點,所以這裏需要回溯到2,然後發現2還有未訪問的相鄰結點5,於是繼續訪問2 -> 5 -> 6 -> 3 -> 7,這時候7回溯到3,3回溯到6,6回溯到5,5回溯到2,最後2回溯到起點1,1已經沒有未訪問的結點了,搜索終止,圖中圓圈代表路點,紅色箭頭表示搜索路徑,藍色虛線表示回溯路徑。
這裏寫圖片描述

3、學習鏈接 博客DFS和BFS的一點簡單總結

來一發我的博客題目鏈接 dfs bfs 判斷可達性SDUT2138

發佈了43 篇原創文章 · 獲贊 35 · 訪問量 8286
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章