• 搜索专题


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

  • 相关阅读:
    接口测试1: 常见接口协议介绍
    ERC223 GAS费窃取问题
    HTTP相关知识体系架构
    TCP/IP四层架构对应OSI七层架构图
    老项目移植ILRuntime经验总结
    奇怪的 C 风格继承写法
    P4207 [NOI2005] 月下柠檬树
    P3822 [NOI2017] 整数
    P4604 [WC2017]挑战
    三维凸包
  • 原文地址:https://www.cnblogs.com/shuibeng/p/13603173.html
Copyright © 2020-2023  润新知