数据结构-图的广度优先遍历

一、图的广度优先遍历(BFS)与树的优先遍历之间的联系

树:从根节点出发,找到与根结点相连的所有结点,再逐层找到所有结点。

相似:从某个结点出发,找到与该结点相邻的所有结点,再继续重复操作。

1.代码实现:

要点:1.找到与一个顶点相邻的所有顶点。 2.标记哪些顶点被访问过 3.需要一个辅助队列

访问标记数组,将其全部设置为false,首先,(广度优先遍历整个图)visit访问二号结点,并且将二号结点对应的数组设置为true,表示已经背访问过。再将二号结点入队,利用循环,如果队列不空,让队头结点出队,目前也就是二号结点。再用二层循环,遍历找到与二号结点相邻的所有节点,再判断其数组值是否为false,为false,则未访问,接下来访问这个顶点,再对数组进行访问标记为true,再将其入队(队尾)。再进行下一次循环。。。

2、遍历序列的可变性。

邻接矩阵从左至右,顺序为递增。 若为邻接表,则根据后面的链表顺序相同。

二、算法实现

当出现非连通时,则无法遍历完所有结点。我们对算法进行改进:

增加一个函数(图中上面的),将数组全部设置为false,再进行初始化一个辅助队列,接下来利用循环扫描数组,找到数组当中第一个值为false的顶点,从这个顶点出发,再利用上面的方法进行依次访问顶点。这个新定义的循环还会进行循环,再次找到另一个值为false的顶点,从这个顶点再次依次访问,直到这个数组值全部为ture。

结论:对于无向图,调用BFS函数的次数=连通分量数。

三、复杂度分析

空间复杂度: 最坏情况,辅助队列大小为 O(|v|)

时间复杂度:(访问各个顶点与边) 邻接矩阵---O(|V|^2) 邻接表---O(|V|+|E|)

四、广度优先生成树

从某个顶点开始,会有一个访问顶点的顺序,把第一次访问新结点的路径留下来,删除多余的路径,这个图就变成了树。(因为邻接表的特效,基于邻接表的广度优先生成树也不唯一)(使用邻接矩阵则唯一)

广度优先生成森林--适用于非连通图

总结:

相关推荐
Elsa️7468 分钟前
算法一周刷题总结
c++·算法
小小程序猴127 分钟前
深圳乘路资讯AI培训怎么样?课程靠谱吗?——一套课程可信度评估模型与实证分析
人工智能·算法
云上先途30 分钟前
标签化服务适合哪些人?常见适用场景一次讲清
大数据·人工智能·算法·音视频
彧azz1 小时前
DFS与BFS:图遍历的两大核心算法
数据结构·学习·算法·深度优先·广度优先
宣宣猪的小花园.1 小时前
【机器学习】损失函数与梯度下降:机器如何通过“犯错”不断变好
人工智能·算法·机器学习
青山木2 小时前
Hot 100 --- 最长递增子序列
java·数据结构·算法·leetcode·动态规划
土司大王2 小时前
LeetCode hot100——33.搜索旋转排序数组:Java 二分模板与 O(log n) 实现
数据结构·算法·leetcode
不穿鞋的懒羊羊2 小时前
STL容器
算法
huang5791473 小时前
多线程环境下的共享数据结构安全问题分析4
算法
地平线开发者3 小时前
模型部署|征程6 量化路线怎么选:PTQ 还是 QAT?
神经网络·算法·机器学习