news 2026/5/1 10:02:32

图的遍历算法:广度优先搜索

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
图的遍历算法:广度优先搜索

图的广度优先搜索(BFS)详解

广度优先搜索(Breadth-First Search,BFS)是与DFS互补的图遍历算法,核心思想是**“先广后深”**:从起始节点出发,先访问当前节点的所有邻接节点(一层),再依次访问这些邻接节点的邻接节点(下一层),如同“水波扩散”,逐层遍历所有可达节点。

资料:https://pan.quark.cn/s/43d906ddfa1bhttps://pan.quark.cn/s/90ad8fba8347https://pan.quark.cn/s/d9d72152d3cf

一、核心概念
  1. 节点状态:同样需标记「未访问」「已访问」,避免重复遍历。
  2. 核心数据结构:队列(FIFO),保证“先进先出”,实现逐层访问。
  3. 适用场景:最短路径(无权图)、层序遍历、连通分量、判断两点是否可达等。
二、图的存储方式

与DFS一致,优先使用邻接表(稀疏图效率更高),下文均以邻接表为例实现。

三、基础BFS实现(迭代)
1. 算法步骤
  • 初始化队列,将起始节点入队,并标记为已访问。
  • 循环:若队列非空,出队队首节点,处理该节点(如输出)。
  • 遍历该节点的所有邻接节点:若未访问,则标记为已访问并入队。
  • 重复直到队列为空。

注:BFS极少用递归实现(递归本质是栈,与BFS的队列逻辑冲突),因此仅讲迭代版。

2. 代码实现(Python)
fromcollectionsimportdequedefbfs(graph,start):""" 广度优先搜索(无权图) :param graph: 邻接表表示的图(字典/列表) :param start: 起始节点 :return: 遍历顺序列表 """visited=set()# 记录已访问节点queue=deque([start])# 初始化队列,存入起始节点visited.add(start)# 标记起始节点为已访问result=[]whilequeue:# 出队队首节点node=queue.popleft()result.append(node)# 处理节点(加入结果)# 遍历所有邻接节点forneighboringraph[node]:ifneighbornotinvisited:visited.add(neighbor)# 标记为已访问(避免重复入队)queue.append(neighbor)# 入队returnresult# 示例:无向图(邻接表)if__name__=="__main__":# 图结构:0-1-3/4,0-2graph={0:[1,2],1:[0,3,4],2:[0],3:[1],4:[1]}print("BFS遍历结果:")print(bfs(graph,0))
3. 输出结果
BFS遍历结果: [0, 1, 2, 3, 4]

解释:从0出发,先访问第一层(0),再访问第二层(1、2),最后访问第三层(3、4),符合“逐层扩散”的特性。

四、处理非连通图

若图包含多个连通分量(无向图),需遍历所有节点,对未访问的节点启动BFS:

fromcollectionsimportdequedefbfs_connected_components(graph):""" BFS遍历非连通图,返回所有连通分量 :param graph: 邻接表表示的图 :return: 各连通分量的遍历结果列表 """visited=set()components=[]fornodeingraph:ifnodenotinvisited:# 对每个未访问节点启动BFSqueue=deque([node])visited.add(node)component=[node]whilequeue:curr_node=queue.popleft()forneighboringraph[curr_node]:ifneighbornotinvisited:visited.add(neighbor)queue.append(neighbor)component.append(neighbor)components.append(component)returncomponents# 示例:非连通图if__name__=="__main__":# 两个连通分量:0-1-2 和 3-4graph={0:[1],1:[0,2],2:[1],3:[4],4:[3]}print("\n非连通图的连通分量(BFS):")print(bfs_connected_components(graph))
输出结果
非连通图的连通分量(BFS): [[0, 1, 2], [3, 4]]
五、BFS经典应用:无权图最短路径

BFS的核心优势是能高效求解无权图中两点的最短路径(层数即为最短路径长度),只需在遍历中记录每个节点的前驱/距离:

