import sys
class solution:
def solve_flyod(self, dist, start, end):
"""
先根据距离矩阵创建,路径矩阵,然后再根据路径矩阵递归返回路径
:param dist: 节点的距离矩阵
:param start: 起始节点
:param end: 终点
:return: 最短的路线
"""
path = self.create_table(len(dist))
for i in range(len(dist)): # 起始节点
for k in range(len(dist)): # 中间节点
for j in range(len(dist)): # 终点
if dist[i][j] > dist[i][k] + dist[k][j]:
dist[i][j] = dist[i][k] + dist[k][j]
path[i][j] = path[i][k] # 起始节点的走到终点路过点的第一个节点,等于起始节点到中间节点路过的第一个节点
# 因此path[i][j]!=path[j][i],我们有两种方式找到路径,更新起始节点,或更新终点
print(path)
print(dist)
self.print_path(path,start,end)
def print_path(self, path, start, end):
"""
打印路径
:return:None
"""
res = [end]
while start != end:
res.append(path[end][start])
end = path[end][start]
res.reverse()
print(res)
def create_table(self, n):
"""
创建i节点到j节点,第一个经过的节点path[i][j]
:param n: 节点个数
:return:
"""
res = [[i for i in range(n)] for i in range(n)]
return res
if __name__ == '__main__':
my_solution = solution()
dist = [
[0, 10, 15, sys.maxsize, 30, sys.maxsize],
[10, 0, sys.maxsize, 5, 14, sys.maxsize],
[15, sys.maxsize, 0, 12, 12, sys.maxsize],
[sys.maxsize, 5, 12, 0, sys.maxsize, 10],
[30, 14, 12, sys.maxsize, 0, 20],
[sys.maxsize, sys.maxsize, sys.maxsize, 10, 20, 0],
]
my_solution.solve_flyod(dist, 0, 5)
# print(res)
最短路径问题——Floyed算法
最新推荐文章于 2023-03-13 21:49:48 发布