結果
| 問題 |
No.1308 ジャンプビーコン
|
| コンテスト | |
| ユーザー |
りあん
|
| 提出日時 | 2020-12-04 20:30:08 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 2,324 ms / 4,000 ms |
| コード長 | 1,420 bytes |
| コンパイル時間 | 1,165 ms |
| コンパイル使用メモリ | 82,252 KB |
| 実行使用メモリ | 91,576 KB |
| 最終ジャッジ日時 | 2024-09-15 07:19:02 |
| 合計ジャッジ時間 | 39,032 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 37 |
ソースコード
#!/usr/bin/env pypy3
from collections import deque
INF = 2 ** 60
def get_dist(s, g):
if s == g:
return 0
dist = [INF for _ in edge]
dist[s] = 0
q = deque()
q.append(s)
while True:
p = q.popleft()
for c, t in edge[p]:
if t == g:
return dist[p] + c
if dist[t] == INF:
dist[t] = dist[p] + c
q.append(t)
def calc(s, dp, l, ds):
res = [i for i in dp]
dist = [INF for _ in dp]
vis = [False for _ in dp]
st = deque()
st.append(s)
dist[s] = l
while st:
p = st[-1]
if vis[p]:
st.pop()
for c, t in edge[p]:
if dist[p] < dist[t]:
res[p] = min(res[p], res[t])
else:
vis[p] = True
res[p] += min(dist[p], ds)
for c, t in edge[p]:
if dist[t] == INF:
dist[t] = dist[p] + c
st.append(t)
return res
n, q, c = map(int, input().split())
edge = [[] for _ in range(n)]
for _ in range(n - 1):
u, v, l = map(int, input().split())
u -= 1
v -= 1
edge[u].append((l, v))
edge[v].append((l, u))
x = list(map(lambda y: int(y) - 1, input().split()))
dp = [INF for _ in range(n)]
dp[x[0]] = 0
for prev, y in zip(x, x[1:]):
d = get_dist(prev, y)
dp = calc(y, dp, c, d)
print(min(dp))
りあん