目录
所在位置
- 搜索与图论
- 搜索
- DFS与BFS
- 图论
- 树与图的遍历
- 拓扑排序
- *最短路问题
- 二分图
- 搜索
导学
在我们遇到的一些问题当中,有些问题我们不能够确切的找出数学模型,即找不出一种直接求解的方法,解决这一类问题,我们一般采用搜索的方法解决。
搜索就是用问题的所有可能去试探,按照一定的顺序、规则,不断去试探,直到找到问题的解。
我们先介绍深度优先搜索DFS(Depth First Search)与广度优先搜索BFS(Breadth First Search),
DFS
1.1 DFS与递归
深度优先搜索:对每一个可能的分支路径搜索到不能再深入为止,再回退,走其他分支,而且每个节点只能访问一次。
这个回退的操作也被称为“回溯”。
基于这一个特性,我们可以联想到<栈>与<递归>,因为在函数的递归过程中,函数调用会自动产生栈帧,在递归完后总能回到开始递归的地方,等同于实现了回溯的效果。因此递归也就经常被我们用来解决DFS问题。
因此有的地方将DFS题也称为递归题,可以说前者是一种思想,后者是一种实现方式。
1. 2 一般格式
我们可以通过下面的模板实现DFS的基本思路。
DFS(顶点v)
{
标记v为已遍历;
for(对于每一个邻接v且未标记遍历的点u)
DFS(u);
}
BFS
2.1 BFS与队列
广度优先搜索:从起始点开始按序遍历其邻接的节点,由此向外不断扩散,且每个节点只能访问一次。
我们最先找到的符合要求的结点,同时满足为最小的合法路径。
基于上述特性,我们可以通过<队列>先进先出的特点,来保证其层级遍历时的顺序。
2.2 一般格式
我们可以通过下面的模板实现BFS的基本思路。
BFS(){ 输入起始点;
初始化所有顶点标记为未遍历;
初始化一个队列queue并将起始点放入队列;
while(queue不为空)
{
从队列中删除一个顶点s并标记为已遍历;
将s邻接的所有还没遍历的点加入队列;
}
}