图的广度、深度优先搜索和拓扑排序

广度优先搜索

广度优先搜索是最简单的图搜索算法之一。之所以得名是因为该算法始终将已经发现的结点集合,沿着其广度方向向外扩展去寻找未发现结点。
具体算法执行过程如下图所示:

  1. 图1-1是初始的图,S为源点,从S出发广度优先搜索所有节点


    图1-1
  2. 源S出发广度向外扩展距离为1的结点


    图1-2
  3. 结点V1出发广度搜索,找到V4


    图1-3
  4. 结点V3出发广度搜索,找到V5和V6。至此广度优先搜索找到了所有节点。


    图1-4
  5. 广度优先搜索每个结点被搜索到的顺序具有不确定,与图的表示方式(邻接矩阵和邻接链表)中每个节点顺序或者读取顺序有关。

深度优先搜索

深度优先搜索,只有可能就在图中尽可能的深入,总是从最近才发现的结点出发,寻找下一个结点。
具体算法执行过程如下图所示:

  1. 源S出发进行深度优先搜索


    图2-1
  2. S出发首先搜索到结点V1,然后从V1出发


    图2-2
  3. V1出发继续深入,搜索到V4


    图2-3
  4. V4出发深入搜索到V6


    图2-4
  5. V6出发找到V3


    图2-4
  6. V3到V5


    图2-5
  7. 最后找到V2


    图2-6
  8. 同样的,深度优先搜索结点被搜索到的顺序也是不确定。图示中只是给出了一种可能的情况。但是无论结果中结点的顺序如何,都要遵循着从最近发现的结点出发深入搜索的原则。

拓扑排序

拓扑排序是计算机中经常遇到的概念,下面用于《算法导论》的定义

拓扑排序是图G中所有结点的一种线性次序,该次序满足如下条件:如果图G包含边(u,v),则结点u在拓扑排序中处于结点v的前面(如果图G包含环路,则不可能排出一个线性次序)。
------摘自《算法导论》第三版

如下图3-1所示,事件E1完成之后,可以同时执行事件E2和E3,两事件执行结束之后,执行事件E4,最后可以同时执行事件E5和E6。每个事件的执行都依赖于它之前事件是否执行完成,执行的顺序是固定的,这样的线性顺序就是拓扑排序

图3-1

总结

图的广度、深度优先搜索和拓扑排序是图论算法中的基础,也是实践中经常遇到的问题。在考研和面试笔试中会通过选择题或者填空题考察,学习理解上文图示中的算法思想,辅助练习问题不大。当然也有关于这里的算法题,例如LeetCode815公交路线问题,就是利用图的广度优先搜索求解,因为解题复杂,并且在平时的应试中出现概率不大,这里不做详细讲解。有兴趣的可以在LeetCode中搜索,题目后面有我提交过的题解。


LeetCode815公交路线问题,我提交的题解

你可能感兴趣的:(图的广度、深度优先搜索和拓扑排序)