Lemma: (Idee)
Führt ein kürzester Pfad von über nach ,
so sind die beiden Teilpfade bis sowie bis ebenfalls kürzeste Pfade.
Algorithmus:
Der Algorithmus von Dijkstra löst das SSSP-Problem, folgende Initialisierung:
- : Liste der Knoten mit bekanntem kürzesten Weg vom Startknoten , zu Beginn
- : Gewicht (Entfernung von ) an jedem Knoten , zu Beginn je
- : Vorgängerknoten auf dem kürzesten Weg von nach
Zunächst wird ein fertiger Knoten mit minimalem Gewicht (Prioritätswarteschlange) gewählt.
Für alle Nachbarn von wird deren Gewicht herabgesetzt, wenn
(also der Weg über ) kleiner ist.
Außerdem wird dann festgehalten und in aufgenommen. Dann ist erneut das minimale zu wählen,
bis der Zielknoten erreicht oder alle Knoten in sind. Kürzester Weg ist dann
.
Komplexität:
Der Algorithmus von Dijkstra benötigt für Knoten und Kanten die Zeit , wenn alle Operationen
der Prioritätswarteschlange in Zeit ausführbar sind. Es werden bis zu je ExtractMin und Insert,
und bis zu DecreaseKey Aufrufe benötigt:
- mit Fibonacci Heap:
- mit -level Buckets:
- mit Radix Heaps:
Bemerkungen:
- Es lässt sich zeigen, dass das SSSP-Problem in Zeit lösbar ist [Thorup].
- Der Algorithmus von Dijkstra funktioniert a priori nur auf positiven Kantengewichten.
Bei negativen Gewichten ist eine Rekalibrierung [Johnson] nötig:
es wird ein zusätzlicher Knoten eingefügt und mit allen Knoten über Kantengewicht 0
verbunden, dann über Bellmann-Ford der negativste Pfad von zu irgendeinem bestimmt und alle Kanten um
erhöht/angepasst (sinnvoll nur für APSP).
- Anwendung eines optimalen SSSP-Algorithmus löst das APSP-Problem in