結果
| 問題 |
No.1812 Uribo Road
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-08-12 17:37:45 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,161 bytes |
| コンパイル時間 | 326 ms |
| コンパイル使用メモリ | 12,544 KB |
| 実行使用メモリ | 17,792 KB |
| 最終ジャッジ日時 | 2025-08-12 17:37:57 |
| 合計ジャッジ時間 | 11,595 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 4 |
| other | WA * 30 |
ソースコード
from heapq import heappush, heappop
from collections import defaultdict
INF = 10**18
def chmin(t, f):
if t > f:
t = f
return True
return False
def main():
try:
while True:
N, M, K = map(int, input().split())
R = [int(x) - 1 for x in input().split()]
A = []
B = []
C = []
for _ in range(M):
a, b, c = map(int, input().split())
A.append(a - 1)
B.append(b - 1)
C.append(c)
G = [[] for _ in range(N)]
for i in range(M):
G[A[i]].append(i)
G[B[i]].append(i)
ss = [0] * (2 * K + 2)
for k in range(K):
ss[2 * k + 0] = A[R[k]]
ss[2 * k + 1] = B[R[k]]
ss[2 * K + 0] = 0
ss[2 * K + 1] = N - 1
dist = [[INF] * N for _ in range(2 * K + 2)]
for x in range(2 * K + 2):
dist[x][ss[x]] = 0
que = [(0, ss[x])]
while que:
c, u = heappop(que)
if dist[x][u] == c:
for i in G[u]:
cc = c + C[i]
v = A[i] ^ B[i] ^ u
if chmin(dist[x][v], cc):
heappush(que, (cc, v))
dp = [[INF] * (2 * K + 2) for _ in range(1 << K)]
dp[0][2 * K + 0] = 0
for p in range(1 << K):
for x in range(2 * K + 2):
for k in range(K):
if not (p >> k & 1):
chmin(dp[p | 1 << k][2 * k + 1], dp[p][x] + dist[x][A[R[k]]] + C[R[k]])
chmin(dp[p | 1 << k][2 * k + 0], dp[p][x] + dist[x][B[R[k]]] + C[R[k]])
ans = INF
for x in range(2 * K + 2):
chmin(ans, dp[(1 << K) - 1][x] + dist[x][N - 1])
print(ans)
except EOFError:
pass
if __name__ == "__main__":
main()