Gestern habe ich [Primfaktorisierung in 14 Zeilen] implementiert (https://qiita.com/nontan18/items/167ab2f44340372174b7), aber heute habe ich die Dyxtra-Methode in 14 Zeilen mithilfe des Heaps implementiert. In 14 Zeilen von oben.
dijkstra.py
from heapq import heappush, heappop
def dijkstra(vertices_num, edges, src):
dist = [float('inf')] * vertices_num
heap = [(0, src)]
while len(heap):
d, from_ = heappop(heap)
if d < dist[from_]:
dist[from_] = d
for _, to, cost in filter(lambda e: e[0]==from_, edges):
heappush(heap, (min(dist[to], dist[from_] + cost), to))
return dist
if __name__ == '__main__':
answer = dijkstra(
8,
[
(0, 1, 5), (0, 2, 4), (0, 3, 1), (1, 4, 2), (1, 0, 5), (2, 0, 4), (2, 3, 2), (2, 4, 5),
(2, 5, 6), (3, 0, 1), (3, 2, 2), (4, 1, 2), (4, 2, 5), (4, 6, 1), (4, 7, 3), (5, 2, 6),
(5, 7, 2), (6, 4, 1), (6, 7, 4), (7, 4, 3), (7, 5, 2), (7, 6, 4)
], 0
)
print(answer) # [0, 5, 3, 1, 7, 9, 8, 10]
Das erste Argument ist die Anzahl der Eckpunkte, das zweite Argument ist eine Liste von (von_ bis, Kosten) und das dritte Argument ist der Index des Startpunkts. Der Rückgabewert gibt den kürzesten Abstand vom Startpunkt zu jedem Scheitelpunkt zurück.
https://www.youtube.com/watch?v=X1AsMlJdiok In Bezug auf die Dyxtra-Methode war die Erklärung in diesem Video sehr leicht zu verstehen, daher habe ich einen Testfall mit Bezug auf die dort behandelten Probleme erstellt. Rote Buchstaben sind die Indizes jedes Scheitelpunkts. (Quelle: Von der Youtube-Seite oben)
Recommended Posts