搜索专题

搜索问题解决的是在某一范围内得到最优解的问题,此处主要介绍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,可以用入队元素编号(如下标)而不是元素本身来解决

原文地址:https://www.cnblogs.com/shuibeng/p/13603173.html