廣度優先搜尋一層一層地進行遍歷,每層遍歷都以上一層遍歷的結果作為起點,遍歷乙個距離能訪問到的所有節點。需要注意的是,遍歷過的節點不能再次被遍歷。
第一層:
第二層:
第三層:
每一層遍歷的節點都與根節點距離相同。設 di 表示第 i 個節點與根節點的距離,推導出乙個結論:對於先遍歷的節點 i 與後遍歷的節點 j,有 di
<= dj。利用這個結論,可以求解最短路徑等最優解問題:第一次遍歷到目的節點,其所經過的路徑為最短路徑。應該注意的是,使用 bfs 只能求解無權圖的最短路徑,無權圖是指從乙個節點到另乙個節點的代價都記為 1。
在程式實現 bfs 時需要考慮以下問題:
bfs模板
之前一直沒有總結bfs的模板,就在這簡單記錄一下,可以加快做題速度
建立佇列;
建立訪問情況記錄陣列(資料結構);
while(佇列不為空)
}
也可以選擇在while迴圈中再寫乙個while迴圈,根據queue.size一次最外層迴圈遍歷一層的元素
建立佇列;
建立訪問情況記錄陣列(資料結構);
while(佇列不為空)
}}
例項如下
public int numsquares_improved(int n) }}
return n;
}
從乙個節點出發,使用 dfs 對乙個圖進行遍歷時,能夠遍歷到的節點都是從初始節點可達的,dfs 常用來求解這種可達性問題。
在程式實現 dfs 時需要考慮以下問題:
棧:用棧來儲存當前節點資訊,當遍歷新節點返回時能夠繼續遍歷當前節點。可以使用遞迴棧。
標記:和 bfs 一樣同樣需要對已經遍歷過的節點進行標記。
dfs模板
backtracking(回溯)屬於 dfs。
backtracking 主要用於求解排列組合問題,例如有 三個字元,求解所有由這三個字元排列得到的字串,這種問題在執行到特定的位置返回之後還會繼續執行求解過程。
因此在完成程式時需要通過標記操作來完成回溯操作。
在訪問乙個新元素進入新的遞迴呼叫時,將新元素標記為已經訪問,這樣在繼續遞迴呼叫時不用重複訪問該元素;
但是在遞迴返回時,需要將元素標記為未訪問,因為只需要保證在乙個遞迴鏈中不同時訪問乙個元素,可以訪問已經訪問過但是不在當前遞迴鏈中的元素。這就是完成回溯的關鍵操作。回溯法模板
方法適用問題
dfs可達性
回溯法排列組合問題
bfs最優解
搜尋演算法總結
搜尋演算法,是一種在狀態空間中尋找特定的目標狀態及到達目標狀態的途徑的系統方法。常見的題目如 搜尋是計算機求解問題的最基本方法,適用面很廣,沒有向動態規劃那樣對狀態有最優化原理和無後效性的約束。而針對具體問題,特別是運用了某種智慧型化的優化手段,也許會帶來某些具體的約束。相關題目 poj 3278 ...
搜尋演算法總結
a 演算法,分支限界演算法。如有錯誤歡迎指正。為了便於描述,搜尋演算法適用解決在一張有權無向圖中,找到從原點到終點的最短路徑。wait arr陣列存放待擴充套件的節點。初始化 把初始節點root 加入到wait arr 陣列中 while wait arr陣列不為空 if 還存在子節點 子節點加入到...
ACM搜尋演算法總結
一 回溯演算法 回溯演算法是所有搜尋演算法中最為基本的一種演算法,其採用了一種 走不通就掉頭 思想作為其控制結構,其相當於採用了先根遍歷的方法來構造解答樹,可用於找解或所有解以及最優解。評價 回溯演算法對空間的消耗較少,當其與分枝定界法一起使用時,對於所求解在解答樹中層較深的問題 有較好的效果。但應...