图的遍历---广度优先搜索(BFS)

本文介绍了图的遍历方法之一——广度优先搜索BFS,它与树的按层遍历类似,从某顶点出发,优先访问先被访问顶点的邻接点,遵循步长为1、2、3...的顺序。BFS适用于寻找最优解,如最少步长问题。相比之下,深度优先搜索DFS适合目标明确但不追求最优的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇我们讲解了图遍历的深度优先搜索DFS,今天讲另外一个图的遍历方法,即广度优先搜索BFS, 广度优先搜索又叫宽度优先搜索,和树的按层遍历的方法是一样的,在便遍历时图和树的区别上一篇文章已经有所讲过不再复述。

广度优先搜索BFS:假设从图中某个顶点V出发, 在访问了V之后一次访问V的各个未曾访问过的邻接点,然后分别从这些邻接点出发,一次访问他们的邻接点;在遍历这些邻接点的时候必须遵从这样的规则:使得先被访问的顶点的邻接点必须先于后被访问的顶点的邻接点。就是说谁先来的谁的子孙就优先于后来的人的子孙进行访问遍历,在树中就是左子树的所有儿子比子树的儿子先被遍历。继续,重复上述过程直到没有可以被访问的顶点。若图为连通图此时所有顶点都已经被遍历过,但是当图为非联通图时,此时还有空余的顶点没有遍历,所有还需要查看是否有剩余未被标记的顶点,然后依次做为起点进行上述过程,直到图中全部顶点都被标记过为止。说白了BFS就是每次都选取相同最短步长的邻接点进行遍历,步长为1, 2, 3, 4...... 


按照BFS的搜索遍历,上述图的遍历顺序为  V1 V2 V3 V4 V5 V6 V

### 广度优先搜索遍历算法解释 广度优先搜索(Breadth First Search, BFS)是一种用于遍历搜索中节点的算法。该方法按照层次顺序访问所有节点,即先访问起始节点,再依次访问其相邻的所有未被访问过的邻居节点,然后再访问这些邻居的邻居,以此类推直到所有的可达节点都被访问完毕[^1]。 对于每一个新发现的节点,将其标记为已访问并加入队列;当处理到某个节点,则从队列移除之。通过这种方式可以确保每个节点仅会被处理一次,并且能够找到最短路径上的边数最少的一条路经到达目标节点[^2]。 #### Python 实现代码如下: ```python from collections import deque def bfs(graph, start): visited = set() # 记录已经访问过的顶点集合 queue = deque([start]) # 初始化队列为起点 while queue: vertex = queue.popleft() if vertex not in visited: print(f'Visiting {vertex}') visited.add(vertex) # 将当前顶点连接但尚未访问过的新邻接点入队 for neighbor in graph[vertex]: if neighbor not in visited: queue.append(neighbor) # 定义无向的数据结构表示法 graph_example = { 'A': ['B', 'C'], 'B': ['A', 'D', 'E'], 'C': ['A', 'F'], 'D': ['B'], 'E': ['B', 'F'], 'F': ['C', 'E'] } bfs(graph_example, 'A') ``` 此段程序定义了一个简单的函数`bfs()`来执行广度优先搜索操作。给定一个由字典形式描述的和一个起始顶点作为输入参数,在控制台打印出按层序访问各个顶点的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值