动态输入建构无向图并实现图的遍历
时间: 2024-05-10 12:19:17 浏览: 4
好的,下面是Python代码实现:
```python
# 读取用户输入的节点数和边数
n = int(input("请输入节点数:"))
m = int(input("请输入边数:"))
# 构造邻接表
graph = [[] for _ in range(n)]
for i in range(m):
u, v = map(int, input("请输入第{}条边的起点和终点(用空格隔开):".format(i+1)).split())
graph[u-1].append(v-1)
graph[v-1].append(u-1)
# 初始化遍历状态为未遍历
visited = [False] * n
# 深度优先遍历
def dfs(node):
visited[node] = True
print(node+1, end=" ")
for next_node in graph[node]:
if not visited[next_node]:
dfs(next_node)
# 广度优先遍历
def bfs(start):
queue = [start]
visited[start] = True
while queue:
node = queue.pop(0)
print(node+1, end=" ")
for next_node in graph[node]:
if not visited[next_node]:
visited[next_node] = True
queue.append(next_node)
# 从每个节点开始遍历一遍,确保连通图中所有节点都被遍历到
for i in range(n):
if not visited[i]:
print("从节点{}开始进行深度优先遍历:".format(i+1))
dfs(i)
print()
visited = [False] * n
for i in range(n):
if not visited[i]:
print("从节点{}开始进行广度优先遍历:".format(i+1))
bfs(i)
print()
visited = [False] * n
```
运行代码后,会先要求输入节点数和边数,然后要求用户输入每条边的起点和终点,最后输出从每个节点开始的深度优先遍历和广度优先遍历。例如,对于如下的无向图:
```
1---2---3
\ / /
4---5
```
输入节点数为5,边数为6,然后输入每条边的起点和终点,得到如下输出:
```
从节点1开始进行深度优先遍历:
1 2 4 5 3
从节点2开始进行深度优先遍历:
2 1 4 5 3
从节点3开始进行深度优先遍历:
3 2 1 4 5
从节点4开始进行深度优先遍历:
4 2 1 5 3
从节点5开始进行深度优先遍历:
5 4 2 1 3
从节点1开始进行广度优先遍历:
1 2 4 5 3
从节点2开始进行广度优先遍历:
2 1 3 4 5
从节点3开始进行广度优先遍历:
3 2 1 5 4
从节点4开始进行广度优先遍历:
4 2 1 5 3
从节点5开始进行广度优先遍历:
5 4 2 1 3
```
可以看到,对于这个无向图,从任意一个节点开始进行遍历都可以遍历到所有节点。