zoukankan      html  css  js  c++  java
  • 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邻接的所有还没遍历的点加入队列;
      }
    }
    
  • 相关阅读:
    Do I Have an RNG(Random Number Generator)?
    网页上判断屏幕分辨率
    〖005〗数据监控
    How to use Emerge
    〖006〗开发语言
    Build patched kernel
    GNAP 1.5.1
    五一长假日记(1)
    SQL Server各种日期计算方法
    HOWTO Design your own Framebuffer Splash
  • 原文地址:https://www.cnblogs.com/Hokkaido-JL/p/13952666.html
Copyright © 2011-2022 走看看