图的邻接矩阵进行深度和广度优先搜索遍历
时间: 2023-12-11 13:58:55 浏览: 103
深度优先搜索(DFS)和广度优先搜索(BFS)是图遍历中常用的两种算法,它们都可以通过邻接矩阵来实现。
假设我们有一个无向图,其中顶点用数字 0 到 n-1 来标识,邻接矩阵 adjacency_matrix[i][j] 表示顶点 i 和 j 是否有边相连,如果相连则为 1,否则为 0。
1. 深度优先搜索(DFS)
DFS 从起始顶点开始遍历,每次访问一个顶点后深入到该顶点的一个未访问过的邻居,直到不能再深入为止,然后回溯到前一个顶点,再深入到另一个未访问过的邻居,直到所有顶点都被访问过。
DFS 可以使用递归来实现:
```python
def dfs(adjacency_matrix, visited, vertex):
visited[vertex] = True
print(vertex, end=" ")
for i in range(len(adjacency_matrix)):
if adjacency_matrix[vertex][i] and not visited[i]:
dfs(adjacency_matrix, visited, i)
```
其中 visited 是一个布尔数组,表示每个顶点是否被访问过。我们从起始顶点开始遍历,每访问一个顶点就将 visited 中对应的值设为 True,并输出该顶点的编号。然后遍历该顶点的所有邻居,如果邻居未被访问过,则递归访问它。
调用该函数:
```python
n = 5
adjacency_matrix = [[0, 1, 1, 0, 0],
[1, 0, 1, 1, 0],
[1, 1, 0, 0, 1],
[0, 1, 0, 0, 1],
[0, 0, 1, 1, 0]]
visited = [False] * n
dfs(adjacency_matrix, visited, 0)
```
输出结果为:0 1 2 3 4,表示深度优先搜索遍历的顺序。
2. 广度优先搜索(BFS)
BFS 从起始顶点开始遍历,先访问与起始顶点相邻的所有顶点,再依次访问与这些顶点相邻的所有未访问过的顶点,直到所有顶点都被访问过。
BFS 可以使用队列来实现:
```python
from collections import deque
def bfs(adjacency_matrix, visited, vertex):
queue = deque([vertex])
visited[vertex] = True
while queue:
v = queue.popleft()
print(v, end=" ")
for i in range(len(adjacency_matrix)):
if adjacency_matrix[v][i] and not visited[i]:
queue.append(i)
visited[i] = True
```
我们使用 deque 来实现队列,将起始顶点入队,并将 visited 中对应的值设为 True。然后进入一个循环,在循环中取出队首元素 v,并输出其编号。接着遍历 v 的所有邻居,如果邻居未被访问过,则将其加入队列并将 visited 中对应的值设为 True。
调用该函数:
```python
n = 5
adjacency_matrix = [[0, 1, 1, 0, 0],
[1, 0, 1, 1, 0],
[1, 1, 0, 0, 1],
[0, 1, 0, 0, 1],
[0, 0, 1, 1, 0]]
visited = [False] * n
bfs(adjacency_matrix, visited, 0)
```
输出结果为:0 1 2 3 4,表示广度优先搜索遍历的顺序。
阅读全文