广度优先搜索算法(Breadth-First Search, BFS)
算法思路
广度优先搜索(BFS)是一种用于图和树的遍历算法。该算法从一个给定的节点(起始节点)开始,探索所有该节点的邻居节点。然后对每个邻居节点,它再进一步探索它们的未访问的邻居节点,并将它们添加到一个队列中。这一过程会持续进行,直到队列为空,或者找到目标节点。BFS逐层地进行搜索,首先检查距离起始节点最近的所有节点,然后逐渐向外扩展到更远的节点。该算法在许多问题中都非常有效,包括最短路径搜索、网络爬虫、社交网络分析等。
算法程序框图
- 初始化一个空队列 Q 和一个已访问节点集合 visited。
- 将起始节点 start 添加到 Q 和 visited 中。
- 当 Q 不为空:
- 出队一个节点 n。
- 检查 n 是否是目标节点:
- 如果是,算法结束。
- 遍历 n 的所有未访问邻居 m:
- 将 m 添加到 Q 和 visited。
- 结束算法。
主要函数代码
下面是使用Python实现的BFS算法代码:
from collections import deque
def bfs(graph, start, target):
visited = set()
queue = deque([start])
visited.add(start)
print(f"初始化: 队列 = {list(queue)}, 已访问 = {list(visited)}")
while queue:
current_node = queue.popleft()
print(f"出队: 当前节点 = {current_node}, 队列 = {list(queue)}")
if current_node == target:
print(f"找到目标节点: {target}")
return True
for neighbor in graph[current_node]:
if neighbor not in visited:
queue.append(neighbor)
visited.add(neighbor)
print(f"入队: 邻居节点 = {neighbor}, 队列 = {list(queue)}")
print("目标节点未找到")
return False
# 示例图(邻接表表示)
graph = {
'A': ['B', 'C'],
'B': ['D', 'E'],
'C': ['F'],
'D': [],
'E': ['F'],
'F': []
}
# 使用 BFS 查找从 A 到 F 的路径
bfs(graph, 'A', 'F')