请编程实现图的深度优先遍历和广度优先遍历算法,并给出流程
时间: 2024-04-30 13:19:44 浏览: 92
深度优先遍历(DFS)和广度优先遍历(BFS)是两种常用的图遍历算法。下面是它们的具体实现方式和流程。
假设我们有一个用邻接表表示的图,其中顶点编号从0到n-1,其中n为顶点数。邻接表用一个数组adj来表示,其中adj[i]表示与顶点i相邻的所有顶点。例如,如果adj[3]={1,2,4},则表示顶点3与顶点1、2、4相邻。
## 深度优先遍历(DFS)
深度优先遍历使用栈来实现,其基本流程如下:
1. 将起始顶点压入栈中,标记已访问。
2. 当栈非空时,弹出栈顶元素v。
3. 遍历v的所有相邻顶点,如果该顶点未被访问过,则将其压入栈中并标记已访问。
4. 重复步骤2和3,直到栈为空。
以下是深度优先遍历的Python实现:
```python
def DFS(adj, start):
visited = [False] * len(adj) # 记录每个顶点是否已访问
stack = [start] # 栈中初始只有起始顶点
visited[start] = True # 标记起始顶点已访问
while stack:
v = stack.pop() # 弹出栈顶元素
print(v, end=' ') # 访问该顶点
for u in adj[v]: # 遍历该顶点的相邻顶点
if not visited[u]: # 如果相邻顶点未被访问过
stack.append(u) # 将其压入栈中
visited[u] = True # 标记已访问
```
## 广度优先遍历(BFS)
广度优先遍历使用队列来实现,其基本流程如下:
1. 将起始顶点入队,标记已访问。
2. 当队列非空时,出队队头元素v。
3. 遍历v的所有相邻顶点,如果该顶点未被访问过,则将其入队并标记已访问。
4. 重复步骤2和3,直到队列为空。
以下是广度优先遍历的Python实现:
```python
from collections import deque
def BFS(adj, start):
visited = [False] * len(adj) # 记录每个顶点是否已访问
queue = deque([start]) # 队列中初始只有起始顶点
visited[start] = True # 标记起始顶点已访问
while queue:
v = queue.popleft() # 出队队头元素
print(v, end=' ') # 访问该顶点
for u in adj[v]: # 遍历该顶点的相邻顶点
if not visited[u]: # 如果相邻顶点未被访问过
queue.append(u) # 将其入队
visited[u] = True# 标记已访问
```
以上就是深度优先遍历和广度优先遍历的实现方式和流程。
阅读全文