[数据结构] 图的 深度优先搜索,广度优先搜索

  

  深度优先搜索

  顾名思义。我们以下面的图为例:

图-示例图

  深度优先搜索的策略:

  随便选择一个顶点,比如 0 ,从 0 开始,随便选择一个与 0 邻接的顶点 1 ,继续寻找和 1 邻接的顶点, 3 ,继续选择与 3 邻接的顶点 4 。4 没有其他邻接的顶点了,于是我们返回 3 ,3 还有另外一个 邻接的顶点 2 。2 本来就没有邻接顶点(考虑弧的方向),于是我们继续返回 3 。此时 3 也没有未被标记的邻接顶点了,我们返回 1 ,同理,返回到 0 。这是运气比较好的状态,从这个顶点开始,深度优先搜索,就遍历了整个图。

  那么,如果从2开始,2是没有邻接顶点的(考虑到弧的方向),于是2会被直接标记为 已遍历。但此时图没有被遍历,我们需要寻找另一个没被标记的顶点,再一次开始深度优先搜索,直到整个图都被遍历。

  至此,示例图的深度优先搜索就结束了。

  总结性的说法:(对于任意一个顶点v,如果他没有邻接顶点,或者它的所有邻接顶点都已经被遍历,那么把v也标记为 已遍历。)

  我们任意选择一个顶点v作为出发点,然后选择一个与v邻接的顶点u。如果u已经处于 已遍历 状态,那么我们回到顶点v,选择另一个与v邻接的顶点w。如果w未被遍历,我们以w为出发点,继续选择与w邻接的顶点,重复第一步开始的操作。如果出发点本身已经处于 已遍历状态,而图中还有其他未遍历的顶点,我们需要从中选择一个未遍历的顶点作为起点再次开始深度优先搜索。

 

  广度优先搜索

  依然顾名思义,依然以上图中的图为例。

  广度优先搜索的策略:

  随便选择一个顶点,比如 0 , 从 0 开始 ,0 的 所有邻接顶点为 { 1,2 },2 的临界点合集为空,观察 1 。1的邻接点合集为 { 3 } ,观察 3 ,3 的邻接点合集为 { 4 } ( 2已经被遍历过了所以不需要考虑 )。此时没有未被遍历的点了,广度优先搜索结束。

  如果选择顶点 2 ,从 2 开始, 2 的邻接点合集为空。那么继续选择另一个未被遍历的邻接点,比如 0 ,再次开始广度优先搜索,直到遍历整个图

 

posted @ 2018-02-08 09:47  Oran  阅读(425)  评论(0编辑  收藏  举报