結果
| 問題 | No.3561 Collect KCPC |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-05-28 11:28:53 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 1,986 ms / 6,000 ms |
| コード長 | 4,370 bytes |
| 記録 | |
| コンパイル時間 | 186 ms |
| コンパイル使用メモリ | 85,324 KB |
| 実行使用メモリ | 151,484 KB |
| 最終ジャッジ日時 | 2026-05-29 18:49:07 |
| 合計ジャッジ時間 | 27,242 ms |
|
ジャッジサーバーID (参考情報) |
judge3_1 / judge2_0 |
| 純コード判定待ち |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| 部分点1 | 10 % | AC * 15 |
| 部分点2 | 20 % | AC * 15 |
| 部分点3 | 20 % | AC * 13 |
| 部分点4 | 50 % | AC * 51 |
| 合計 | 100 点 |
ソースコード
# Geminiで翻訳
import sys
from heapq import heappush, heappop
def solve():
# 入力を一括で読み込み
input_data = sys.stdin.read().split()
if not input_data:
return
N = int(input_data[0])
M = int(input_data[1])
E = [[] for _ in range(N)]
idx = 2
for _ in range(M):
u = int(input_data[idx]) - 1
v = int(input_data[idx+1]) - 1
c = int(input_data[idx+2])
E[u].append((v, c))
idx += 3
S = input_data[idx]
INF_DIST = 10**18
INF_ID = 10**9
INF_PAIR = (INF_DIST, INF_ID)
# ==========================================
# Phase 1: 'K' を起点とする最短経路 (D1)
# ==========================================
D1 = [INF_DIST] * N
D1[0] = 0
Q1 = [(0, 0)]
while Q1:
d, v = heappop(Q1)
if d != D1[v]:
continue
for u, c in E[v]:
if D1[u] > d + c:
D1[u] = d + c
heappush(Q1, (D1[u], u))
for i in range(N):
if S[i] != 'K':
D1[i] = INF_DIST
elif D1[i] != INF_DIST:
heappush(Q1, (D1[i], i))
while Q1:
d, v = heappop(Q1)
if d != D1[v]:
continue
for u, c in E[v]:
if D1[u] > d + c:
D1[u] = d + c
heappush(Q1, (D1[u], u))
# ==========================================
# Phase 2: 'C' を起点とする最短経路 (D2, D3)
# ==========================================
D2 = [INF_PAIR] * N
D3 = [INF_PAIR] * N
Q2 = []
for i in range(N):
if S[i] == 'C' and D1[i] != INF_DIST:
D2[i] = (D1[i], i)
# 要素は (距離のタプル, 頂点)
heappush(Q2, (D2[i], i))
while Q2:
d_pair, v = heappop(Q2)
if d_pair != D2[v]:
continue
d_dist, d_id = d_pair
for u, c in E[v]:
nxt_pair = (d_dist + c, d_id)
if D2[u] > nxt_pair:
D2[u] = nxt_pair
heappush(Q2, (D2[u], u))
if D2[u][1] != d_id:
if D3[u] > nxt_pair:
D3[u] = nxt_pair
for i in range(N):
if D3[i] != INF_PAIR:
heappush(Q2, (D3[i], i))
while Q2:
d_pair, v = heappop(Q2)
if d_pair != D3[v]:
continue
d_dist, d_id = d_pair
for u, c in E[v]:
nxt_pair = (d_dist + c, d_id)
if D2[u][1] != d_id and D3[u] > nxt_pair:
D3[u] = nxt_pair
heappush(Q2, (D3[u], u))
# ==========================================
# Phase 3: 'P' を起点とする最短経路 (D2, D3)
# ==========================================
for i in range(N):
if S[i] != 'P':
D2[i] = INF_PAIR
D3[i] = INF_PAIR
elif D2[i] != INF_PAIR:
heappush(Q2, (D2[i], i))
while Q2:
d_pair, v = heappop(Q2)
if d_pair != D2[v]:
continue
d_dist, d_id = d_pair
for u, c in E[v]:
nxt_pair = (d_dist + c, d_id)
if D2[u] > nxt_pair:
D2[u] = nxt_pair
heappush(Q2, (D2[u], u))
if D2[u][1] != d_id:
if D3[u] > nxt_pair:
D3[u] = nxt_pair
for i in range(N):
if D3[i] != INF_PAIR:
heappush(Q2, (D3[i], i))
while Q2:
d_pair, v = heappop(Q2)
if d_pair != D3[v]:
continue
d_dist, d_id = d_pair
for u, c in E[v]:
nxt_pair = (d_dist + c, d_id)
if D2[u][1] != d_id and D3[u] > nxt_pair:
D3[u] = nxt_pair
heappush(Q2, (D3[u], u))
# ==========================================
# 解の計算
# ==========================================
ans = INF_DIST
for i in range(N):
if S[i] == 'C':
if D2[i][1] != i:
ans = min(ans, D2[i][0])
else:
ans = min(ans, D3[i][0])
if ans > 10**17:
ans = -1
print(ans)
if __name__ == '__main__':
solve()