結果
問題 | No.2565 はじめてのおつかい |
ユーザー |
|
提出日時 | 2023-12-02 15:48:57 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 438 ms / 2,000 ms |
コード長 | 2,440 bytes |
コンパイル時間 | 506 ms |
コンパイル使用メモリ | 82,396 KB |
実行使用メモリ | 97,664 KB |
最終ジャッジ日時 | 2024-09-26 19:21:00 |
合計ジャッジ時間 | 15,764 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 50 |
ソースコード
import heapqfrom collections import dequeINF = 10**18class Dijkstra():# 全ての辺の距離が1のときdef bfs(self, graph, start, goal=-2):N = len(graph)is_visited = [False]*Nis_visited[start] = Truedists = [INF]*Ndists[start] = 0que = deque([(start, 0)])while que:p, d = que.popleft()for next in graph[p]:if not is_visited[next]:que.append((next, d+1))dists[next] = d+1is_visited[next] = Trueif goal == next:return distsreturn distsdef dijkstra(self, graph, start):N = len(graph)dists = [INF for _ in range(N)]dists[start] = 0is_done = [False for _ in range(N)]hp = []# 経路復元が必要な場合prev = [-1 for _ in range(N)]heapq.heappush(hp, (dists[start], start))while hp:min_dist, min_v = heapq.heappop(hp)if is_done[min_v]:continueis_done[min_v] = True# 隣接リスト形式でコストが無いなら、ここのcostを削除することに注意for to, d in graph[min_v]:# 隣接リスト形式でコストが無いなら、ここのコストを1に変更することに注意dist = dists[min_v] + dif dist < dists[to]:dists[to] = distprev[to] = min_vheapq.heappush(hp, (dists[to], to))return dists, prev# 後ろから順になっている事に注意def get_path(self, prev, end):path = []p = endwhile prev[p] != -1:path.append(p)p = prev[p]path.append(p)return pathN, M = map(int, input().split())graph = [[] for _ in range(N)]for _ in range(M):ui, vi = map(int, input().split())ui -= 1vi -= 1graph[ui].append((vi, 1))dijk = Dijkstra()dist_from_0, _ = dijk.dijkstra(graph, 0)dist_from_N1, _ = dijk.dijkstra(graph, N-2)dist_from_N, _ = dijk.dijkstra(graph, N-1)ans = INFans = min(ans, dist_from_0[N-2] + dist_from_N1[N-1 ]+ dist_from_N[0])ans = min(ans, dist_from_0[N-1] + dist_from_N[N-2] + dist_from_N1[0])if ans == INF:print(-1)else:print(ans)