BFS(广度优先搜索)在无权无向图中不会失败,因为它可以找到从起始节点到任意其他节点的最短路径。下面是一个示例代码,展示了如何使用BFS来解决无权无向图的最短路径问题。
from collections import deque
def bfs(graph, start, end):
visited = set()
queue = deque([(start, [start])])
while queue:
node, path = queue.popleft()
if node == end:
return path
visited.add(node)
for neighbor in graph[node]:
if neighbor not in visited:
queue.append((neighbor, path + [neighbor]))
return None
# 无权无向图的邻接表表示
graph = {
'A': ['B', 'D'],
'B': ['A', 'C', 'E'],
'C': ['B', 'F'],
'D': ['A', 'E'],
'E': ['B', 'D', 'F'],
'F': ['C', 'E']
}
start_node = 'A'
end_node = 'F'
shortest_path = bfs(graph, start_node, end_node)
if shortest_path:
print(f"The shortest path from {start_node} to {end_node} is: ", shortest_path)
else:
print(f"There is no path from {start_node} to {end_node}.")
这个代码示例中,我们使用了一个队列来实现BFS。我们从起始节点开始,将其入队,并将其路径初始化为只包含起始节点。然后,我们不断从队列中取出节点,并遍历其未访问的邻居节点。如果某个邻居节点等于目标节点,我们就找到了最短路径,返回路径。如果没有找到目标节点,我们将邻居节点入队,并将路径更新为包含该邻居节点。如果队列为空,表示无法到达目标节点,返回None。
运行此代码,将输出以下结果:
The shortest path from A to F is: ['A', 'D', 'E', 'F']