最短路径广度优先搜索算法介绍
最短路径广度优先搜索(Breadth-First Search, BFS)算法通常不直接用于寻找加权图中的最短路径,因为它在搜索过程中不会考虑边的权重。然而,在无权图中(即所有边的权重都相等),BFS可以用来找到从一个源顶点到所有其他顶点的最短路径。
在无权图中使用BFS寻找最短路径的基本步骤如下:
1、初始化:
创建一个队列Q用于存储待处理的顶点。
创建一个集合visited用于记录已经访问过的顶点,防止重复访问。
创建一个距离数组dist,用于记录从源顶点到各个顶点的最短路径长度(在无权图中,这个长度实际上是跳数或步数)。初始时,除了源顶点外,所有顶点的距离都设为无穷大或某个大数,源顶点的距离设为0。
2、开始搜索:
将源顶点加入队列Q,并将其标记为已访问。
在Q不为空的情况下循环执行以下步骤:
从Q中取出一个顶点u。
遍历顶点u的所有邻接顶点v:
如果顶点v尚未被访问,则将其加入队列Q,标记为已访问,并更新其距离dist[v]为dist[u] + 1(因为是无权图,所以增加1表示多经过了一步)。
3、结果:
搜索完成后,dist数组将包含从源顶点到图中所有可达顶点的最短路径长度(跳数或步数)。
注意:
如果图是有向的,BFS仍然适用,但需要注意方向。
如果图包含权重不同的边,则应使用如Dijkstra算法或Bellman-Ford算法等更适用于加权图的算法来寻找最短路径。
示例代码(Python):
from collections import dequedef bfs(graph, start):visited = set()queue = deque([start])distances = {vertex: float('infinity') for vertex in graph}distances[start] = 0while queue:vertex = queue.popleft()if vertex not in visited:visited.add(vertex)for neighbour in graph[vertex]:if neighbour not in visited:queue.append(neighbour)distances[neighbour] = distances[vertex] + 1return distances# 示例图的表示(邻接表)
graph = {'A': ['B', 'C'],'B': ['A', 'D', 'E'],'C': ['A', 'F'],'D': ['B'],'E': ['B', 'F'],'F': ['C', 'E']
}# 寻找从顶点'A'开始的最短路径
distances = bfs(graph, 'A')
print(distances)
在这个例子中,graph是一个字典,表示一个无权图的邻接表。bfs函数计算从start顶点开始到图中所有其他顶点的最短路径长度(跳数)。
最短路径广度优先搜索算法python实现样例
下面是用Python实现的最短路径广度优先搜索算法的代码示例:
from collections import dequedef bfs_shortest_path(graph, start, end):# 创建一个队列来保存要探索的节点queue = deque()# 将起点加入队列中queue.append(start)# 创建一个字典来保存节点的前驱节点predecessors = {}# 将起点的前驱节点设为Nonepredecessors[start] = Nonewhile queue:node = queue.popleft()# 如果找到终点,则构建最短路径并返回if node == end:path = []while node is not None:path.append(node)node = predecessors[node]path.reverse()return path# 遍历当前节点的所有邻居节点for neighbor in graph[node]:if neighbor not in predecessors:queue.append(neighbor)predecessors[neighbor] = node# 如果没有找到最短路径,则返回空列表return []
使用示例:
graph = {'A': ['B', 'C'],'B': ['A', 'D'],'C': ['A', 'E'],'D': ['B', 'E', 'F'],'E': ['C', 'D', 'G'],'F': ['D'],'G': ['E']
}start = 'A'
end = 'G'shortest_path = bfs_shortest_path(graph, start, end)
print(f"The shortest path from {start} to {end} is: {shortest_path}")
输出结果:
The shortest path from A to G is: ['A', 'C', 'E', 'G']
注意:这个算法只能处理无权图,对于带权图,需要使用Dijkstra算法或A*算法来计算最短路径。