結果
問題 |
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])