图的实验——图的主要遍历算法实现_图的遍历——BFS 与 DFS 深度优先和广度优先搜索 | 图论算法

点击这里看上一部分图的基本概念与存图的两种方式邻接矩阵,邻接表

如果觉得有帮助的话,可以转发点赞支持一下哦!

图的遍历

问题引入

0204167e0dfdfabc147bca95082145d8.png

有一天,你穿越到Clannad(炒鸡好看的游戏与番剧)的小镇。你知道小镇上的每个地方与每条路。小镇的某些地方可能会藏有实现愿望的光玉。现在你要出发去收集小镇上所有的光玉

如图:

e15b1ebca6ef0f5626b968e7de0e9b3e.png

假设小镇中一个地方对应这张图的一个结点,你的出生点在古河面包店(0号位置),据题意,你需要一个地点都不落地走完整张图,这样才能收集完所有光玉

BFS

广度优先搜索(Breadth First Search):

属于一层一层地扩展,每次到一个点后,把这个点其他相邻点都记录下来作为下一层的待访问结点

根据这个概念,我们需要准备:

  • 一个小本本
84cdef96bcbe386253d0057d1272c7e9.png

步骤:

  1. 每到达一个点(最开始是起点),观望一下周围哪些地点跟当前点相连,这些点都添加在小本本上
  2. 跳到小本本上记录的第一个地点(执行 1 步骤),然后把这个地点从小本本上擦除
  3. 重复执行 2直到小本本上没有记录任何点(此时已经到达了所有地点,后面有实例将证明)

根据上面的步骤,可以给出伪代码

伪代码:把起点添加到小本本上;while (小本本上 有 地点) {     跳到小本本上最上面的地点,假设为P点。     把P点从小本本上擦除。          for ( 遍历所有  与P点相邻  的Q点 ) {                 if (  Q点不在小本本上  ) {                  把 Q点 添加到小本本的最后面。             }    }}

可以看出:小本本具有先进先出的性质,就是一个队列

da7050013c372591eae47f3d25edae1c.png

过程:

b21097ae4e70aa5905f92b277ee21606.png
  1. 0点 记在小本本上
  2. 从小本本中取出 0点(到达 0点 ), 观望一下,把1点、2点、7点记录在小本本上
  • 这时小本本上 记录了1点、2点、7点。(1点在前)
  1. 从小本本中取出 1点,观望一下,把 4点、5点记录在小本本上
  • 这时小本本上 记录了2点、7点、4点、5点
  1. 从小本本中取出 2点,观望一下,把 4点 已经在小本本上了,不用记录
  • 这时小本本上 记录了7点、4点、5点
  1. 从小本本中取出 7点,观望一下,没有可以记录的点
  • 这时小本本上 记录了4点、5点
  1. 从小本本中取出 4点,观望一下,把 3点 记录在小本本上
  • 这时小本本上 记录了5点、3点
  1. 从小本本中取出 5点,观望一下,把 6点 记录在小本本上
  • 这时小本本上 记录了3点、6点
  1. 从小本本中取出 3点,观望一下,没有可以记录的点
  • 这时小本本上 记录了6点
  1. 从小本本中取出 6点,观望一下,没有可以记录的点
  2. 小本本已经没有记录任何点了,同时所有地点都走完啦

DFS

深度优先搜索(Depth First Search):

先选择一条路一直往前走,走到尽头后,就返回到上一个交叉路口选择另一条没走过的路。

一直重复,这样就能走完所有的地点。

(像不像老鼠走迷宫,一条路一条路地尝试)

3898d3bfb42f8979633c223a454d93b9.png

根据这个寻路的过程,我们要知道:

  • 每个结点能去到哪些其他结点
  • 怎样返回到上一个交叉路口

关于返回到上一个路口,我们很容易想到递归

递归的过程走到每一个相邻的结点

递归的边界走到尽头(即没有能走的结点 或者 每一个相邻结点都走完了)

下面是伪代码:

到达( P点 ){     for( 从P点出发能去的相邻的点Q ){             if( 没有来过Q点  ){          记录Q点到过了。          到达( Q点 )         }    }    返回P点前的一步}

解析:

递归函数: 到达(某点)

递归函数结束:当for循环(遍历所有能去的结点)结束

一条路已经走完了返回到上一个交叉路口

过程:

fe0095cb89dd7790b7ada937e9e90ee0.png

据说 下面的过程跟上面的图更配哦

1.从起点出发,进入递归函数——>到达0点

  • (到达0点)有1点 2点 7点相邻。从编号最小的开始。进入 ——到达1点
  • (到达0点 (到达1点)) 有 4点 5点相邻。 进入——到达4点
  • (到达0点 (到达1点 (到达4点))有2点 3点 相邻。进入——到达2点
  • (到达0点 (到达1点 (到达4点 (到达2点)))这时0点访问过,这条路到尽头了,返回上一个路口——到达4点

此时走完了 0——1——4——2 这条路

565d12ff60317a108d1a601b8ad3d85d.png
  • (到达0点 (到达1点 (到达4点))有2点 3点 相邻。2点访问过,进入——到达3点
  • (到达0点 (到达1点 (到达4点 (到达3点))这条路到尽头了,返回上一个路口——到达4点

此时走完了 0——1——4——3 这条路

540ef08da4a285b164eaabf588b76f0d.png
  • (到达0点 (到达1点 (到达4点))这条路到尽头了,返回上一个路口——到达1点

此时走完了 0——1——4 这条路

  • (到达0点 (到达1点)) 有 4点 5点相邻。4点访问过了。 进入——到达5点
  • (到达0点 (到达1点 (到达5点))有6点相邻。进入——到达6点
  • (到达0点 (到达1点 (到达5点 (到达6点))这条路到尽头了,返回上一个路口——到达5点

此时走完了0——1——5——6

b727a869880d46590b91316685f03206.png
  • (到达0点 (到达1点 (到达5点))这条路到尽头了,返回上一个路口——到达1点

走完了0——1——5

  • (到达0点 (到达1点))这条路到尽头了,返回上一个路口——到达0点

走完了0——1

  • (到达0点)有1点 2点 7点相邻。1点2点都访问过了,进入——到达7点
  • (到达0点 (到达7点))这条路到尽头了,返回上一个路口——到达0点

走完了0——7

c2468c6c45fdfe2fe8f204cd9a4ecdeb.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值