[问题描述] 很多涉及图的操作都是以图的遍历操作为基础的,试编写程序,实现图的深度优先和广度优先遍历操作。 ·[基本要求] 以邻接表为存储结构,顶点和边的信息需输入,以用户指定的结点为起点,输出 DFS和BFS遍历下的结点访问序列。编写代码并附上注释
时间: 2024-02-25 17:57:36 浏览: 107
建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历.doc
5星 · 资源好评率100%
好的,我会为你解答这个问题。首先,让我们来了解一下图的深度优先遍历和广度优先遍历。
图的深度优先遍历(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)
```
以上就是实现图的深度优先遍历和广度优先遍历的代码和注释,希望能对你有所帮助。
阅读全文