图的构造(基于邻接矩阵存储)和BFS遍历代码
时间: 2024-03-24 14:39:17 浏览: 54
图的邻接矩阵存储及遍历.doc.doc
好的,这里给出使用 Python 实现图的构造和广度优先搜索遍历的代码。
## 图的构造
我们可以使用一个二维数组来表示邻接矩阵。例如,下面这个邻接矩阵表示了一个有 5 个节点的无向图:
```
0 1 1 0 1
1 0 1 1 0
1 1 0 0 1
0 1 0 0 1
1 0 1 1 0
```
其中,第 i 行第 j 列的元素表示了节点 i 和节点 j 之间是否有边相连。例如,第 1 行第 2 列的元素为 1,表示节点 1 和节点 2 之间有一条边相连。
使用 Python 代码来表示这个邻接矩阵:
```python
matrix = [
[0, 1, 1, 0, 1],
[1, 0, 1, 1, 0],
[1, 1, 0, 0, 1],
[0, 1, 0, 0, 1],
[1, 0, 1, 1, 0],
]
```
其中,matrix[i][j] 表示节点 i 和节点 j 之间是否有边相连。
## 广度优先搜索
广度优先搜索是一种迭代的遍历方法。具体来说,我们从起点开始,依次遍历与它相连的所有节点,然后再依次遍历与这些节点相连的所有未访问过的节点,一直重复下去,直到找到终点或者所有节点都被遍历过为止。
下面是使用广度优先搜索遍历上面那张图的 Python 代码:
```python
from collections import deque
def bfs(matrix, start):
n = len(matrix)
visited = [False] * n # 记录每个节点是否被访问过
queue = deque() # 用于记录待访问的节点
queue.append(start) # 将起点加入队列
visited[start] = True # 标记起点为已访问
while queue:
node = queue.popleft() # 取出队首节点
print(node, end=' ') # 输出当前节点
for i in range(n):
if matrix[node][i] == 1 and not visited[i]:
visited[i] = True # 标记相邻节点为已访问
queue.append(i) # 将相邻节点加入队列
# 示例
matrix = [
[0, 1, 1, 0, 1],
[1, 0, 1, 1, 0],
[1, 1, 0, 0, 1],
[0, 1, 0, 0, 1],
[1, 0, 1, 1, 0],
]
bfs(matrix, 0) # 从节点 0 开始遍历
```
输出为:
```
0 1 2 4 3
```
在上面的代码中,我们使用了 Python 内置的 deque 类来实现队列。visited 数组用于记录每个节点是否被访问过。我们从起点开始,依次遍历与它相连的所有节点,将这些节点加入队列中。然后从队列中取出队首节点,依次遍历与它相连的所有未访问过的节点,将这些节点加入队列中。重复上述过程,直到队列为空为止。
希望上述代码能对你有所帮助!
阅读全文