結果
| 問題 |
No.1812 Uribo Road
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-12-06 00:43:35 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,084 bytes |
| コンパイル時間 | 195 ms |
| コンパイル使用メモリ | 82,200 KB |
| 実行使用メモリ | 127,488 KB |
| 最終ジャッジ日時 | 2024-07-07 09:28:33 |
| 合計ジャッジ時間 | 6,791 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 TLE * 1 |
| other | -- * 30 |
ソースコード
import heapq
def dijkstra(s, n, graph):
INF = 10 ** 18
dist = [INF] * n
dist[s] = 0
bef = [0] * n
bef[s] = s
hq = [(0, s)] #距離、地点を記録したヒープを作る
heapq.heapify(hq)
visit = [False] * n #訪れたかの判定
while(len(hq) > 0):
c, v = heapq.heappop(hq) #ヒープから地点を1つ持ってくる
visit[v] = True
#if c > dist[v]:
#continue
for to, cost in graph[v]:
if visit[to] == False and dist[v] + cost < dist[to]:
dist[to] = cost + dist[v]
bef[to] = v
heapq.heappush(hq, (dist[to], to))
'''
return bef
'''
return dist
n, m, k = map(int,input().split())
r = list(map(int,input().split()))
for i in range(k):
r[i] -= 1
graph = [[] for _ in range(n + 1)]
r_cost = 0
r_edges = []
r.sort()
for i in range(m):
a, b, c = map(int,input().split())
graph[a - 1].append((b - 1, c))
graph[b - 1].append((a - 1, c))
if i in r:
r_cost += c
r_edges.append([a - 1, b - 1])
dist = [[] for _ in range(n)]
for a, b in r_edges:
dist[a] = dijkstra(a, n, graph)
dist[b] = dijkstra(b, n, graph)
dist[0] = dijkstra(0, n, graph)
dist[n - 1] = dijkstra(n - 1, n, graph)
INF = 10 ** 15
ans = INF
for i in range(2 ** k):
dp = [[INF] * k for _ in range(2 ** k)]
b = [(i >> j) & 1 for j in range(k)]
for j in range(k):
p = r_edges[j][b[j]]
dp[2 ** j][j] = dist[0][p] + r_cost
for i2 in range(1, 2 ** k):
for x in range(k):
fr = r_edges[x][b[x] ^ 1]
if not(i2 & (2 ** x)):
continue
for y in range(k):
to = r_edges[y][b[y]]
mask = i2 | (2 ** y)
d = dp[i2][x] + dist[fr][to]
if (i2 & (2 ** y) == 0):
dp[mask][y] = min(dp[mask][y], d)
c = INF
for i in range(k):
p = r_edges[i][b[i] ^ 1]
d = dp[-1][i] + dist[n - 1][p]
c = min(c, d)
ans = min(ans, c)
print(ans)