fromcollectionsimportdequedefbfs_shortest_path(graph,start,end):""" 求解无权图中start到end的最短路径 :param graph: 邻接表 :param start: 起始节点 :param end: 目标节点 :return: 最短路径列表(无路径返回None) """ifstart==end:return[start]visited=set([start])queue=deque([(start,[start])])# 队列存储(当前节点, 路径)whilequeue:node,path=queue.popleft()forneighboringraph[node]:ifneighbor==end:returnpath+[neighbor]# 找到终点,返回完整路径ifneighbornotinvisited:visited.add(neighbor)queue.append((neighbor,path+[neighbor]))returnNone# 无可达路径# 示例调用if__name__=="__main__":graph={0:[1,2],1:[0,3,4],2:[0],3:[1],4:[1]}print("\n0到4的最短路径:")print(bfs_shortest_path(graph,0,4))# 输出 [0, 1, 4]
六、BFS特性与复杂度
  1. 时间复杂度
    • 邻接表:O(V + E)(V为节点数,E为边数),每个节点和边仅处理一次。
    • 邻接矩阵:O(V²),需遍历每个节点的所有可能邻接节点。
  2. 空间复杂度:O(V)(队列存储节点,最坏情况存入所有节点,如完全图)。
  3. 核心特点
    • 保证无权图的最短路径(层数即为最短路径长度)。
    • 按层遍历,适合“扩散式”场景(如社交网络好友推荐)。
    • 迭代实现更自然,无递归栈溢出风险。
七、BFS vs DFS(核心区别)
特性广度优先搜索(BFS)深度优先搜索(DFS)
核心数据结构队列(FIFO)栈(递归/手动栈)
遍历顺序逐层遍历(横向)深度优先(纵向)
最短路径可求无权图最短路径无法保证最短路径
空间复杂度最坏O(V)(队列)最坏O(V)(递归栈)
适用场景最短路径、层序遍历路径查找、环检测、拓扑排序
八、常见应用场景
  1. 无权图最短路径(如迷宫最短出口、社交网络最短好友链)。
  2. 层序遍历(如二叉树层序遍历、图的分层处理)。
  3. 检测图的连通性(无向图连通分量、有向图可达性)。
  4. 洪水填充(如图片区域填充、扫雷游戏周边检测)。
  5. 拓扑排序(配合入度表,适用于DAG)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:12:28

颠覆传统:这款开源图像查看器如何让你的图片浏览体验焕然一新

还在为系统自带的图片查看器功能单一而苦恼吗?今天我要向大家推荐一款真正优秀的开源图像查看器,它不仅完全免费,还拥有闪电般的启动速度和出色的格式兼容性。这款免费图片浏览器将彻底改变你的图像浏览方式! 【免费下载链接】Ima…

作者头像 李华
网站建设 2026/5/1 8:39:22

ChromeDriver下载地址汇总及自动化测试中的语音反馈集成

ChromeDriver与IndexTTS 2.0:构建“听得见”的智能自动化测试系统 在持续集成(CI)流水线日益复杂的今天,一个看似微小的UI测试失败,可能意味着线上服务正面临用户无法登录的风险。传统的做法是等待邮件通知、翻看日志…

作者头像 李华
网站建设 2026/4/27 23:30:26

Onekey Steam清单下载器:5分钟快速上手终极指南

Onekey Steam清单下载器:5分钟快速上手终极指南 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey Onekey是一款专为Steam游戏玩家设计的开源免费工具,能够直接从Steam官方服…

作者头像 李华
网站建设 2026/4/29 4:07:12

Legacy iOS Kit终极教程:旧设备降级与越狱完整指南

Legacy iOS Kit终极教程:旧设备降级与越狱完整指南 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit Legacy iO…

作者头像 李华
网站建设 2026/5/1 7:17:01

《虚妄的筋骨与泡沫的狂欢》

虚妄的筋骨与泡沫的狂欢 近来文坛风气,颇有些“以虚为实”的玄谈。仿佛不将真假是非搅作一锅浑水,便显不出自家的高深。有句箴言近来常被引作圭臬:“有些虚假,但它是真实的;有些虚假,但它依然是更加虚假的。…

作者头像 李华
网站建设 2026/5/1 6:14:10

Diablo Edit 2终极指南:5分钟掌握暗黑破坏神II角色编辑器完整教程

还在为暗黑破坏神II角色存档损坏而烦恼?Diablo Edit 2作为暗黑破坏神II社区中最强大的开源角色编辑器,提供了安全可靠的存档修改解决方案。这款免费工具支持从经典1.09到最新重制版的所有存档格式,通过三层数据验证机制确保修改后的文件完全符…

作者头像 李华