蓝桥强化宝典(3)BFS

一、定义

广度优先搜索(Breadth-First Search, BFS)是另一种用于遍历或搜索树或图的算法。与深度优先搜索(DFS)沿着树的深度遍历不同,广度优先搜索会逐层遍历图的顶点。它从一个指定的源顶点开始,首先访问这个顶点的所有直接邻接点,然后对这些邻接点进行同样的操作,即访问它们的未被访问的邻接点,以此类推,直到访问完图中所有可达的顶点。

二、基本思想

  1. 访问源顶点:从指定的源顶点开始访问。
  2. 访问邻接点:将源顶点的所有未被访问的邻接点加入到一个队列中。
  3. 逐层遍历:从队列中取出一个顶点,访问它,并将其所有未被访问的邻接点加入队列中。这个过程一直持续到队列为空,即所有可达的顶点都被访问过。

三、实现方式

  • 队列:使用队列来存储待访问的顶点。在BFS过程中,队列起到了关键作用,它确保了顶点按照它们被发现的顺序(即广度优先的顺序)被访问。

四、应用

  • 最短路径问题:在无权图中,BFS可以用来找到从源顶点到其他所有顶点的最短路径(路径长度为边的数量)。
  • 层次遍历:在树(可以视为图的特例)中,BFS可以实现层次遍历,即按从上到下、从左到右的顺序访问树的节点。
  • 网络爬虫:在网页搜索中,BFS可以用来实现广度优先的网页抓取策略。
  • 图的连通性:BFS可以用来检查图是否是连通的,或者找出图中的所有连通分量。

五、伪代码

plaintext复制代码

|---|--------------------|
| | BFS(s): |
| | 创建一个队列Q |
| | 将顶点s加入队列Q |
| | 标记s为已访问 |
| | |
| | 当Q非空时 |
| | 从Q中取出一个顶点v |
| | 对于v的每个未被访问的邻接点w |
| | 将w加入队列Q |
| | 标记w为已访问 |
| | |
| | 主函数: |
| | 对于图中的每个顶点u |
| | 如果u未被访问 |
| | BFS(u) |

注意:在上面的伪代码中,主函数中的循环实际上是不必要的,因为BFS本身就会遍历从源顶点可达的所有顶点。但是,如果你想要从多个源顶点开始搜索,或者想要确保图中的所有顶点都被访问(即使它们是孤立的),那么主函数中的循环就是必要的。然而,在大多数情况下,我们只需要从一个源顶点开始搜索,并允许BFS遍历所有可达的顶点。

六、注意事项

  • BFS需要额外的空间来存储队列中的顶点,这可能会增加算法的空间复杂度。
  • BFS的性能也依赖于图的结构和实现的细节。在某些情况下,对于稀疏图,使用邻接表来表示图可能会更高效;而对于密集图,使用邻接矩阵可能更合适。
  • BFS是稳定的,即它会按照顶点被发现的顺序来访问它们,这在某些应用中是非常重要的。

结语

智者一切求自己

愚者一切求他人

!!!

相关推荐
呆呆的小鳄鱼26 分钟前
leetcode:冗余连接 II[并查集检查环][节点入度]
算法·leetcode·职场和发展
墨染点香27 分钟前
LeetCode Hot100【6. Z 字形变换】
java·算法·leetcode
沧澜sincerely27 分钟前
排序【各种题型+对应LeetCode习题练习】
算法·leetcode·排序算法
CQ_071228 分钟前
自学力扣:最长连续序列
数据结构·算法·leetcode
弥彦_43 分钟前
cf1925B&C
数据结构·算法
YuTaoShao1 小时前
【LeetCode 热题 100】994. 腐烂的橘子——BFS
java·linux·算法·leetcode·宽度优先
Wendy14419 小时前
【线性回归(最小二乘法MSE)】——机器学习
算法·机器学习·线性回归
拾光拾趣录9 小时前
括号生成算法
前端·算法
渣呵10 小时前
求不重叠区间总和最大值
算法
拾光拾趣录10 小时前
链表合并:双指针与递归
前端·javascript·算法