本章节内容使用 java 实现,Github 代码仓:https://github.com/ZhekaiLi/Code/tree/main/Graph/src

查看文章内的图片可能需要科学上网! 因为使用了github管理图片,因此如果出现无法加载的情况请翻墙

【参考资料】imooc 波波老师:玩转算法系列–图论精讲 面试升职必备(Java版)

【往期博客链接】
图论算法(1、2):图的分类、图的基本概念(无向图与有向图、无权图、无环图、完全图、二分图;简单图、连通分量、图的生成树、子图与母图)
图论算法(3):图的基本表示(邻接矩阵、邻接表、邻接矩阵与邻接表的对比)
图论算法(4):图的深度优先遍历 DFS
图论算法(5):图的广度优先遍历 BFS
图论算法(6):LeetCode 图论算法练习(785.判断二分图、695.岛屿的最大面积、Floodfill 算法、并查集)

5. 图的广度优先遍历 BFS

先来看树的广度优先遍历,下图展示了利用队列来进行树的BFS的大致过程

bfs(root); // 从根结点开始遍历bfs(TreeNode node)queue.add(node);while(!queue.isEmpty)v = queue.remove();list.add(v);for(w: v.son())queue.add(w)

图的广度优先遍历在代码逻辑上与树的BFS相同,只是需要在 queue.add(w) 前添加一个结点 w 是否已经被访问的判断。时间复杂度同样为 O(V+E)O(V+E)O(V+E)

java 实现:GraphBFS.java

绝大部分DFS可以解决的问题同样可以由BFS解决

5.1 Ex: 求两点间路径

同理 Section 4.2

pre[0...V-1] = -1;
s = 0; // 自定义的起始点
t = 5; // 自定义的终止点bfs(s); // 从根结点开始遍历bfs(int v)queue.add(v);pre[v] = v;while(!queue.isEmpty)v = queue.pop();list.add(v);for(w: v.son())queue.add(w);pre[w] = v;

java 实现:SingleSourcePathBFS.java

5.2 性质:无权图最短路径

同样是从 0→60\to60→6,BFS的路径短于DFS,该性质同样适用于任意点,即BFS能够找到任意点与根节点间的最短路径

这是因为BFS是层序遍历,从根节点开始从近至远依次遍历,每次遍历寻找的都是最近的结点(可以理解为一种贪心算法,当边不含权重时,贪心 = 最优)

如果在遍历的过程中直接记录距离信息 dis[],则可以直接读出根节点至任意结点的最短距离

java 实现:USSSPath.java

5.3 比较:DFS vs. BFS

