import numpy as np
def add_set(s,v,u): #s代表已经访问过结点的集合,V表示全部结点集合
for i in u:
s.add(i[1])
s_=v-s
return s_
def add_path(t1,t2,b):
for a_ in b:
i = a_[0]
j = a_[1]
a = a_[2]
t=t1[i].copy()
t.append(j)
t1.append(t)
t2.append(a)
def dijkstra(s,v,s_,dist_mat,i2,t1,t2): #t1里面记录了每一条可能路径,t2记录每一条路径的距离
while i2 not in s:
min=1000
b=[] #把每次试探结果装起来
for i in range(len(t1)): # 遍历路径集里第i条路径
for j in s_: # 遍历s_里面每一个的结点 weight(t[i][-1],j)
a=t2[i]+dist_mat[(t1[i][-1]-1),j-1]
if a<min:
min=a # 找到最小距离
a_=(i,j,a)
b.append(a_)
b=[x for x in b if x[2]==min]
add_path(t1,t2,b)
s_=add_set(s,v,b)
a=[(x,t2[i]) for i, x in enumerate(t1) if x[-1]==i2]
return a
a = float('inf')
dist_mat = np.array([[0, 3, 5, 3, a, a, a, a, a, a], [3, 0, a, a, 3, 6, a, a, a, a], [5, a, 0, 4, 2, a, 6, a, a, a],
[3, a, 4, 0, a, 8, a, a, a, a], [a, 3, 2, a, 0, a, a, 7, 3, a], [a, 6, a, 4, a, 0, 8, 5, a, 3],
[a, a, 6, a, a, 8, 0, a, 2, a], [a, a, a, a, 7, 5, a, 0, a, 2], [a, a, a, a, 3, a, 2, a, 0, 2],
[a, a, a, a, a, 3, a, 2, 2, 0]]) # 距离矩阵
t1=[[0]]
t2=[0]
i1=int(input('请输入开始点下标:'))
i2=int(input('请输入结束点下标: '))
t1[0][0]=i1 # 初始化第一条路径
S={i1} #初始化已遍历点集
V={1,2,3,4,5,6,7,8,9,10} # 初始化全集所有结点
S_=V-S
m=dijkstra(S,V,S_,dist_mat,i2,t1,t2)
print('最短路径的距离为:',m[0][-1])
print('最短路径为:')
for x in m:
for i in x[0]:
if i==x[0][-1]:
print(str(i))
else:
print('{}-->'.format(i), end='')
输出结果:
请输入开始点下标:1
请输入结束点下标: 10
最短路径的距离为: 11.0
最短路径为:
1-->2-->5-->9-->10