设计并实现求无向图两点间所有路径的算法
-
实验原理
- 无向图的深度优先搜索:
假设一个图 G,图中所有顶点未曾被访问过,则深度优先搜索就是从图中某个顶点 v 出发,访问此顶点,然后再从 v 的未被访问的邻接点出发深度优先遍历图,直至图中所有和 v 有路径相通的顶点都被访问到;若图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。 - 利用深度优先搜索获取两点间路径的过程:
给定一个图 G,起始节点 a 和目的节点 b,开始时将 a 加入到路径集合 path[],并将 a 加入到已经访问节点集合 visited[],然后以 a 为起点运用深度优先算法对图进行搜索,每搜索到一个节点就将其加入到 path 和 visited 中,当搜索到目的节点 b 的时候就把路径打印出来,然后把 b 从 path 和 visited 中移除然后对前一个节点中未被访问的邻接节点进行深度优先搜索,当搜索到一个节点 v 已经没有未访问的邻接节点时,说明已经“到底”了,那么此时也要把 v 从 path 和 visited 中移除,然后对其前一个节点的未访问邻接节点进行深度优先搜索直到所有的节点都被搜索到为止;
- 无向图的深度优先搜索:
-
实验步骤
- 将图的数据保存到 Graph.txt 中
- 设计一个 Graph 类(用邻接字典)
- 设计并实现深度优先搜索找路径的代码
- 读取 Graph.txt 创建一个 Graph 对象
- 运行DFS观察结果
- 根据所画的图验证结果
-
代码实现
# 找路径
def find_path(graph, start_node, destination_node):
node_num = graph.get_node_num() # 获取节点个数
visited = []
path = []
for i in range(node_num): # 对所有节点初始化,标记为0是没有访问
visited.append(0)
dfs(graph, visited, start_node, destination_node, path) # 调用深度优先遍历
# 深度优先遍历
def dfs(graph, visited, v, destination_node, path):
visited[v] = 1 # 标记为已经访问
path.append(v) # 将节点v加入到路径集合中
if v == destination_node: # 如果节点v是目的节点,那么打印路径
for i in range(len(path)):
if i != len(path)-1:
print(path[i], end="->")
else:
print(path[i])
print("")
else:
for w in graph.get_node_edge(v): # 如果v不是目的节点,就找到v没有被访问到邻接节点进行深度优先遍历
if visited[w] == 0:
dfs(graph, visited, w, destination_node, path)
path.pop(len(path) - 1) # 发现遍历到底(即v已经没有未访问的邻接节点或者v就已经是目的节点),把v从路径集合中删除
visited[v] = 0 # 并将v 设置为未访问
- 验证数据
0 6
0 9
1 2
1 7
1 8
3 1
3 2
3 10
4 5
4 8
1 3
2 1
2 5
2 3
5 4
9 10
9 8
10 3
11 6
11 9
5 2
6 0
6 11
8 4
8 1
8 9
7 1
- 验证结果
- 微信公众号(白话数据结构与算法)