[COCI 2020/2021 #6] Alias 题解
算法 | 题解 | 最短路 | 模板
2025年3月9日
思路
由瞪眼法得知, 此题为非负权全源最短路, 最优做法是Dijkstra跑N遍或Johnson, 此处使用更常见的Dijkstra算法.
题解代码
import heapq
from collections import defaultdict
from functools import cache
def dij_builder(e): # 构建Dijkstra算法
@cache # 缓存结果
def dijkstra(s): # Dijkstra模板
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) # 以图初始化Dijkstra算法
for i in range(int(input())): # 求解和结果输出
a, b = input().split()
if dijkstra(a)[b] < float("+inf"):
print(dijkstra(a)[b])
else:
print("Roger")