以邻接表的存储方式,实现图的BFS和DFS遍历。具体要求代码可以实现第一行输入两个数m, n,表示图有m个顶点(所有顶点的字母各不相同),n条边, 接下来n行每行输入两个顶点,表示这两个顶点之间有边相连, 最后一行输入遍历开始的顶点 代码输出 从遍历开始的顶点出发,分别输出图的BFS和DFS遍历的结果(若某个节点存在多种遍历方式,则按照字母表顺序来进行遍历,即输出只有一种结果)。生成可执行的python代码,并分析复杂度
时间: 2024-03-13 22:48:14 浏览: 88
好的,以下是实现图的BFS和DFS遍历的Python代码。复杂度分析在代码注释中:
```python
from collections import deque
class Graph:
def __init__(self, vertices):
self.vertices = vertices
self.adj_list = {vertex: [] for vertex in vertices}
def add_edge(self, u, v):
self.adj_list[u].append(v)
self.adj_list[v].append(u)
def bfs(self, start):
visited = {vertex: False for vertex in self.vertices}
bfs_traversal = []
queue = deque([start])
visited[start] = True
while queue:
vertex = queue.popleft()
bfs_traversal.append(vertex)
for neighbor in sorted(self.adj_list[vertex]):
if not visited[neighbor]:
visited[neighbor] = True
queue.append(neighbor)
return bfs_traversal
def dfs(self, start):
visited = {vertex: False for vertex in self.vertices}
dfs_traversal = []
def dfs_helper(vertex):
nonlocal visited, dfs_traversal
visited[vertex] = True
dfs_traversal.append(vertex)
for neighbor in sorted(self.adj_list[vertex]):
if not visited[neighbor]:
dfs_helper(neighbor)
dfs_helper(start)
return dfs_traversal
m, n = map(int, input().split())
vertices = input().split()
graph = Graph(vertices)
for _ in range(n):
u, v = input().split()
graph.add_edge(u, v)
start = input().strip()
print("BFS Traversal:", graph.bfs(start)) # 时间复杂度O(V+E)
print("DFS Traversal:", graph.dfs(start)) # 时间复杂度O(V+E)
```
代码中使用了邻接表来存储图,时间复杂度为O(V+E)。其中,V为顶点数,E为边数。因为每个顶点最多入队一次出队一次,每条边最多被遍历一次。所以,总时间复杂度为O(V+E)。
阅读全文