搜索专题
搜索问题解决的是在某一范围内得到最优解的问题,此处主要介绍DFS和BFS(深度优先搜索及广度优先搜索)
DFS和BFS究其本质是栈stack和队列queue的搜索策略
DFS比较适合最优解问题,可以通过剪枝等策略优化搜索过程
BFS比较适合集群数量问题,快速得出可选择方向的个数
DFS通用代码
int maxsumSque = 0;
vector<int> temp,ans;//存放最优解序列,模仿入栈出栈过程,如果不需要输出序列,可省去
//index为方向选择,nowK为已经入栈的个数,sum需要满足的条件,sumSqu序列的优劣记录
void DFS(int index,int nowK, int sum,int sumSqu){
if(nowK == k && sum == x){
if(sumSqu > maxsumSque){//更优
maxsumSque = sumSqu;
ans = temp;
}
return;
}
if(nowK > k||index==n||sum>x)
return;
//选方向index
temp.push_back(A[index]);//存放序列
DFS(index + 1, nowK + 1, sum + A[index], sumSque + B[index]);
temp.pop_back();
//退回找下一个方向
DFS(index+1,nowK,sum,sumSqu)
}
BFS通用代码
bool inq[N];//是否入队过
//BFS,用前需要用judge判断是否能入队
void BFS(typename s){
queue<node> Q;
Q.push(s);//入队
inq[s] = true;
while(Q.empty()==false){//队列未空
node top = Q.front();//队首元素出列
Q.pop();
for(int i = 0;i<index;i++){
//从index方向搜索
if(index方向能搜索就入列){
s = A[index];
Q.push(s);
inq[s] = true;
}
}
}
return;
}
BFS拓展:由于一般使用的队列是STL容器中的queue,只是一个元素副本入列,如果需要对该元素(尤其是结构体)进行更改,很容易造成内外数据不一致导致bug,可以用入队元素编号(如下标)而不是元素本身来解决