問題
方針
xをノードA_iとノードB_iで結ばれる長さC_iのエッジからなる無向グラフと考え、ノード0からノード(N - 1)までの最短距離を考える。もしそれがinfなら-1と出力し、そうでないならその距離を出力。
コード
Python
1import heapq 2def dijkstra(graph, N): #ダイクストラ法 #N個の頂点からなるグラフの最短経路 3 dist = [float('inf') for _ in range(N)] 4 dist[0] = 0 5 6 data = [[0, 0]] #未確定ノード[距離, ノード番号] 7 while data: 8 pos = heapq.heappop(data)[1] 9 10 11 for node, cost in graph[pos]: 12 if dist[pos] + cost < dist[node]: 13 dist[node] = dist[pos] + cost 14 heapq.heappush(data, [dist[node], node]) 15 return dist 16 17N, M = map(int, input().split()) 18 19graph = [[] for _ in range(N)] 20for _ in range(M): 21 A, B, C = map(int, input().split()) 22 A -= 1 23 B -= 1 24 graph[A].append([B, C]) 25 graph[B].append([A, C]) 26 27ans = dijkstra(graph, N)[-1] 28if ans == float('inf'): 29 print(-1) 30else: 31 print(ans)
質問
慣れないながらheapを用いてダイクストラ法を実装してみました。テストケースを見ると一つの時間切れ(2000ms超え)を除けば全て正解でした。同じ頂点を何度もみないようにseen配列でそれを管理することで高速化を図ったり(しなかったり)したのですが、尚問題が解決しません。一体どのような箇所に注目して改善すればよろしいのでしょうか。素人質問にて恐縮ですが、お力添えいただける箇所がございましたら、ご教授のほど何卒よろしくお願い申し上げます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/07/29 15:53