import sys
import heapq
from collections import defaultdict
N, K = map(int, sys.stdin.readline().split())
data = list(map(int, sys.stdin.read().split()))
adj = defaultdict(lambda : [])
for k in range(K):
u, v, w = data[(3*k): (3*k +3)]
adj[u].append((v, w))
adj[v].append((u, w))
s, e = data[-2:]
INF = 0x3F3F3F3F
def dijkstra(s):
q = [(0, s)]
dists = defaultdict(lambda: INF)
dists[s] = 0
vis = set()
while q:
d, node = heapq.heappop(q)
if node in vis:
continue
vis.add(node)
for c, w in adj[node]:
if dists[c] > d + w:
heapq.heappush(q, (d + w, c))
dists[c] = d + w
return dists
# 从终点倒着更新,这样可以方便寻找起点的下一跳
dists = dijkstra(e)
if dists[s] >= INF:
print(-1)
print(-1)
exit(0)
n_jump = []
for c, w in adj[s]:
if dists[c] + w == dists[s]:
n_jump.append(c)
print(dists[s])
print(' '.join(map(str, n_jump)))
- 从终点进行一次dijkstra算法即可
- 扫描起点的后继节点,判断哪些是符合最短路