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

结语

智者一切求自己

愚者一切求他人

!!!

相关推荐
mmz1207几秒前
分治算法(c++)
c++·算法
睡一觉就好了。20 分钟前
快速排序——霍尔排序,前后指针排序,非递归排序
数据结构·算法·排序算法
Tansmjs1 小时前
C++编译期数据结构
开发语言·c++·算法
金枪不摆鳍1 小时前
算法-字典树
开发语言·算法
diediedei1 小时前
C++类型推导(auto/decltype)
开发语言·c++·算法
独断万古他化1 小时前
【算法通关】前缀和:从一维到二维、从和到积,核心思路与解题模板
算法·前缀和
loui robot1 小时前
规划与控制之局部路径规划算法local_planner
人工智能·算法·自动驾驶
格林威1 小时前
Baumer相机金属焊缝缺陷识别:提升焊接质量检测可靠性的 7 个关键技术,附 OpenCV+Halcon 实战代码!
人工智能·数码相机·opencv·算法·计算机视觉·视觉检测·堡盟相机
你撅嘴真丑2 小时前
第八章 - 贪心法
开发语言·c++·算法
VT.馒头2 小时前
【力扣】2625. 扁平化嵌套数组
前端·javascript·算法·leetcode·职场和发展·typescript