複習 深度優先搜尋

2022-04-30 06:12:13 字數 2519 閱讀 7429

深度優先搜尋(dfs)是利用遞迴完成的以搜尋深度優先的搜尋

通常大概是這樣的:

1

void search(int

vi)9

for( int i = ...; i <= ... ; i++ )

14 }

特點:

1.記憶體消耗小(不像廣搜需要儲存節點數)

2.題目的資料範圍較小(例如noip普及組某年的一道題「子矩陣」)

3.耗時較長(函式的呼叫和返回會耗時,盲目地去列舉所有情況)

4.無法處理深度不能確定的題(例如vijos 埃及分數)

上面提到了耗時較長的問題,這對noip通常是1s限時,貌似會有幾組資料會超時,

但是經常是有一些不可能是最優解的內容,計算機卻只是乙個忠實執行者,

原封不動地照著**執行。

比如部落衛隊(可以去搜搜這道題),如果現在已經選了的人再加上所有還沒有

考慮的人都還是比最優解的人數少,就一定不能更新最優解,這時候就需要返回,

不再進行盲目的搜尋。

剪枝:

剪枝就是指的是把不可能成為最優解的「枝幹」減去,雖說說起看起很高階的樣子

事實上大多數情況,只用乙個return語句和乙個if語句就可以完成這項工作

if( 不可能更新最優解 )return;

剪枝還有一些注意事項:

1.正確性

如果剪枝不正確的話雖然可能速度提公升了很多,但是會導致最終的答案出錯

2.必要性

有些地方去判斷剪枝實際上會浪費更多的時間開銷,即使這樣剪枝有時候也

可能並沒有對時間複雜度有顯著的降低。

但是遇到這種情況比較少,而且深度也比較低(最高為5),如果用vertor,也沒有

浪費過多的時間,這樣剪枝只是稍微提高了一下速度,但在每次去統計也會耗費較

多的時間

下面附上用動態規劃 + 深搜完成的「子矩陣」

code:

1 #include2 #include3 #include4

#define _min(a,b) (a5

#define _abs(a) (a<0)?(0-(a)):(a)

6using

namespace

std;

7 typedef bool

boolean;8//

file *fin =fopen("submatrix.in","r");9//

file *fout=fopen("submatrix.out","w");

10int map[18][18

];11

int n,m; //

行 列

12int r,c; //

行 列

13int *lines;

14int *rows;

15long

long minx = 10000000; //

最優解

16long

long getsubmatrix(int line,int newline)

21if(line>0)25

}26return

result;27}

28void getline(/*

int last,int ps,int sum*/)

34//

for(int i=last+1;i<=(m-c+ps+1);i++)

38int f[18][18

];39

int s[18][18

];40

for(int i=1;i<=m;i++)

41for(int j=1;j<=m;j++)

45 memset(f,0x7f,sizeof

(f));

46for(int i=1;i<=m;i++) f[1][i]=getsubmatrix(0

,i);

47for(int i=2;i<=c;i++)52}

53}54for(int i=1;i<=m;i++)

55 minx=_min(f[c][i],minx);56}

57void getrow(int last,int ps)

65for(int i=last+1;i<=(n-r+ps+1);i++)

69//

getrow(now+1,ps+1);

70//

getrow(now+1,ps);71}

72int

main()82}

83 getrow(0,0); //

開始搜尋

84//

fprintf(fout,"%ld",minx);

85 printf("

%ld"

,minx);

86return0;

87 }

廣度優先搜尋 深度優先搜尋

前言 這幾天複習圖論演算法,覺得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...