美文网首页
❤算法解析---图的广度优先搜索(BFS)和深度优先搜索(DFS

❤算法解析---图的广度优先搜索(BFS)和深度优先搜索(DFS

作者: Cathy__珺珺 | 来源:发表于2020-01-02 15:07 被阅读0次

图的广度优先搜索(BFS)和深度优先搜索(DFS)算法解析

https://blog.csdn.net/weixin_40953222/article/details/80544928

广度优先遍历:

从图中某个顶点v0出发,并访问此顶点。

从v0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点。

重复步骤2,直到全部顶点都被访问为止。

深度优先遍历:

在一个图中选择一个起始点v0,然后遍历其子节点。

再以子节点为起始点,遍历子节点的子节点。

就这样一直递归下去,重复2

然后一直遍历到没有子节点,开始回溯。

1、广度优先搜索(BFS)算法

基本思路

广度优先搜索类似于树的层次遍历过程。它需要借助一个队列来实现。如图1所示,要想遍历从v0到v6的每一个顶点,我们可以设v0为第一层,v1、v2、v3为第二层,v4、v5为第三层,v6为第四层,再逐个遍历每一层的每个顶点。

图1 无向图

具体过程如下:

1、准备工作:创建一个visited数组,用来记录已被访问过的顶点;创建一个队列,用来存放每一层的顶点;初始化图G。

2、从图中的v0开始访问,将的visited[v0]数组的值设置为true,同时将v0入队。

3、只要队列不空,则重复如下操作

(1)队头顶点v0出队

(2)依次检查v0的所有邻接顶点w,若visited[w]的值为false,则访问w,并将visited[w]置为true,同时将w入队。

算法的实现过程

白色表示未被访问,灰色表示即将访问,黑色表示已访问。

visited数组:0表示未访问,1表示以访问。队列:队头出元素,队尾进元素。

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

2、即将访问顶点v0

图2

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

图3

4、将v0出队,访问v0的邻接点v2。判断visited[2],因为visited[2]的值为0,访问v2。

图4

5.将visited[2]置为1,并将v2入队。

图5

6.访问v0邻接点v1。判断visited[1],因为visited[1]的值为0,访问v1。

图6

7.将visited[1]置为1,并将v1入队。

图7

8.判断visited[3],因为它的值为0,访问v3。将visited[3]置为1,并将v3入队。

图8

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

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

继续访问v2邻接点v4,判断visited[4],因为其值为0,访问v4。

10.将visited[4]置为1,并将v4入队。

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

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

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

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

……

18.队列为空,退出循环,全部顶点均访问完毕

图9

2、深度优先搜索(DFS)算法

基本思路

深度优先搜索类似于树的先序遍历,具体过程如下:

准备工作:创建一个visited数组,用于记录所有被访问过的顶点。

1、从图中v0出发,访问v0。

2、找出v0的第一个未被访问的邻接点,访问该顶点。以该顶点为新顶点,重复此步骤,直至刚访问过的顶点没有未被访问的邻接点为止。

3、返回前一个访问过的仍有未被访问邻接点的顶点,继续访问该顶点的下一个未被访问领接点。

4、重复2,3步骤,直至所有顶点均被访问,搜索结束。

算法的实现过程

1.初始时所有顶点均未被访问,visited数组为空

2.即将访问v0

3.访问v0,并将visited[0]的值置为1

图10

4.访问v0的邻接点v2,判断visited[2],因其值为0,访问v2

图11

5.将visited[2]置为1

图12

6.访问v2的邻接点v0,判断visited[0],其值为1,不访问。

继续访问v2的邻接点v4,判断visited[4],其值为0,访问v4

图13

7.将visited[4]置为1

8.访问v4的邻接点v1,判断visited[1],其值为0,访问v1

图14

9.将visited[1]置为1

10.访问v1的邻接点v0,判断visited[0],其值为1,不访问。

继续访问v1的邻接点v4,判断visited[4],其值为1,不访问。

继续访问v1的邻接点v5,判读visited[5],其值为0,访问v5。

图15

……

14.访问v3的邻接点v0,判断visited[0],其值为1,不访问。

继续访问v3的邻接点v5,判断visited[5],其值为1,不访问。

v3所有邻接点均已被访问,回溯到其上一个顶点v5,遍历v5所有邻接点。

访问v5的邻接点v6,判断visited[6],其值为0,访问v6,置为1

图16

16.访问v6的邻接点v4,判断visited[4],其值为1,不访问。

访问v6的邻接点v5,判断visited[5],其值为1,不访问。

v6所有邻接点均已被访问,回溯到其上一个顶点v5,遍历v5剩余邻接点。

图17

17.v5所有邻接点均已被访问,回溯到其上一个顶点v1。

v1所有邻接点均已被访问,回溯到其上一个顶点v4,遍历v4剩余邻接点v6。

v4所有邻接点均已被访问,回溯到其上一个顶点v2。

v2所有邻接点均已被访问,回溯到其上一个顶点v1,遍历v1剩余邻接点v3。

v1所有邻接点均已被访问,搜索结束。

图18

相关文章

  • ❤算法解析---图的广度优先搜索(BFS)和深度优先搜索(DFS

    图的广度优先搜索(BFS)和深度优先搜索(DFS)算法解析 https://blog.csdn.net/weixi...

  • BFS

    [TOC] BFS 和 DFS BFS广度有限搜索和DFS深度优先搜索算法是特别常用的两种算法 DFS 算法就是回...

  • 算法与数据结构 之 搜索算法

    搜索分为广度优先搜索、深度优先搜索、A*算法。 一、广度优先算法(BFS) 1.1、基本实现和特性:BFS是从一个...

  • 图的深度优先遍历和广度优先遍历

    图的遍历主要有深度优先搜索 DFS(depth-first search) 和广度优先搜索BFS( breadth...

  • BFS和DFS

    BFS:广度优先搜索 DFS:深度优先搜索 树的遍历 BFS:A B C D E F G H I DFS: A ...

  • DFS与BFS LeetCode 刷题小结(一)

    本节我们将汇总一些 LeetCode bfs与dfs相关的题。 关于深度优先搜索(DFS)和广度优先搜索(BFS)...

  • 普通搜索之DFS

    深度优先搜索(DFS)和广度优先搜索(BFS)是搜索问题中比较常见的方法。此篇介绍DFS算法思想。现有n个点,m条...

  • DFS(栈)&BFS(队列)

    前言 对树(tree)或者图(graph)而言,深度优先搜索(DFS) 和广度优先搜索(BFS)都是用于遍历或者搜...

  • 图的相关算法

    深度优先搜索非递归形式 DFS 深度优先搜索非递归形式 广度优先搜索 BFS 判断无向图是否是树 判断有向图中两...

  • 2. 图的遍历算法

    图的遍历算法包括: 1. 深度优先搜索. 2. 广度优先搜索 1. 深度优先搜索 DFS (Depth Firs...

网友评论

      本文标题:❤算法解析---图的广度优先搜索(BFS)和深度优先搜索(DFS

      本文链接:https://www.haomeiwen.com/subject/qpcooctx.html