搜尋這個東西看起來簡單
但實際操作時,卻異常複雜
複雜就複雜在演算法的優化上
深搜基操——誒
展示下吧
if判斷—>for迴圈列舉各個方向->對目標操作->遞迴->回溯
額優化有兩種
1°:記憶化搜尋:
dp題數字三角形,其中一種方法是記憶化搜尋:
需要開額外空間來儲存
額就是以空間換時間
這個題就不貼**了
2°:剪枝:
因為剪枝比較複雜,我就舉個例子說說
剪枝有兩種
一種是可行性剪枝
及早發現正在探索的路走不到終點
因而不再走下去,這種剪枝屬於比較基礎的
另一種是最優性剪枝
走到某節點時發現此時付出的代價已經超過前面記錄的
故不在走下去
看起來都挺簡單
其實確實不複雜
但最優性剪枝的分支——
預見性最優性剪枝
處處最優剪枝
就比較複雜了
預見性:走到某節點確實不超過範圍,但預見未來必定會超過範圍
故不在走下去
處處最優:記下起點到目前每乙個點最優路徑的代價
篇幅有限,就舉例處處最優
1 #include2 #include3 #include4 #include5using
namespace
std;
6struct
road;
11 vector> vec(110
);12
intnow_len;
13int
now_cost;
14int opt_len=1
<<30;15
intcostl;
16int
totcost;
17int
n,r;
18bool visit[110
];19
int d_cost_len[110][10100
];20
void search(int
);21
int main(void)22
31for(int i=0;i<110;++i)
3237
}38 memset(visit,0,sizeof
(visit));
39 visit[1]=1
;40 search(1
);41
if(opt_len<(1
<<30)) cout<42else cout<43}
44void search(int
c)50
for(int i=0;ii)
5165
}66 }
11行:vec是動態二位陣列
55行:可行性剪枝,錢不夠就退回去
54行:在路費與終點都一定的情況下,優先路程最短的,檢查是否滿足處處最優性
56-63行:回溯
搜尋是一種重要的思想
在以後圖的遍歷時
也會經常被使用
-end-
廣度優先搜尋 深度優先搜尋
前言 這幾天複習圖論演算法,覺得bfs和dfs挺重要的,而且應用比較多,故記錄一下。廣度優先搜尋 有乙個有向圖如圖a 圖a廣度優先搜尋的策略是 從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。1.假設我們以頂點0為原點進行搜尋,首先確定鄰接0的頂點集合s0 2.然後確定頂點1的集合s1 頂點2沒有鄰...
廣度優先搜尋,深度優先搜尋
深度優先搜尋 depth first search 簡稱dfs。最直觀的例子就是 走迷宮 廣度優先搜尋 每個頂點都要進出一遍佇列,每個邊也都會被訪問一次,所以 時間複雜度o v e 主要消耗記憶體的是visited prev陣列 queue佇列,所以 空間複雜度o v 深度優先搜尋 每條邊最多會被訪...
深度優先搜尋 廣度優先搜尋
深度優先搜尋 廣度優先搜尋 通過鄰接矩陣對圖進行深搜和廣搜 package com.neusoft.data.structure 深度優先搜尋 廣度優先搜尋 通過鄰接矩陣對圖進行深搜和廣搜 public class dfsbfs 初始化 邊 mmatrix new int vlen vlen for...