結果
| 問題 |
No.1812 Uribo Road
|
| コンテスト | |
| ユーザー |
titia
|
| 提出日時 | 2022-01-18 00:58:12 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 2,983 ms / 5,000 ms |
| コード長 | 1,540 bytes |
| コンパイル時間 | 265 ms |
| コンパイル使用メモリ | 12,928 KB |
| 実行使用メモリ | 354,688 KB |
| 最終ジャッジ日時 | 2024-11-23 13:05:51 |
| 合計ジャッジ時間 | 27,810 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 30 |
ソースコード
import sys
input = sys.stdin.readline
import heapq
N,M,K=map(int,input().split())
R=list(map(int,input().split()))
EX=[tuple(map(int,input().split())) for i in range(M)]
E=[[] for i in range(N+1)]
for a,b,c in EX:
E[a].append((b,c))
E[b].append((a,c))
for i in range(K):
R[i]-=1
def dijk(x):
DIS=[1<<63]*(N+1)
Q=[(0,x)]
DIS[x]=0
while Q:
time,now=heapq.heappop(Q)
if DIS[now]<time:
continue
for to,cost in E[now]:
if DIS[to]>DIS[now]+cost:
DIS[to]=DIS[now]+cost
heapq.heappush(Q,(DIS[to],to))
return DIS
DIST=[[] for i in range(N+1)]
DIST[1]=dijk(1)
DIST[N]=dijk(N)
R2=[]
for i in range(K):
r=R[i]
x,y,cc=EX[r]
R2.append((x,y,cc))
DIST[x]=dijk(x)
DIST[y]=dijk(y)
#print(DIST)
DP=[[1<<63]*(1<<K) for i in range(N+1)]
DP[1][0]=0
Q=[(0,1,0)]
while Q:
time,now,b=heapq.heappop(Q)
if DP[now][b]<time:
continue
for i in range(K):
if b & (1<<i) ==0:
x,y,c=R2[i]
if DP[y][b|(1<<i)]>DP[now][b]+DIST[now][x]+c:
DP[y][b|(1<<i)]=DP[now][b]+DIST[now][x]+c
heapq.heappush(Q,(DP[y][b|(1<<i)],y,b|(1<<i)))
if DP[x][b|(1<<i)]>DP[now][b]+DIST[now][y]+c:
DP[x][b|(1<<i)]=DP[now][b]+DIST[now][y]+c
heapq.heappush(Q,(DP[x][b|(1<<i)],x,b|(1<<i)))
ANS=1<<63
for i in range(N+1):
xx=DP[i][-1]
if xx==1<<63:
continue
ANS=min(ANS,xx+DIST[i][N])
print(ANS)
titia