图的广度优先遍历

对于一个无权图G=(V,E),我们采用邻接表表示:

0:1、2、5、6
1:0
2:0
3:4、5
4:3、5、6
5:0、3、4
6:0、4

对于这个图,如何广度遍历呢?

我们使用队列queue这个数据结构。

首先,确定一个起点s(源),接下来对这个点进行操作:push进队列;同时被访问过visited[s] = true

queue:1

然后,将 1 这个点pop出来,同时对 1 的邻接点i遍历,判断没有没访问,将 i 点push进queue,这些邻接点i都设置为被访问过,visited[i] = true

queue:0

重复第二步,将pop(0),foreach(0的邻接点集),判断没有被访问过的点,push,visited[..] = true

queue:2 5 6

直至queue中元素个数为0。

至此完成了对图G的广度遍历。


值得注意的地方:

1、广度遍历也是层序遍历,如果将图拉扯为一棵数的话,那么始终是按照一层一层的顺序遍历,也因此可以找到最短路径

2、对于每个节点何时置其为被访问过

    如果在pop出队列后,算被访问过,那么队列就会出现重复元素,但是不会影响最终结果,queue先后出现:102563444

    如果在push进队列后,算被访问过,那么队列不会出现重复元素,queue先后出现:1025634



基于邻接表存储广度优先搜索遍历和树的层序遍历原理相同,采用队列来实现BFS,同时会用到辅助数Visited数,其余根据BFS的基本原理实现即可,实现过程较为简单[^2]。 给定一个无向G,用邻接表作为存储结构进行广度优先遍历,需输出G的广度优先遍历序列,并在遍历过程中计算G的连通分量个数。在遍历过程中,若同时出现多个待访问的顶点,则优先选择编号最小的一个进行访问[^3]。 以邻接表为例,广度优先遍历的计算方法是对于一个节点,访问它的所有邻接节点,并按某种顺序(例如按照节点编号、字母顺序等)递归地进行遍历。一旦遍历完成后,返回到上一个节点,继续遍历其他邻接节点[^4]。 需要注意的是,对于稀疏来说,虽然邻接表广度优先遍历比较复杂,但相比邻接矩阵,邻接矩阵在广度优先遍历时因较多位置为空却仍需检查是否为空,相对更吃亏,所以还是会采用邻接矩阵的广度优先遍历[^1]。 以下为简单的Python代码示例,用于演示基于邻接表广度优先遍历: ```python from collections import deque def bfs(graph, start): visited = set() queue = deque([start]) visited.add(start) result = [] while queue: vertex = queue.popleft() result.append(vertex) for neighbor in sorted(graph[vertex]): if neighbor not in visited: queue.append(neighbor) visited.add(neighbor) return result # 示例邻接表表示 graph = { 0: [1, 2], 1: [0, 3], 2: [0, 3], 3: [1, 2] } start_vertex = 0 bfs_result = bfs(graph, start_vertex) print("广度优先遍历结果:", bfs_result) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值