第一行输入三个整数
—— 结点数、道路数和送餐次数。
接下来
行,第
行输入三个整数
,表示一条连接
与
的双向道路,其长度为
。
最后一行输入
个整数
,其中
表示第
次送餐的目的学校。
输出一个整数,代表完成全部订单最少需要骑行的总距离。
3 2 2 1 2 1 1 3 2 2 3
6
小红先从美食街骑到2号学校,再返回美食街,骑行距离为1+1=2
小红先从美食街骑到3号学校,再返回美食街,骑行距离为2+2=4
因此总共的骑行距离为2+4=6
import heapq
def dijkstra(n, adj, start):
dist = [float("inf")] * (n + 1) # 初始化距离数组,所有距离设为无穷大
dist[start] = 0 # 起点到自身的距离为0
heap = [(0, start)] # 最小堆,存储 (距离, 节点) 元组
while heap:
d, u = heapq.heappop(heap) # 弹出当前距离起点最近的节点
# if d > dist[u]:
# continue # 如果弹出的距离大于已知最短距离,跳过
for v, w in adj[u]: # 遍历当前节点的所有邻接节点
if dist[v] > dist[u] + w: # 如果通过当前节点到达邻接节点的距离更短
dist[v] = dist[u] + w # 更新最短距离
heapq.heappush(heap, (dist[v], v)) # 将新的距离和节点加入堆中
return dist
n, m, q = map(int, input().split()) # 读取节点数n,边数m,目标学校数q
adj = [[] for _ in range(n + 1)] # 初始化邻接表
for _ in range(m):
u, v, w = map(int, input().split()) # 读取每条边的信息
adj[u].append((v, w)) # 添加边 u -> v,权重为 w
adj[v].append((u, w)) # 添加边 v -> u,权重为 w(无向图)
targets = list(map(int, input().split())) # 读取目标学校列表
dist = dijkstra(n, adj, 1) # 计算从节点1到所有节点的最短路径
total = sum(2 * dist[t] for t in targets) # 计算所有目标学校的往返距离之和
print(total) # 输出总骑行距离