328 floyd算法2 #
- 各点之间最短路径的计算
- 最短路径溯源
- 完整实现
各点之间最短路径的计算 #
这部分形式上相当简单,只需要对每对顶点寻找中间值比较更新即可,是一个三层嵌套循环
path = [[i] * 7 for i in range(7)]
for k in range(7):
for i in range(7):
for j in range(7):
if data[i][j] > data[i][k] + data[k][j]: # 比较距离的大小
data[i][j] = data[i][k] + data[k][j] # 每次都存最小的值
path[i][j] = k # 记录中间点
最短路径溯源 #
除了计算路径值外,还需要存储所有中间点,然后根据中间点递归溯源
def show_trace(x,y):
trace = []
def add_trace(x, y):
if x != y:
add_trace(x, path[x][y])
return trace.append(y)
add_trace(x,y)
trace_str = str(trace)
trace_str = trace_str.replace(',','-->')
print(f"从 {x} 到 {y} 的最短路径为: {trace_str}")
完整实现 #
下面是floyd算法的完整实现
f = float('inf') # float('inf')表示无穷大
# 准备数据
data = [
[0, 7, f, 5, f, f, f],
[7, 0, 8, 9, 7, f, f],
[f, 8, 0, f, 5, f, f],
[5, 9, f, 0, 15, 6, f],
[f, 7, 5, 15, 0, 8, 9],
[f, f, f, 6, 8, 0, 11],
[f, f, f, f, 9, 11, 0],
]
path = [[i] * 7 for i in range(7)]
for k in range(7):
for i in range(7):
for j in range(7):
if data[i][j] > data[i][k] + data[k][j]: # 比较距离的大小
data[i][j] = data[i][k] + data[k][j] # 每次都存最小的值
path[i][j] = k # 记录中间点
# 定义函数找出x到y的具体路径
def show_trace(x,y):
trace = []
def add_trace(x, y):
if x != y:
add_trace(x, path[x][y])
return trace.append(y)
add_trace(x,y)
trace_str = str(trace)
trace_str = trace_str.replace(',','-->')
print(f"从 {x} 到 {y} 的最短路径为: {trace_str}")
for i in data:
print(i)
show_trace(0,4) # 求A到E的最短路径
show_trace(0,6) # 求A到G的最短路径
小结 #
习题 #
- 详细描述出回溯路径的过程
- 运行floyd和dijkstra,看看它们的解是否相同?为什么?