python 广度优先算法
from queue import Queue
def bfs(graph, start, end):
visited = set() # 记录已经访问过的节点
q = Queue() # 初始化一个队列
q.put([start]) # 将起点加入队列中
while not q.empty():
path = q.get() # 取出队列中的第一个路径
node = path[-1] # 获取这条路径的最后一个节点
if node == end: # 如果这个节点是终点,则返回这个路径
return path
elif node not in visited: # 如果这个节点还没有被访问过,则将它加入visited集合中,并将扩展出来的新路径加入队列中
for neighbor in graph[node]:
new_path = list(path)
new_path.append(neighbor)
q.put(new_path)
visited.add(node) # 将这个节点加入visited集合中,标记为已经访问过了
return None # 如果找不到路径,则返回None
# 测试用例
graph = {
'A': ['B', 'C'],
'B': ['D', 'E'],
'C': ['F'],
'D': [],
'E': ['F'],
'F': []
}
start = 'A'
end = 'F'
print(bfs(graph, start, end)) # 输出:['A', 'C', 'F']
给出实例
'''2023/3/31 22:00:30
下面是一个简单的例子,使用广度优先搜索查找一个无向图中的最短路径。
假设有一张无向图,节点编号从0到5,每条边都有相应的权重,如下所示:'''
4
0--------1
| \ / |
| 2 | 3
| / \ |
3--------2
5
from queue import Queue
def bfs_shortest_path(graph, start, end):
"""
广度优先搜索算法求解最短路径
:param graph: 图,用邻接表表示
:param start: 起始节点
:param end: 结束节点
:return: 最短路径
"""
# 初始化距离和前驱节点
dist = [-1] * len(graph)
prev = [-1] * len(graph)
# 将起始节点加入队列并初始化距离
q = Queue()
q.put(start)
dist[start] = 0
# 开始广度优先搜索
while not q.empty():
node = q.get()
for neighbor in graph[node]:
if dist[neighbor] == -1:
q.put(neighbor)
dist[neighbor] = dist[node] + 1
prev[neighbor] = node
# 回溯找到最短路径
path = []
curr = end
while curr != -1:
path.append(curr)
curr = prev[curr]
path.reverse()
return path
# 测试用例
graph = {
0: [1, 3],
1: [0, 2],
2: [1, 3, 4],
3: [0, 2],
4: [2, 5],
5: [4]
}
start = 0
end = 5
print(bfs_shortest_path(graph, start, end)) # 输出:[0, 3, 2, 4, 5]
'''在这个例子中,我们使用了Python内置的 set() 和 list() 函数,以及 queue 模块中的 Queue() 类和 put()、get() 方法。通过回溯前驱节点找到最短路径,并将其返回。'''