結果
| 問題 |
No.3263 違法な散歩道
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-09-10 09:25:18 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 541 ms / 2,000 ms |
| コード長 | 3,226 bytes |
| コンパイル時間 | 520 ms |
| コンパイル使用メモリ | 82,404 KB |
| 実行使用メモリ | 157,732 KB |
| 最終ジャッジ日時 | 2025-09-10 09:25:33 |
| 合計ジャッジ時間 | 12,995 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
#%%
from collections import deque
import heapq
inf = float("inf")
class ShortestPathGraph:
def __init__(self, N, directed):
self.N = N
self.adj = [[] for _ in range(N)]
self.directed = directed
def add_edge(self, u, v, w=None):
if w is None:
if self.directed:
self.adj[u].append(v)
else:
self.adj[u].append(v)
self.adj[v].append(u)
else:
if self.directed:
self.adj[u].append((v, w))
else:
self.adj[u].append((v, w))
self.adj[v].append((u, w))
def shortest_path_wo_weight(self, src, dst=None):
dist = [inf] * self.N
dist[src] = 0
prev = [-1] * self.N
Q = deque([src])
while Q:
u = Q.popleft()
for v in self.adj[u]:
if dist[v] == inf:
dist[v] = dist[u] + 1
prev[v] = u
if dst is not None and v == dst:
return dist, prev
Q.append(v)
return dist, prev
def shortest_path_with_weight(self, src, dst=None):
dist = [inf] * self.N
dist[src] = 0
prev = [-1] * self.N
Q = [(0, src)]
while Q:
d, u = heapq.heappop(Q)
if dist[u] < d:
continue
if dst is not None and u == dst:
return dist, prev
for v, w in self.adj[u]:
if dist[v] > dist[u] + w:
dist[v] = dist[u] + w
prev[v] = u
heapq.heappush(Q, (dist[v], v))
return dist, prev
def shortest_path_with_negative_weight(self, src):
dist = [inf] * self.N
dist[src] = 0
prev = [-1] * self.N
for _ in range(self.N - 1):
for u in range(self.N):
for v, w in self.adj[u]:
if dist[v] > dist[u] + w:
dist[v] = dist[u] + w
prev[v] = u
for _ in range(self.N - 1):
for u in range(self.N):
for v, w in self.adj[u]:
if dist[v] > dist[u] + w:
dist[v] = -inf
return dist, prev
def get_path(self, prev, dst):
if prev[dst] == dst:
return [dst]
node = prev[dst]
path = [dst]
while node != -1 and node != dst:
path.append(node)
node = prev[node]
return path[::-1]
N, M = map(int, input().split())
UV = [[int(x) for x in input().split()] for _ in range(M)]
K = int(input())
if K:
A = [int(x) for x in input().split()]
else:
A = []
is_iwi = [False] * N
for a in A:
is_iwi[a - 1] = True
G = ShortestPathGraph(N * 5, True)
for u, v in UV:
u -= 1
v -= 1
for uu, vv in ((u, v), (v, u)):
if is_iwi[vv]:
for i in range(4):
G.add_edge(N * i + uu, N * (i + 1) + vv)
else:
for i in range(5):
G.add_edge(N * i + uu, vv)
d, prev = G.shortest_path_wo_weight(0, N - 1)
if d[N - 1] == inf:
print(-1)
else:
print(d[N - 1])