搜索?

这个部分的知识点已经学过去很长时间了(???),可是因为没有通过统一标准的学习,总感受本身并非彻底地掌握这一些东西,因此打算回顾一下,也是为了NOIP里的分值(骗分)作准备qwq,毕竟考完就退役了qwq算法

本文基于此文qwq   https://www.jianshu.com/p/1fc63ab1bcc2框架

基本思想

先选择某一种可能的状况向前探索,在探索过程当中,一旦发现原来的选择是错误的,就退回一步从新选择,继续向前探索,如此反复进行,直到获得解或证实问题无解。学习

普通的搜索

有两种框架:优化

int search(int x)
{
    for(int i=1;i<=...;i++)
    {
        if(知足条件)
        {
            保存结果;
            if(到目的地)
            输出解答;
            else
            search(x + 1);
            回溯:恢复以前的状态; 
        }
    }
}

int search(int x)
{
    if(到目的地)
    输出;
    else
    for(int i=1;i<=...;i++)
    {
        if(知足条件)
        {
            保存结果;
            search(x + 1);
            回溯:恢复以前的状态; 
        }
    } 
}

这就象征了一个不断修正前进的过程spa

BFS

bfs就相似于一层一层地向下搜索,开始下一层搜索的充要条件是本层必定所有搜索过一遍code

而后就不断地向上传递本身下面的信息,从而达到每个点都遍历过的过程orm

框架:blog

 

q.push(Start);//1,将起点推入队列中;
vis[Start] = true;//2,将起点标识为已走过;
while(q.empty())//(队列非空)
{
  int vt = q.top();//3,取队列首节点vt,并从队列中弹出;
  for(int i=head[vt];i;i=edge[i],next)//4,探索上面取出得节点的周围是否有没走过的节点vf
  {
      if(...)
      Node[vt].parent = Node[vf].parent 
  }//若是有将全部能走的vf的parents(information)指向vt,并将vf加入队列
    if(vf == Finish) return vf;//(若是vf等于终点,说明探索完成,退出循环)。
}
return -1;//若是队列为空天然跳出,说明无路可达终点

 

 

DFS

通常来讲DFS都是最经常使用的一种,在遍历树的时候通常都会优先选择DFS(不少以BFS为基础的算法也有关于DFS的优化,并且每每很优)队列

DFS就是在一个节点搜索完全(不能再向下)以后再去回溯到上一个状态再进行完全地搜索,最终找到最优答案get

框架:

 

1,栈初始化
2,得到起点,将起点标识为已走过,将起点入栈
while(栈非空){
  取栈顶元素vt
  若是vt周围有为走过的节点vf,则:
      将vf改成已走
      vf入栈
  没有能走的节点,vt出栈
}