比较 BFS 与 DFS(非递归),我们发现唯一的不同在于 DFS 使用栈而 BFS 使用队列(处理结点时 DFS 头进头出,BFS 尾进头出)(statck.add(s)对应stack.push()statck.remove()对应stack.pop()

更进一步的,我们还可以用任意的结构来代替上图中的 stack/ queue 从而实现一种自定义的遍历方式。

例如可以使用一个随机容器(随机队列),通过对边的随机性访问来生成一个随机迷宫

更大更好看的例子:

图论算法(5):图的广度优先遍历 BFS相关推荐

  1. 获取图顶点的入度、出度;获取图的两个顶点之间的权值; 图的深度优先算法、图的广度优先遍历

    广度优先结果: 深度优先结果: 代码整理: public class Graph {private int vertexSize;//顶点数量private int[] vertexs;//顶点数组p ...

  2. 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)

    目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...

  3. java数据结构和算法——图的广度优先(BFS)遍历

    目录 一.图的遍历介绍 二.图的广度优先搜索(Broad First Search) 三.图的广度优先遍历算法步骤 四.图的广度优先遍历示例需求 五.图的广度优先遍历代码示例 一.图的遍历介绍 所谓图 ...

  4. 数据结构与算法:终于可以用三种语言(C,C#,JavaScript)把图的广度优先遍历讲清楚了(推荐收藏)

    文章目录 邻接矩阵存储图的广度优先遍历过程分析 C语言实现队列编程 程序中加入图的处理函数 结果的再次分析 C#语言实现图的广度优先遍历.并显示广度优先遍历生成树 JavaScript语言实现图的广度 ...

  5. 算法笔记 揭开广度优先遍历BFS的神秘面纱 HERODING的算法之路

    揭开广度优先遍历BFS的神秘面纱 前言 1. 审题 1.1 树的BFS 1.2 图的BFS 2. 解法 2.1 树的BFS 2.2 图的BFS 3. 总结 前言 最近到了面试的高峰时期,前段时间也刷了 ...

  6. 算法简介:层层递进----广度优先搜索(BFS)

    算法简介:层层递进----广度优先搜索(BFS) 算法简介 算法简介 BFS算法思想: 首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻的未被访问过的 ...

  7. [C] 图的广度优先遍历

    图的广度优先遍历 我一直觉得图的遍历没有地图类型的题目难,遍历嘛,每个点都走一遍就行了. 但是给定地图求面积啊,数量啊的那种题目,花样挺多的. 图的遍历真挺难把人绕晕的,关于广度优先,理解好层层递进这 ...

  8. 邻接表存储图的广度优先遍历

    试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ); 其中LGraph是邻接表存储 ...

  9. 二十三、图的广度优先遍历

    二十三.图的广度优先遍历 文章目录 二十三.图的广度优先遍历 题目描述 解题思路 上机代码 题目描述 程序的输入是无向图的顶点序列和边序列(顶点序列以*为结束标志,边序列以-1,-1为结束标志).程序 ...

最新文章

  1. java 关键字final static
  2. esp8266 lcd 天气_8266WIFI加LCD显示时间及天气pm25
  3. NYOJ 598 旋转圆柱矩阵
  4. 【收藏】从 0 到 1 学习 elasticsearch ,这一篇就够了!
  5. 常用的汇编系统功能指令(包含字符功能类,中断终止类)
  6. ubuntu开启SSH服务和允许root远程SSH登录
  7. master节点部署pod_小伙!Kubernetes 部署如此简单,你看完全明白了
  8. linux sz到指定的机器,linux 机器之间 zssh, rz, sz互相传输讲解
  9. mongodb count 导致不正确的数量(mongodb count 一个坑)
  10. 图解python CGI(通用网关接口 )
  11. 计算机常用算法对照表整理
  12. python游戏小抄
  13. rgb sw 线主板接口在哪_配置升级性能再突破,华硕TUF GAMING B460M-PRO 重炮手主板爆款来袭...
  14. 适用于window平台的java虚拟机_雪豹系统安装说明
  15. 批量插入图片到Excel中批注中,Excel插件 E灵
  16. Python爬虫实战:爬取拉勾网并对其进行数据分析
  17. 红色警戒2修改器原理百科(五)
  18. android模拟器连接不到本地服务器
  19. 乐鑫ESP32-C3开发(一)简述和目录
  20. 蛋白和肽测序仪销量、收入、价格、毛利率及市场份额

热门文章

  1. C#预处理器指令之#define/#undefine/#if/#elif/#else/#endif
  2. 告别PQMagic Win7硬盘维护工具ADDS
  3. 启动APP黑屏白屏的原因及解决办法
  4. c++(多态)一个游戏中有多种怪物(Monster),怪物之间可能要发生战斗(fight),每场战斗都是一个怪物与另一怪物之间的一对一战斗。
  5. Linux oracle 如何安装,Linux 安装Oracle详细步骤
  6. .NET中的状态机库Stateless
  7. 计算机网络安全教程 石国志,秦文陡 10515140263 网络安全课程设计.doc
  8. 什么是DI(依赖注入)
  9. 京东用户购买意向预测(一)
  10. 有五个字母A(a), E(e), I(i), O(o),U(u)称为元音,其他所有字母称为辅音,请编写程序判断输入的字母是元音(Vowel)还是辅音(Consonant)。