[问题描述] 很多涉及图的操作都是以图的遍历操作为基础的,试编写程序,实现图的深度优先和广度优先遍历操作。 ·[基本要求] 以邻接表为存储结构,顶点和边的信息需输入,以用户指定的结点为起点,输出 DFS和BFS遍历下的结点访问序列。编写代码并附上注释
时间: 2024-02-25 16:57:36 浏览: 120
好的,我会为你解答这个问题。首先,让我们来了解一下图的深度优先遍历和广度优先遍历。
图的深度优先遍历(DFS):从某个顶点开始,沿着一条路径一直走到底,直到不能走为止,然后返回走另外一条路径,直到遍历完整个图。
图的广度优先遍历(BFS):从某个顶点开始,依次访问其所有邻接点,然后再访问邻接点的邻接点,直到遍历完整个图。
接下来,我们就可以编写程序实现这两种遍历了。以下是代码示例和注释:
```python
# 定义邻接表存储结构的图类
class Graph:
def __init__(self, vertex_num):
self.vertex_num = vertex_num # 图的顶点数量
self.adj_list = [[] for _ in range(vertex_num)] # 邻接表存储结构
# 添加一条边
def add_edge(self, src, dest):
self.adj_list[src].append(dest)
# 深度优先遍历
def dfs(graph, start_vertex, visited):
visited[start_vertex] = True # 标记当前顶点已访问
print(start_vertex, end=' ')
# 遍历当前顶点的所有邻接点
for vertex in graph.adj_list[start_vertex]:
if not visited[vertex]:
dfs(graph, vertex, visited)
# 广度优先遍历
def bfs(graph, start_vertex):
visited = [False] * graph.vertex_num # 标记所有顶点未访问
queue = [start_vertex] # 用队列存储待访问的顶点
visited[start_vertex] = True # 标记起点已访问
while queue:
vertex = queue.pop(0) # 取出队首顶点
print(vertex, end=' ')
# 遍历当前顶点的所有邻接点
for neighbor in graph.adj_list[vertex]:
if not visited[neighbor]:
visited[neighbor] = True
queue.append(neighbor)
# 测试代码
if __name__ == '__main__':
# 创建一个邻接表存储的图,顶点数量为5
graph = Graph(5)
# 添加边信息
graph.add_edge(0, 1)
graph.add_edge(0, 2)
graph.add_edge(1, 2)
graph.add_edge(2, 0)
graph.add_edge(2, 3)
graph.add_edge(3, 3)
start_vertex = 2 # 以2号顶点为起点
# DFS遍历
print("DFS遍历:")
visited = [False] * graph.vertex_num
dfs(graph, start_vertex, visited)
print()
# BFS遍历
print("BFS遍历:")
bfs(graph, start_vertex)
```
以上就是实现图的深度优先遍历和广度优先遍历的代码和注释,希望能对你有所帮助。
阅读全文