深度優先搜尋

2022-05-16 08:04:42 字數 1572 閱讀 3302

搜尋這個東西看起來簡單

但實際操作時,卻異常複雜

複雜就複雜在演算法的優化上

深搜基操——誒

展示下吧

if判斷—>for迴圈列舉各個方向

->對目標操作->遞迴->回溯

額優化有兩種

1°:記憶化搜尋:

dp題數字三角形,其中一種方法是記憶化搜尋:

需要開額外空間來儲存

額就是以空間換時間

這個題就不貼**了

2°:剪枝:

因為剪枝比較複雜,我就舉個例子說說

剪枝有兩種

一種是可行性剪枝

及早發現正在探索的路走不到終點

因而不再走下去,這種剪枝屬於比較基礎的

另一種是最優性剪枝

走到某節點時發現此時付出的代價已經超過前面記錄的

故不在走下去

看起來都挺簡單

其實確實不複雜

但最優性剪枝的分支——

預見性最優性剪枝

處處最優剪枝

就比較複雜了

預見性:走到某節點確實不超過範圍,但預見未來必定會超過範圍

故不在走下去

處處最優:記下起點到目前每乙個點最優路徑的代價

篇幅有限,就舉例處處最優

1 #include2 #include3 #include4 #include5

using

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...