📜  用于图的广度优先搜索或 BFS 的Python程序(1)

📅  最后修改于: 2023-12-03 15:40:53.521000             🧑  作者: Mango

用于图的广度优先搜索或 BFS 的Python程序

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。