BFS(广度优先搜索)最短路径引理是指在一个无权图中,从起点出发到达每个顶点的路径长度是最短的。下面是一个基于邻接表表示图的BFS最短路径的解决方法,包含代码示例:
from collections import deque
def bfs_shortest_path(graph, start, end):
# 创建一个队列用于存储待访问的顶点
queue = deque()
# 创建一个字典用于存储每个顶点的前驱节点,用于最后回溯路径
predecessors = {}
# 创建一个集合用于存储已经访问过的顶点
visited = set()
# 将起点加入队列,并将其前驱节点设置为None
queue.append(start)
predecessors[start] = None
while queue:
vertex = queue.popleft()
visited.add(vertex)
# 判断是否到达目标顶点
if vertex == end:
break
# 遍历当前顶点的所有邻接顶点
for neighbor in graph[vertex]:
# 如果邻接顶点未被访问过,则将其加入队列,并设置前驱节点
if neighbor not in visited:
queue.append(neighbor)
predecessors[neighbor] = vertex
# 回溯路径
path = []
current = end
while current is not None:
path.append(current)
current = predecessors[current]
# 将路径反转后返回
return list(reversed(path))
这个解决方法使用了一个队列来存储待访问的顶点,并通过一个字典来记录每个顶点的前驱节点。在BFS的过程中,首先将起点加入队列,并将其前驱节点设置为None。然后,从队列中依次取出顶点,将其标记为已访问,并遍历其邻接顶点。如果邻接顶点未被访问过,则将其加入队列,并设置其前驱节点为当前顶点。当到达目标顶点时,停止搜索。最后,通过回溯前驱节点的方式,从目标顶点一直回溯到起点,得到最短路径。
请注意,上述代码中的graph
参数是一个邻接表表示的图,其中每个顶点作为键,其对应的邻接顶点列表作为值。你可以根据具体的需求进行相应的修改和适配。