宽度优先搜索算法(BFS)是一种对图进行搜索的算法。宽度优先遍历是,假设开始于某个顶点(起点),从起点开始遍历与起点相邻的点,相邻点遍历结束后继续遍历上轮第一个遍历节点的相邻的未遍历的点,直到所有的点都遍历一遍后结束。
假设某个无向图的起点为a,其相邻点有b,c,d,则遍历完a点后遍历b,c,d点。b,c,d遍历完后,开始遍历b点未遍历过的邻接点e,f。e,f遍历完后,开始遍历c点未遍历过的邻接点,直到起点的相邻点的相邻点全部遍历一遍后,开始遍历e的邻接点.....直到所有的点都被遍历过一次。
python代码思路:
创建一个集合用来保存遍历过的点,创建一个双端队列用来取出点和加入刚遍历后的邻接点,第一个点为起点。
#导入Python的collections模块中的deque类,用于创建一个双端队列
from collections import deque
# 用字典定义一个图的邻接列表表示
graph = {
'A': ['B', 'C'],
'B': ['A', 'D', 'E'],
'C': ['A', 'F'],
'D': ['B'],
'E': ['B', 'F'],
'F': ['C', 'E']
}
def bfs(graph, start):
visited = set() # 创建一个集合,用来存储已经访问过的节点
queue = deque() # 创建一个双端队列,用来进行BFS的队列
visited.add(start) #向visited添加初始节点
queue.append(start) #向双端队列添加初始节点
while queue: #队列不为空则一直循环
node = queue.popleft() #从队列左侧弹出一个节点,并返回节点,表示当前处理的节点
print(node, end=' ') #打印当前处理的节点
# 遍历该节点的所有相邻节点
for neighbor in graph[node]: #遍历当前节点的所有邻接点
if neighbor not in visited: #如果邻接点没有被访问过
visited.add(neighbor) #将邻接点加入集合
queue.append(neighbor) #将邻接点加入队列的末尾
# 从节点'A'开始进行BFS
bfs(graph, 'A')