深度優先搜尋,是從初始狀態起,利用一定的規則生成搜尋樹,尋找下一層任乙個結點,檢查是否出現目標狀態,若未出現,以此狀態利用規則生成再下一層任乙個結點,再檢查,重複過程一直到葉節點(即不能再生成新狀態節點),當它仍不是目標狀態時,回溯到上一層結果,取另一可能擴充套件搜尋的分支。採用相同辦法一直進行下去,直到找到目標狀態為止。
剪枝,就是減小搜尋樹規模、盡早排除搜尋樹中不必要的分支的一種手段。形象地看,就好像剪掉了搜尋樹的枝條,故稱之為「剪枝」。在深度優先搜尋中,有以下幾類常見的剪枝方法:
1.優化搜尋順序
在一些搜尋問題中,搜尋樹的各個層次、各個分支之間的順序不是固定的。不同的搜尋順序會產生不同的搜尋樹形態,其規模大小也相差甚遠。
大部分情況下,優先搜尋分支較少的節點。
2.排除等效冗餘
在搜尋過程中,如果我們能夠判定從搜尋樹的當前節點上沿著某幾條不同分支到達的子樹是等效的,那麼只需要對其中的一條分支執行搜尋。
3.可行性剪枝
在搜尋過程中,及時對當前狀態進行檢查,如果發現分支已經無法到達遞迴邊界,就執行回溯。這就好比我們在道路上行走時,遠遠看到前方是乙個死胡同,就應該立即折返繞路,而不是走到路的盡頭再返回。
某些題目條件的範圍限制是乙個區間,此時可行性剪枝也被稱為「上下界剪枝」。
4.最優性剪枝
在最優化問題的搜尋過程中,如果當前花費的代價已經超過了當前搜到的最優解,那麼無論採取多麼優秀的策略到達遞迴邊界都不可能更新答案。此時可以停止對當前分支的搜尋,執行回溯。
5.記憶化
可以記錄每個狀態的搜尋結果,在重複遍歷乙個狀態時直接檢索並返回。這就好比我們對圖進行深度優先遍歷時,標記乙個節點是否已經被訪問過。
搜尋剪枝DFS
tempter of the bone hdu1010 題意 給乙個圖,找出乙個看能否能在t的時間內從s到達d點 思路 bfs肯定不行,因為bfs找到的是最短時間的路徑,無法對在t時間點到達d點進行判斷 於是才想到了dfs,這個能把所有的情況遍歷一遍的演算法,雖然圖的長寬只有7,但是總是超時,這次終...
DFS搜尋 剪枝
hdu 5952 題意 給出一張無向圖,然後判斷這張圖中一共有多少個不同的大小為s的完全圖 完全圖的頂點數為s個 題目保證每個點的度不大於20。完全圖 n個點兩兩之間都有一條邊的圖叫完全圖。思路 由於頂點個數很少,而且每個點的度數最多是20,所以可以暴力優化,建圖,對於每個s點完全子圖,如果i點在子...
棋盤(dfs 剪枝)
題目描述 有乙個m mm m的棋盤,棋盤上每乙個格仔可能是紅色 黃色或沒有任何顏色的。你現在要從棋盤的最左上角走到棋盤的最右下角。任何乙個時刻,你所站在的位置必須是有顏色的 不能是無色的 你只能向上 下 左 右四個方向前進。當你從乙個格仔走向另乙個格仔時,如果兩個格仔的顏色相同,那你不需要花費金幣 ...