結果
| 問題 |
No.1308 ジャンプビーコン
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 14:34:28 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,097 bytes |
| コンパイル時間 | 182 ms |
| コンパイル使用メモリ | 82,844 KB |
| 実行使用メモリ | 474,588 KB |
| 最終ジャッジ日時 | 2025-06-12 14:35:25 |
| 合計ジャッジ時間 | 42,328 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 3 |
| other | WA * 37 |
ソースコード
import sys
from collections import deque
def main():
sys.setrecursionlimit(1 << 25)
N, Q, C = map(int, sys.stdin.readline().split())
edges = [[] for _ in range(N+1)]
for _ in range(N-1):
u, v, l = map(int, sys.stdin.readline().split())
edges[u].append((v, l))
edges[v].append((u, l))
query = list(map(int, sys.stdin.readline().split()))
x = query
steps = []
for i in range(Q-1):
a = x[i]
b = x[i+1]
steps.append((a, b))
# Precompute distances using BFS for each node
dist = {}
for u in range(1, N+1):
q = deque()
q.append(u)
visited = {u: 0}
while q:
v = q.popleft()
for nei, l in edges[v]:
if nei not in visited:
visited[nei] = visited[v] + l
q.append(nei)
dist[u] = visited
# Now, for each step, get the distance
distances = []
for a, b in steps:
distances.append(dist[a][b])
# Initialize DP
dp = [[float('inf')] * 2 for _ in range(Q+1)]
dp[1][0] = 0 # No beacon at x1
dp[1][1] = 0 # Beacon at x1
for i in range(1, Q):
if i >= len(distances):
break
d_ij = distances[i-1]
for s in [0, 1]:
if dp[i][s] == float('inf'):
continue
# Option 1: move normally
new_cost = dp[i][s] + d_ij
# After moving, can choose to set beacon or not at x_{i+1}
for s_new in [0, 1]:
if new_cost < dp[i+1][s_new]:
dp[i+1][s_new] = new_cost
# Option 2: if s ==1, use the beacon
if s == 1:
# The movement cost is min(d_ij, C)
cost = min(d_ij, C)
for s_new in [0, 1]:
if dp[i][s] + cost < dp[i+1][s_new]:
dp[i+1][s_new] = dp[i][s] + cost
# Find the minimal cost after all steps
min_cost = min(dp[Q][0], dp[Q][1])
print(min_cost)
if __name__ == "__main__":
main()
gew1fw