该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
import sys
sys.setrecursionlimit(100000000)
# 弗洛伊德算法
def floyd():
n = len(graph)
for k in range(n):
for i in range(n):
for j in range(n):
if graph[i][k] + graph[k][j] < graph[i][j]:
graph[i][j] = graph[i][k] + graph[k][j]
parents[i][j] = parents[k][j] # 更新父结点
# 打印路径
def print_path(i, j):
if i != j:
print_path(i, parents[i][j])
print(j, end='-->')
# Data [u, v, cost]
datas = [
[1, 6, 6],
[2, 6, 4],
[2, 7, 7],
[3, 7, 5],
[3, 8, 4],
[4, 8, 9],
[4, 9, 4],
[5, 9, 3],
[6, 10, 3],
[6, 11, 4],
[7, 11, 3],
[7, 12, 2],
[8, 12, 3],
[8, 13, 1],
[9, 13, 2],
[9, 14, 5],
[10, 15, 9],
[11, 15, 3],
[11, 16, 6],
[12, 16, 4],
[12, 17, 2],
[13, 17, 1],
[13, 18, 4],
[14, 18, 3],
[15, 19, 2],
[15, 20, 5],
[16, 20, 4],
[16, 21, 3],
[17, 21, 7],
[17, 22, 7],
[18, 22, 1],
[18, 23, 6],
]
n = 23
# 无穷大
inf = 9999999999
# 构图
graph = [[(lambda x: 0 if x[0] == x[1] else inf)([i, j]) for j in range(n)] for i in range(n)]
parents = [[i] * n for i in range(2000)] # 关键地方,i-->j 的父结点初始化都为i
for u, v, c in datas:
graph[u][v] = c
floyd()
print('Costs:')
for row in graph:
for e in row:
print('∞' if e == inf else e, end='\t')
print()
print('\nPath:')
for i in range(n):
for j in range(n):
print('Path({}-->{}): '.format(i, j), end='')
print_path(i, j)
print(' cost:', graph[i][j])