**
题目:有如图A,B,C,D,E五个节点,试问从A到D的最短路径是多少步?
**问题分析:**从A到D,若用穷举法,有A-B-D, A-B-E-C-D,等,此时因为节点数少,用穷举法自然能够求出,若节点数增加至成百上千个,那么很难穷举出,所以在此,决定使用floyd算法,
floyd算法如下:
map[i,j]:=min{map[i,k]+map[k,j],map[i,j]};
map[i,j]表示i到j的最短距离,K是穷举i,j的断点,map[n,n]初值应该为0,或者按照题目意思来做。
当然,如果这条路没有通的话,还必须特殊处理,比如没有map[i,k]这条路。
floyd算法核心:通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。
因此,通过floyd算法可以求出每个节点之间最短路径。
代码如下:
import math
nodes = ('A', 'B', 'C', 'D', 'E') # 节点
# dis矩阵初始化
dis = [[0, 3, 4, math.inf, 1],
[3, 0, math.inf, 5, 1],
[4, math.inf, 0, 2, 2],
[math.inf, 5, 2, 0, math.inf],
[1, 1, 2, math.inf, 0]]
node_num = len(nodes) # 节点个数
# floyd算法 map[i,j]:=min{map[i,k]+map[k,j],map[i,j]},map[i,j]表示i到j的最短距离,K是穷举i,j的断点,
for i in range(node_num):
for j in range(node_num):
for k in range(node_num):
# dis[i][j]表示i到j的最短距离,dis[i][k]表示i到k的最短距离,dis[k][j]表示k到j的最短距离
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]) # 若比原来距离小,则更新
print('各个点的最短路径为:', dis)
print('A到D的最短距离为:', dis[0][3])
运行结果如下:
各个点的最短路径为: [[0, 2, 3, 5, 1], [2, 0, 3, 5, 1], [3, 3, 0, 2, 2], [5, 5, 2, 0, 4], [1, 1, 2, 4, 0]]
A到D的最短距离为: 5
**
日期:2019年4月12日于湖北荆州做