優先度付きキューを使ったダイクストラ法を学んでいるのですが、キューを作成したあたりから理解が追いつかず困っています。
python
1def min_heapify(data, i): 2 left = 2 * i + 1 3 right = 2 * i + 2 4 min = i 5 if left < len(data) and data[i][0] > data[left][0]: 6 min = left 7 if right < len(data) and data[min][0] > data[right][0]: 8 min = right 9 if min != i: 10 data[i], data[min] = data[min], data[i] 11 min_heapify(data, min) 12```ヒープソートで、先頭の要素を最も小さい値にする工程なのだと、ここまでは自分なりに理解ができました。 13```python 14def dijkstra(edges, num_v): 15 dist = [float('inf')] * num_v 16 dist[0] = 0 17 q = [[0, 0]] 18```各頂点に∞を入れて、最初の頂点までのコストは0にしている。 19キューを作成して[0, 0]を入れた。 20という認識です。 21 22```python 23 while len(q) > 0: 24 # キューから最小の要素を取り出し 25 q[0], q[-1] = q[-1], q[0] 26 _, u = q.pop() 27 # キューを再構成 28 min_heapify(q, 0) 29 # 各辺に対してコストを調べる 30 for i in edges[u]: 31 if dist[i[0]] > dist[u] + i[1]: 32 dist[i[0]] = dist[u] + i[1] 33 q.append([dist[u] + i[1], i[0]]) 34 j = len(q) - 1 35 while (j > 0) and (q[(j - 1) // 2] > q[j]): 36 q[(j - 1) // 2], q[j] = q[j], q[(j - 1) // 2] 37 j = (j - 1) // 2 38 39 return dist 40 41edges = [ 42 [[1, 4], [2, 3]], 43 [[2, 1], [3, 1], [4, 5]], 44 [[5, 2]], 45 [[4, 3]], 46 [[6, 2]], 47 [[4, 1], [6, 4]], 48 [] 49] 50print(dijkstra(edges, 7)) 51```ここからわからなくなってしまいました。 52qに何か数字が残っていた場合、キューから最小の要素を取り出し、各辺に対してコストを調べる、と書かれていますが、いまいち流れが掴めません。 53具体的な数字を入れて説明していただけると、大変ありがたいです。 54よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー