这个部分的知识点已经学过去很长时间了(???),可是因为没有通过统一标准的学习,总感受本身并非彻底地掌握这一些东西,因此打算回顾一下,也是为了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就相似于一层一层地向下搜索,开始下一层搜索的充要条件是本层必定所有搜索过一遍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(不少以BFS为基础的算法也有关于DFS的优化,并且每每很优)队列
DFS就是在一个节点搜索完全(不能再向下)以后再去回溯到上一个状态再进行完全地搜索,最终找到最优答案get
框架:
1,栈初始化 2,得到起点,将起点标识为已走过,将起点入栈 while(栈非空){ 取栈顶元素vt 若是vt周围有为走过的节点vf,则: 将vf改成已走 vf入栈 没有能走的节点,vt出栈 }