思路
由瞪眼法得知, 此题为非负权全源最短路, 最优做法是Dijkstra跑N遍或Johnson, 此处使用更常见的Dijkstra算法.
题解代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import heapq from collections import defaultdict from functools import cache
def dij_builder(e): @cache def dijkstra(s): vis = set() queue = [(0, s)] dis = defaultdict(lambda: float("+inf")) dis[s] = 0 while queue: _, u = heapq.heappop(queue) if u in vis: continue vis.add(u) for v, w in e[u]: if dis[v] > dis[u] + w: dis[v] = dis[u] + w heapq.heappush(queue, (dis[v], v)) return dis
return dijkstra
e = defaultdict(list)
n, m = map(int, input().split()) for i in range(m): a, b, t = input().split() e[a].append((b, int(t)))
dijkstra = dij_builder(e)
for i in range(int(input())): a, b = input().split() if dijkstra(a)[b] < float("+inf"): print(dijkstra(a)[b]) else: print("Roger")
|