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

结语

智者一切求自己

愚者一切求他人

!!!

相关推荐
诸葛务农2 分钟前
光电对抗:多模复合制导烟雾干扰外场试验及仿真(4)
人工智能·算法·光电对抗
WolfGang00732110 分钟前
代码随想录算法训练营 Day39 | 动态规划 part12
算法·动态规划
阿Y加油吧23 分钟前
动态规划经典题解:最长递增子序列 & 乘积最大子数组
算法·动态规划·代理模式
f3iiish30 分钟前
3783. 整数的镜像距离 力扣
算法·leetcode
Not Dr.Wang42233 分钟前
基于matlab的控制系统奈氏图及其稳定性分析
数据结构·算法·matlab
闻缺陷则喜何志丹1 小时前
【排序 离散化 二维前缀和】 P7149 [USACO20DEC] Rectangular Pasture S|普及+
c++·算法·排序·离散化·二维前缀和
rainbow7242441 小时前
AI学习路线分享:通用型认证与算法认证学习体验对比
人工智能·学习·算法
君义_noip1 小时前
信息学奥赛一本通 4163:【GESP2512七级】城市规划 | 洛谷 P14921 [GESP202512 七级] 城市规划
c++·算法·图论·gesp·信息学奥赛
Simon_lca1 小时前
验厂不翻车!Acushnet 11 项核心政策 + 自查要点,一文搞定
大数据·人工智能·经验分享·算法·制造
智者知已应修善业1 小时前
【51单片机按键控制流水灯+数码管显示按键次数】2023-6-15
c++·经验分享·笔记·算法·51单片机