Skip to content

Instantly share code, notes, and snippets.

@maehrm
Created March 14, 2026 01:50
Show Gist options
  • Select an option

  • Save maehrm/59ac3249cd3b21d9b3462c7fd99f71e2 to your computer and use it in GitHub Desktop.

Select an option

Save maehrm/59ac3249cd3b21d9b3462c7fd99f71e2 to your computer and use it in GitHub Desktop.
E - Our clients, please wait a moment https://atcoder.jp/contests/abc325/tasks/abc325_e
import heapq
def dijkstra(start_node, G): # ダイクストラ法
dist = [float("inf")] * N
dist[start_node] = 0
que = [(0, start_node)]
while que:
d, pos = heapq.heappop(que)
if d > dist[pos]: # ここで速度改善!
continue # 最短距離でなければ処理する必要なし
for nxt in range(N):
if nxt == pos:
continue
if dist[nxt] > dist[pos] + G[pos][nxt]:
dist[nxt] = dist[pos] + G[pos][nxt]
heapq.heappush(que, (dist[nxt], nxt))
return dist
N, A, B, C = map(int, input().split())
D = [list(map(int, input().split())) for _ in range(N)]
G_car = [[0] * N for _ in range(N)]
for i in range(N):
for j in range(N):
G_car[i][j] = D[i][j] * A
G_train = [[0] * N for _ in range(N)]
for i in range(N):
for j in range(N):
G_train[i][j] = D[i][j] * B + C
time_car = dijkstra(0, G_car) # スタート地点から全て社用車を使用した場合
time_train = dijkstra(N - 1, G_train) # ゴール地点から遡って電車を使用した場合
ans = float("inf")
for k in range(N): # k地点で乗り換えるとすると
ans = min(ans, time_car[k] + time_train[k])
print(ans)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment