蓝桥强化宝典(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是稳定的,即它会按照顶点被发现的顺序来访问它们,这在某些应用中是非常重要的。

结语

智者一切求自己

愚者一切求他人

!!!

相关推荐
夜思红尘1 天前
算法--双指针
python·算法·剪枝
散峰而望1 天前
【算法竞赛】C++函数详解:从定义、调用到高级用法
c语言·开发语言·数据结构·c++·算法·github
CoderCodingNo1 天前
【GESP】C++五级真题(贪心思想考点) luogu-B4071 [GESP202412 五级] 武器强化
开发语言·c++·算法
我有一些感想……1 天前
An abstract way to solve Luogu P1001
c++·算法·ai·洛谷·mlp
前端小L1 天前
双指针专题(三):去重的艺术——「三数之和」
javascript·算法·双指针与滑动窗口
智者知已应修善业1 天前
【求等差数列个数/无序获取最大最小次大次小】2024-3-8
c语言·c++·经验分享·笔记·算法
LYFlied1 天前
【每日算法】LeetCode 416. 分割等和子集(动态规划)
数据结构·算法·leetcode·职场和发展·动态规划
多米Domi0111 天前
0x3f 第19天 javase黑马81-87 ,三更1-23 hot100子串
python·算法·leetcode·散列表
历程里程碑1 天前
滑动窗口最大值:单调队列高效解法
数据结构·算法·leetcode
課代表1 天前
从初等数学到高等数学
算法·微积分·函数·极限·导数·积分·方程