python 实现最短路径广度优先搜索算法
最短路径广度优先搜索(Breadth-First Search, BFS)算法通常不直接用于寻找加权图中的最短路径,因为它在搜索过程中不会考虑边的权重。然而,在无权图中(即所有边的权重都相等),BFS可以用来找到从一个源顶点到所有其他顶点的最短路径。创建一个队列Q用于存储待处理的顶点。创建一个集合visited用于记录已经访问过的顶点,防止重复访问。创建一个距离数组dist,用于记录从源顶点到各个
最短路径广度优先搜索算法介绍
最短路径广度优先搜索(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 deque
def bfs(graph, start):
visited = set()
queue = deque([start])
distances = {vertex: float('infinity') for vertex in graph}
distances[start] = 0
while 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] + 1
return 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 deque
def bfs_shortest_path(graph, start, end):
# 创建一个队列来保存要探索的节点
queue = deque()
# 将起点加入队列中
queue.append(start)
# 创建一个字典来保存节点的前驱节点
predecessors = {}
# 将起点的前驱节点设为None
predecessors[start] = None
while 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*算法来计算最短路径。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)