DFS小結

DFS

        通過一些leetcode上面的題目, 總結出以下類型的題目;

  • 樹先序遍歷
  • DFS + 回溯
  • DFS + 記憶化
  • DFS + 減枝
  • DFS 求最短路
  • DFS 求聯通塊兒

先序遍歷

        過於簡單, 看看數據結構都能懂的。

題目


DFS + 回溯

        比較典型的問題是 迷宮, 八皇后 等問題, 也比較簡單。

        當此題如果是判斷某種情況存不存在, 則判斷到存在的時候立馬停止掉後續的所有DFS。

題目


DFS + 記憶化

        DFS過程當中同一個 節點的 狀態可以多次進入, 而多次進入的需要求得結果均可使用第一次求得的結果, 這樣能節省大量的時間。

模板

T dfs(...)
{
    if 子節點已經記載:
        求得當前頂點所對應的值
    else
        dfs(子節點)
        再求得當前頂點所對應的值

    //此處記載當前頂點對應的值。
}

題目

給定一個整數矩陣,找出最長遞增路徑的長度。
對於每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。

輸入: nums = 
[
  [9,9,4],
  [6,6,8],
  [2,1,1]
] 
輸出: 4 
解釋: 最長遞增路徑爲 [1, 2, 6, 9]。
分析

        當DFS過程當中, 記錄下當前DFS過程當中每個頂點的最長上升長度, 當其餘DFS過程再次進入這些頂點的時候, 能夠直接使用而不用在遞歸了。


DFS + 減枝

        根據先前DFS路徑當中求得的某些結果, 判斷當前DFS是否繼續進行下去。


DFS求最短路徑

        列出如下三種情況求一個頂點到剩餘所有頂點的最短距離, 求一個頂點最多隻能經過K條邊到剩餘頂點的最短距離, 求一個頂點最多隻能經過K條邊到指定頂點的最短距離, 並作出 減枝條件的 對比。

題目1

編號從1-n的一個有向圖, 求編號爲1的頂點到其他頂點之間的最短距離。

分析

        當DFS過程當中發生一個頂點二次進入的時候, 減枝方法爲: 只需判斷 先前DFS得出的 1 到 當前頂點距離, 和 當前DFS得出的 1 到 當前頂點的距離即可, 前者大, 則繼續DFS, 後者大, 則終止當前DFS。

1

題目2

頂點編號從1-n的有向圖, 求出頂點1, 經過k條邊所能到達的頂點的最短距離。

分析

        當DFS過程當中發生一個頂點的二次進入的時候, 不能再使用題目一當中的減枝條件了, 因爲即使 1 到 當前頂點的距離比先前DFS計算的大, 但是可能 此 DFS 到當前頂點的經過的邊數少, 能到達先前DFS過程中未能達到的頂點, 因此減枝條件爲: 如果到達此頂點時經過的邊數少於先前DFS到達此頂點時的邊數, 則繼續DFS, 反之 則 需要比較兩次的DFS的距離, 此次距離小才能繼續DFS, 否則減枝。

2

題目3

有 n 個城市通過 m 個航班連接。每個航班都從城市 u 開始,以價格 w 抵達 v。

現在給定所有的城市和航班,以及出發城市 src 和目的地 dst,你的任務是找到從 src 到 dst 最多經過 k 站中轉的最便宜的價格。 如果沒有這樣的路線,則輸出 -1。

示例 1:
輸入: 
n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]
src = 0, dst = 2, k = 1
輸出: 200

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/
cheapest-flights-within-k-stops
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

分析

        當有K約束時候, 需要限定DFS的路徑(深度) 不能超過K的同時, 減枝方法應該修改爲: 如果當前路徑長度已經大於先前 DFS 累計的長度, 則終止此條DFS路徑(減枝非必須, 爲了不超時)。
3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章