深度優先搜尋(dfs)是利用遞迴完成的以搜尋深度優先的搜尋
通常大概是這樣的:
1void 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...