著名的最短路算法包括dijkstra,floyd,SPFA,本次代码主要是前两种,SPFA算法版之后更新
"""
dijkstra
"""
global side,point
global visit,dis,p
def dijkstra(n,s):
visit[s]=True
p[s]=s
dis[s]=0
for i in range(len(point[s])):
sd=point[s][i]
v=side[sd][1]
dis[v]=min(dis[v],side[sd][2])
p[v]=s
for i in range(1,n):
mindis=float("inf")
for j in range(1,n+1):
#找出未被标记的最近结点
if visit[j]==False and dis[j]<mindis:
mindis=dis[j]
u=j
visit[u]=True
#尝试更新临近结点
for k in range(len(point[u])):
sd=point[u][k]
v=side[sd][1]
if visit[v]==False and dis[u]+side[sd][2]<dis[v]:
dis[v]=dis[u]+side[sd][2]
p[v]=u
for d in dis[1:]:
if d!=float("inf"):
print(d,end=" ")
else:
print(2**31-1,end=" ")
n,m,s=map(int,input().split())
side=[0]*m
point=[[] for i in range(n+1)]
for i in range(m):
side[i]=list(map(int,input().strip().split()))
point[side[i][0]].append(i)
visit=[False for i in range(n+1)]
dis=[float("inf") for i in range(n+1)]
p=[0 for i in range(n+1)]
dijkstra(n,s)
#floyd
n,m=map(int,input().split())
path=[0]*m
for i in range(m):
path[i]=int(input())
point=[[0] for i in range(n+1)]
for i in range(1,n+1):
msg=list(map(int,input().split()))
point[i]+=msg
for i in range(1,n+1):
for j in range(1,n+1):
for k in range(1,n+1):
if i!=j and j!=k and k!=i:
if point[j][k]>point[j][i]+point[i][k]:
point[j][k]=point[j][i]+point[i][k]
ans=0
for i in range(m-1):
ans+=point[path[i]][path[i+1]]
print(ans)