昨天和今天開始做搜索的題目,進度略慢,昨天只做出一道題,今天也只做出一道,而且還都是似懂非懂的狀態。發現一個問題,從區間dp開始,一直屬於一種水過地皮溼的學習狀態,當時會了,再回頭一看,其實好多細節問題處理的不好,也就是沒有理解透徹。
還是先說一下自己最近看的文章,關於DFS。 (1)算法原理
深度優先搜索即Depth First Search,是圖遍歷算法的一種。用一句話概括就是:“一直往下走,走不通回頭,換條路再走,直到無路可走”。
DFS的具體算法描述爲選擇一個起始點v作爲當前結點,執行如下操作:
a. 訪問 當前結點,並且標記該結點已被訪問,然後跳轉到b;
b. 如果存在一個和 當前結點 相鄰並且尚未被訪問的結點u,則將u設爲 當前結點,繼續執行a;
c. 如果不存在這樣的u,則進行回溯,回溯的過程就是回退 當前結點;
上述所說的當前結點需要用一個棧來維護,每次訪問到的結點入棧,回溯的時候出棧(也可以用遞歸實現,更加方便易懂)。
( 2) 算法實現
深搜最簡單的實現就是遞歸,寫成僞代碼如下: def DFS(v):
visited[v] = true
dosomething(v)
for u in adjcent_list[v]:
if visited[u] is false:
DFS(u)
其中dosomething表示訪問時具體要乾的事情,根據情況而定,並且DFS是允許有返回值的。
另外還在CSDN上看到了一個很好的模板 void dfs()//參數用來表示狀態
{
if(到達終點狀態)
{ ...//根據題意添加
return;
}
if(越界或者是不合法狀態)
return;
if(特殊狀態)//剪枝
return ;
for(擴展方式)
{
if(擴展方式所達到狀態合法)
{
修改操作;//根據題意來添加標記;
dfs();
(還原標記);
//是否還原標記根據題意
//如果加上(還原標記)就是 回溯法
}
}
}
除此之外,DFS非遞歸實現涉及圖論的內容,也就不做深入瞭解了。
4.17學習日誌
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.