BFS与DFS

目录

所在位置

  • 搜索与图论
    • 搜索
      • 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邻接的所有还没遍历的点加入队列;
  }
}
原文地址:https://www.cnblogs.com/Hokkaido-JL/p/13952666.html