結果
問題 |
No.3111 Toll Optimization
|
ユーザー |
|
提出日時 | 2025-04-20 17:31:28 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 2,529 ms / 5,000 ms |
コード長 | 2,024 bytes |
コンパイル時間 | 447 ms |
コンパイル使用メモリ | 12,288 KB |
実行使用メモリ | 117,712 KB |
最終ジャッジ日時 | 2025-04-20 17:32:17 |
合計ジャッジ時間 | 48,515 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 70 |
ソースコード
import heapq def solve(N, M, K, costs, edges): # 隣接リストの作成 graph = [[] for _ in range(N+1)] for i, (u, v) in enumerate(edges): graph[u].append((v, costs[i])) graph[v].append((u, costs[i])) # 双方向 # 距離配列 (町, 残りクーポン) -> 最小コスト # 初期値は無限大 dist = {} for i in range(1, N+1): for j in range(K+1): dist[(i, j)] = float('inf') # 始点の設定 dist[(1, K)] = 0 # 優先度付きキュー (コスト, 町, 残りクーポン) pq = [(0, 1, K)] while pq: cost, node, remaining_coupons = heapq.heappop(pq) # 既に見つかっている最短経路よりコストが高い場合はスキップ if cost > dist[(node, remaining_coupons)]: continue # 目的地に到着した場合 if node == N: return cost # 隣接ノードを探索 for next_node, edge_cost in graph[node]: # クーポンを使わない場合 new_cost = cost + edge_cost if new_cost < dist[(next_node, remaining_coupons)]: dist[(next_node, remaining_coupons)] = new_cost heapq.heappush(pq, (new_cost, next_node, remaining_coupons)) # クーポンを使う場合 if remaining_coupons > 0: new_cost = cost # クーポンを使うとコストは0 if new_cost < dist[(next_node, remaining_coupons-1)]: dist[(next_node, remaining_coupons-1)] = new_cost heapq.heappush(pq, (new_cost, next_node, remaining_coupons-1)) # 到達不可能な場合 return -1 # 入力処理 N, M, K = map(int, input().split()) costs = list(map(int, input().split())) edges = [] for _ in range(M): u, v = map(int, input().split()) edges.append((u, v)) # 解を求める result = solve(N, M, K, costs, edges) print(result)