問題
D – バスと避けられない運命
回答
ダイクストラ法を使います。
Python では TLE でしたが、PyPy では AC でした。
import collections
import sys
import heapq
N, M = map(int, input().split())
edges = [list(map(int, input().split())) for _ in range(M)]
# 隣接リスト
adjacent_dict = collections.defaultdict(list)
for frm, to, distance in edges:
adjacent_dict[frm].append([to, distance])
adjacent_dict[to].append([frm, distance])
ans_dict = collections.defaultdict(lambda: sys.maxsize)
# 全てのスタート地点に対してダイクストラ法を適用
for start in range(1, N+1):
# 全ての距離を最大値に指定
distance_dict = collections.defaultdict(lambda: sys.maxsize)
# スタート地点の距離は0
distance_dict[start] = 0
# (距離, 頂点) の優先度付きキュー
priority_queue = []
heapq.heappush(priority_queue, (0, start))
# 訪問済みフラグ
visited = collections.defaultdict(bool)
while len(priority_queue):
# 距離が最小であるノードをを取得
cur_distance, cur_node = heapq.heappop(priority_queue)
# 訪問済みフラグ
if visited[cur_node]:
continue
visited[cur_node] = True
# 隣接するノードとの距離
for next_node, distance in adjacent_dict[cur_node]:
if visited[next_node]:
continue
new_distance = cur_distance + distance
# 新しい距離が短い場合は距離を更新
if distance_dict[next_node] > new_distance:
distance_dict[next_node] = new_distance
heapq.heappush(priority_queue, (new_distance, next_node))
# そのスタート地点で取り得る最大の距離
ans_dict[start] = max(distance_dict.values())
# 全てのスタート地点の中で最小の距離
print(min(ans_dict.values()))