📅  最后修改于: 2023-12-03 15:40:53.521000             🧑  作者: Mango
BFS(Breadth First Search)又叫宽度优先搜索,是图论中的经典算法,它是从图的起点开始,先访问其所有邻接点,再依次访问每个邻接点的所有邻接点,直到所有节点都被访问为止。
在 Python 中,由于列表和队列的数据结构类似,我们可以使用 Python 中的列表和队列来实现广度优先搜索。
```python
from collections import deque
def bfs(graph, start):
visited = set() # 已访问的节点集合
queue = deque([start]) # 将起点加入队列
visited.add(start) # 将起点标记为已访问
while queue: # 队列不为空
vertex = queue.popleft() # 取出队列的第一个节点
print(vertex)
for neighbour in graph[vertex]: # 遍历该节点的所有邻接点
if neighbour not in visited: # 如果该邻接点未被访问
visited.add(neighbour) # 将该邻接点标记为已访问
queue.append(neighbour) # 将该邻接点加入队列
```
以上代码将图通过邻接表的方式存储,以字典表示,其中 key 为节点,value 为该节点的所有邻接点。
bfs 函数的参数 graph 表示图的邻接表,start 表示从哪个节点开始遍历。
visited 集合用于存储已经访问过的节点,一开始包含起点 start。
queue 队列用于存储需要遍历的节点,一开始只包含起点 start。
在 while 循环中,首先取出队列的第一个节点,然后遍历该节点的所有邻接点,如果有邻接点未被访问,将其添加到 visited 集合中,同时加入到队列中。
这样,不断取出队列的第一个节点,遍历该节点的所有邻接点,直到队列为空为止,这样就完成了广度优先搜索。
以下是一个示例,该图的邻接表如下:
graph = {
"A": ["B", "C"],
"B": ["A", "D", "E"],
"C": ["A", "F"],
"D": ["B"],
"E": ["B", "F"],
"F": ["C", "E"]
}
我们从节点 A 开始遍历,调用 bfs 函数:
>>> bfs(graph, "A")
A
B
C
D
E
F
遍历的顺序为 A -> B -> C -> D -> E -> F。