Der Dijkstra-Algorithmus findet kürzeste Wege von einem Startknoten in einem gewichteten Graphen, solange jedes Kantengewicht nichtnegativ ist. Wenn dich nur ein bestimmtes Ziel interessiert, kannst du aufhören, sobald dieser Zielknoten abgeschlossen ist.
Der zentrale Schritt ist gierig: Man macht immer beim noch nicht abgeschlossenen Knoten mit der kleinsten bekannten Distanz weiter. Das funktioniert nur unter der Bedingung, dass alle Gewichte nichtnegativ sind.
Was der Dijkstra-Algorithmus löst
Verwende den Dijkstra-Algorithmus, wenn du einen Graphen mit Kosten auf den Kanten hast und die billigste Route finden willst. Die Kosten können Entfernung, Reisezeit, Energie oder eine andere Größe darstellen, die du minimieren möchtest.
Er funktioniert auf gerichteten und ungerichteten Graphen. Die entscheidende Bedingung ist klar: Jedes Kantengewicht muss mindestens sein.
Wie der Algorithmus funktioniert
Jeder Knoten speichert eine vorläufige Distanz vom Startknoten. Am Anfang hat der Startknoten die Distanz und jeder andere Knoten die Distanz .
Dann wird diese Schleife wiederholt:
- Wähle den noch nicht abgeschlossenen Knoten mit der kleinsten vorläufigen Distanz.
- Prüfe jeden Nachbarn über diesen Knoten.
- Wenn die neue Route günstiger ist, aktualisiere die Distanz des Nachbarn.
- Markiere den aktuellen Knoten als abgeschlossen.
Schritt 3 heißt Relaxation. Ein abgeschlossener Knoten ist fertig: Seine kürzeste Distanz steht endgültig fest, vorausgesetzt, der Graph hat keine negativen Kantengewichte.
Dijkstra-Algorithmus Schritt für Schritt
Hier ist das vollständige Verfahren in kompakter Form:
- Wähle einen Startknoten.
- Setze seine Distanz auf und jede andere Distanz auf .
- Wähle den noch nicht abgeschlossenen Knoten mit der kleinsten vorläufigen Distanz.
- Entspanne seine ausgehenden Kanten.
- Markiere diesen Knoten als abgeschlossen.
- Wiederhole das Ganze, bis alle erreichbaren Knoten abgeschlossen sind, oder stoppe, sobald dein Zielknoten abgeschlossen ist.
Wenn du zusätzlich speicherst, welcher vorherige Knoten jede Aktualisierung verursacht hat, kannst du den tatsächlichen Pfad rekonstruieren und nicht nur die Enddistanz.
Durchgerechnetes Beispiel für den kürzesten Pfad
Angenommen, der Graph hat diese Kantengewichte:
Wir wollen den kürzesten Pfad von nach finden.
Starte mit:
Schließe zuerst ab und entspanne seine Kanten:
Die kleinste noch nicht abgeschlossene Distanz liegt jetzt bei , also schließen wir als Nächstes ab.
Über gilt:
- Über kostet der Pfad nach , das ist besser als , also aktualisieren wir .
- Über kostet der Pfad nach , also setzen wir .
Jetzt hat die kleinste noch nicht abgeschlossene Distanz, also schließen wir ab.
Über kostet der Pfad nach :
Das ist besser als , also aktualisieren wir von auf .
Jetzt ist der noch nicht abgeschlossene Knoten mit der kleinsten Distanz. Schließe ihn ab und stoppe.
Der kürzeste Pfad ist:
mit Gesamtkosten:
Dieses Beispiel zeigt das zentrale Muster: Eine Route, die zuerst schlechter aussah, , wurde später über besser. Der Dijkstra-Algorithmus erlaubt das, solange noch nicht abgeschlossen ist. Sobald ein Knoten abgeschlossen ist, ändert sich seine Distanz nicht mehr.
Warum nichtnegative Gewichte wichtig sind
Angenommen, der aktuell billigste noch nicht abgeschlossene Knoten hat die Distanz . Jeder neue Pfad zu diesem Knoten, der erst später gefunden wird, müsste von einem anderen noch nicht abgeschlossenen Knoten kommen, dessen vorläufige Distanz mindestens ist, und dann noch eine Kante mit Gewicht mindestens hinzufügen.
Deshalb kann dieser spätere Weg nicht unterbieten. Genau darum ist es sicher, immer die kleinste vorläufige Distanz abzuschließen, wenn alle Gewichte nichtnegativ sind.
Falls es eine negative Kante gibt, bricht dieses Argument zusammen. Ein Pfad, der jetzt teuer aussieht, kann später billiger werden. Dann kann das zu frühe Abschließen eines Knotens zur falschen Antwort führen.
Häufige Fehler beim Dijkstra-Algorithmus
Verwendung bei einer negativen Kante
Schon eine einzige negative Kante kann die gierige Logik zerstören. Wenn negative Gewichte möglich sind, solltest du ein anderes Verfahren für kürzeste Pfade verwenden.
"Gesehen" mit "fertig" verwechseln
Ein Knoten kann bereits eine vorläufige Distanz haben und trotzdem noch nicht fertig sein. Nur ein abgeschlossener Knoten hat eine endgültige kürzeste Distanz.
Die Vorgängertabelle vergessen
Distanzen geben dir die Kosten. Wenn du auch die Route selbst haben willst, speichere, welcher Knoten zuletzt jede Distanz verbessert hat.
Wo der Dijkstra-Algorithmus verwendet wird
Der Dijkstra-Algorithmus wird verwendet, wenn sich ein Problem als Bewegung durch einen Graphen mit nichtnegativen Kosten modellieren lässt:
- Routenplanung auf Karten
- Netzwerk-Routing
- Roboterbewegung auf gewichteten Gittern
- Pfadsuche in Spielen, wenn sich Bewegungskosten unterscheiden
Er ist außerdem ein Standardbeispiel für einen gierigen Algorithmus, dessen Korrektheit von einer präzisen Bedingung abhängt.
Probiere ein ähnliches Problem
Zeichne einen Graphen mit fünf Knoten und positiven Kantengewichten und führe den Dijkstra-Algorithmus von Hand mit einer Distanztabelle aus. Wenn du einen guten nächsten Schritt suchst, probiere deine eigene Variante auf einem neuen Graphen aus und prüfe genau, wann jeder Knoten sicher abgeschlossen werden kann.
Brauchst du Hilfe bei einer Aufgabe?
Lade deine Frage hoch und erhalte in Sekunden eine verifizierte Schritt-für-Schritt-Lösung.
GPAI Solver öffnen →