zoukankan      html  css  js  c++  java
  • 搜索专题

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

  • 相关阅读:
    Hadoop2.8.2 运行wordcount
    RHEL7.2 安装Hadoop-2.8.2
    RHEL7.2 SSH无密码登录非root用户
    python day 1 homework 2
    python day 1 homework 1
    python三种格式化输出
    windwos 10 安装flask
    ubunit 16 安装pip
    Axure 8 Tab制作
    JavaScript平台Platypi悄然登场
  • 原文地址:https://www.cnblogs.com/shuibeng/p/13603173.html
Copyright © 2011-2022 走看看