图的广度优先搜索(BFS)与图的深度优先搜索(DFS)详解及其代码实现

参考文章:https://blog.csdn.net/weixin_40953222/article/details/80544928

1.概述

与树的遍历类似,图的遍历也是从图中某个顶点出发,然后按照某种方法对图中所有顶点进行访问,且仅访问一次
但是图的遍历相对树而言要更为复杂,因为图中的任意顶点都可能与其他顶点相邻,所以在图的遍历中必须记录已被访问的顶点,避免重复访问
根据搜索路径的不同,可以将遍历图的方法分为两种:广度优先搜索(BFS)与深度优先搜索(DFS)

注意:图的广度优先遍历(搜索) 与 图的深度优先遍历(搜索) 不一定 会得到相同的顶点输出顺序

2.图的基本概念

2.1无向图与有向图

顶点对(u,v)是无序的,即(u,v)和(v,u)是同一条边,常用一对圆括号表示

                                         图2.1.1 无向图

顶点对<u,v>是有序的,它是指从顶点u到顶点 v的一条有向边,其中u是有向边的始点,v是有向边的终点,常用一对尖括号表示

                                  图2.1.2 有向图

2.2权与网

图的每条边上可能存在具有某种含义的数值,称该数值为该边上的权,而这种带权的图被称为网

3.广度优先搜索(BFS)

3.1广度优先搜索的基本思路

广度优先搜索类似于树的层次遍历过程,它需要借助一个队列来实现,如图2.1.1所示,要想遍历从v0到v6的每一个顶点,我们可以设v0为第一层,v1、v2、v3为第二层,v4、v5为第三层,v6为第四层,再逐个遍历每一层的每个顶点
具体过程如下:
1.创建一个visited数组,用来记录已经被访问过的顶点,创建一个队列,用来存放每一层的顶点,初始化图G
2.从图中的v0开始访问,将visited[v0]的值设置为true,表示该顶点已经被访问,同时将v0入队
3.只要队列不空,则重复如下操作:
(1)队头顶点u出队
(2)依次检查u的所有邻接顶点w,若visited[w]的值为false,则访问w,并将visited[w]置为true,同时将w入队
3.2图解过程

白色表示未被访问,黑色表示已访问
visited数组:0表示未访问,1表示以访问
队列:队头出元素,队尾进元素

1.初始时全部顶点均未被访问,visited数组初始化为0,队列中没有元素

2.访问顶点v0,并置visited[0]的值为1,同时将v0入队

3.将v0出队,访问v0的邻接点v2,判断visited[2],因为visited[2]的值为0,访问v2 ,将visited[2]置为1,并将v2入队

4.访问v0邻接点v1,判断visited[1],因为visited[1]的值为0,访问v1 ,将visited[1]置为0,并将v1入队

5.访问v0邻接点v3,判断visited[3],因为visited[3]的值为0,访问v3, 将visited[3]置为0,并将v3入队 

6.v0的全部邻接点均已被访问完毕,将队头元素v2出队,开始访问v2的所有邻接点

开始访问v2邻接点v0,判断visited[0],因为其值为1,不进行访问

继续访问v2邻接点v4,判断visited[4],因为其值为0,访问v4,将visited[4]置为1,并将v4入队

7. v2的全部邻接点均已被访问完毕,将队头元素v1出队,开始访问v1的所有邻接点

开始访问v1邻接点v0,因为visited[0]值为1,不进行访问

继续访问v1邻接点v4,因为visited[4]的值为1,不进行访问

继续访问v1邻接点v5,因为visited[5]值为0,访问v5,将visited[5

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值