結果
| 問題 | No.3653 Space-Time Courier |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-07-19 22:54:40 |
| 言語 | PyPy3 (7.3.23 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 3,522 ms / 4,000 ms |
| + 45µs | |
| コード長 | 2,366 bytes |
| 記録 | |
| コンパイル時間 | 243 ms |
| コンパイル使用メモリ | 95,984 KB |
| 実行使用メモリ | 146,880 KB |
| 最終ジャッジ日時 | 2026-08-28 20:51:55 |
| 合計ジャッジ時間 | 29,739 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 28 |
ソースコード
import sys
import heapq
def solve():
# 入力の一括読み込み(高速化のため)
input_data = sys.stdin.read().split()
if not input_data:
return
N = int(input_data[0])
M = int(input_data[1])
# 基本コスト P (1-indexedにするため先頭に0を追加)
P = [0] + [int(x) for x in input_data[2:N+2]]
idx = N + 2
edges = []
for _ in range(M):
u = int(input_data[idx])
v = int(input_data[idx+1])
t = int(input_data[idx+2])
edges.append((u, v, t))
idx += 3
# 1. Bellman-Ford法によるポテンシャル h の計算
h = [0] * (N + 1)
for _ in range(N):
updated = False
for u, v, t in edges:
if h[v] > h[u] + t:
h[v] = h[u] + t
updated = True
if not updated:
break
# 2. 辺の重みの書き換え (非負化) と隣接リストの構築
adj_prime = [[] for _ in range(N + 1)]
for u, v, t in edges:
w_prime = t + h[u] - h[v]
adj_prime[u].append((v, w_prime))
# 3. 各頂点からのDijkstra法
min_cost = float('inf')
min_count = 0
# ループ内でのルックアップ高速化のためのローカル変数化
heappush = heapq.heappush
heappop = heapq.heappop
for A in range(1, N + 1):
d = [float('inf')] * (N + 1)
d[A] = 0
hq = [(0, A)]
visited_nodes = []
while hq:
d_u, u = heappop(hq)
if d_u > d[u]:
continue
if u != A:
visited_nodes.append(u)
for v, w_prime in adj_prime[u]:
v_dist = d_u + w_prime
if d[v] > v_dist:
d[v] = v_dist
heappush(hq, (v_dist, v))
# 始点 A から到達できた頂点に対してコストを計算・集計
const_A = P[A] - h[A]
for v in visited_nodes:
cost = d[v] + const_A + P[v] + h[v]
if cost < min_cost:
min_cost = cost
min_count = 1
elif cost == min_cost:
min_count += 1
# 出力処理
if min_cost == float('inf'):
print(-1)
else:
print(f"{min_cost} {min_count}")
if __name__ == '__main__':
solve()