www.wikidata.de-de.nina.az
Der Algorithmus von Dijkstra nach seinem Erfinder Edsger W Dijkstra ist ein Algorithmus aus der Klasse der Greedy Algorithmen 1 und lost das Problem der kurzesten Pfade fur einen gegebenen Startknoten Er berechnet somit einen kurzesten Pfad zwischen dem gegebenen Startknoten und einem der oder allen ubrigen Knoten in einem kantengewichteten Graphen sofern dieser keine Negativkanten enthalt Animation des Dijkstra AlgorithmusAnimation des Dijkstra Algorithmus Die roten Kanten bilden kurzeste Wege vom Startknoten Die blaue Kante gibt an fur welchen Knoten der Abstand zum Startknoten gepruft wird Fur unzusammenhangende ungerichtete Graphen ist der Abstand zu denjenigen Knoten unendlich zu denen kein Pfad vom Startknoten aus existiert Dasselbe gilt auch fur gerichtete nicht stark zusammenhangende Graphen Dabei wird der Abstand synonym auch als Entfernung Kosten oder Gewicht bezeichnet Inhaltsverzeichnis 1 Algorithmus 1 1 Informelle Darstellung 1 2 Algorithmus in Pseudocode 1 3 Implementierung 2 Programmierung 3 Beispiel mit bekanntem Zielknoten 4 Grundlegende Konzepte und Verwandtschaften 5 Berechnung eines Spannbaumes 6 Zeitkomplexitat 7 Anwendungen 8 Andere Verfahren zur Berechnung kurzester Pfade 9 Literatur 10 Weblinks 11 EinzelnachweiseAlgorithmus BearbeitenInformelle Darstellung Bearbeiten Die Grundidee des Algorithmus ist es immer derjenigen Kante zu folgen die den kurzesten Streckenabschnitt vom Startknoten aus verspricht Andere Kanten werden erst dann verfolgt wenn alle kurzeren Streckenabschnitte auch uber andere Knoten hinaus beachtet wurden Dieses Vorgehen gewahrleistet dass bei Erreichen eines Knotens kein kurzerer Pfad zu ihm existieren kann Eine einmal berechnete Distanz zwischen dem Startknoten und einem besuchten Knoten wird gespeichert Die aufsummierten Distanzen zu noch nicht abgearbeiteten Knoten konnen sich hingegen im Laufe des Algorithmus durchaus verandern namlich verringern Dieses Vorgehen wird fortgesetzt bis die Distanz des Zielknotens berechnet wurde single pair shortest path oder die Distanzen aller Knoten zum Startknoten bekannt sind single source shortest path nbsp Berechnung der kurzesten Wege zum linken KnotenDer Algorithmus lasst sich durch die folgenden Schritte beschreiben Es werden sowohl die kurzesten aufsummierten Wegstrecken als auch deren Knotenfolgen berechnet Weise allen Knoten die beiden Eigenschaften Attribute Distanz und Vorganger zu Initialisiere die Distanz im Startknoten mit 0 und in allen anderen Knoten mit displaystyle infty nbsp Solange es noch unbesuchte Knoten gibt wahle darunter denjenigen mit minimaler aufsummierter Distanz aus und Speichere dass dieser Knoten schon besucht wurde Berechne fur alle noch unbesuchten Nachbarknoten die Gesamtdistanz uber die Summe des jeweiligen Kantengewichtes und der bereits berechneten Distanz vom Startknoten zum aktuellen Knoten Ist dieser Wert fur einen Knoten kleiner als die dort gespeicherte Distanz aktualisiere sie und setze den aktuellen Knoten als Vorganger Dieser Schritt wird auch als Update oder Relaxation Relaxierung bezeichnet In dieser Form berechnet der Algorithmus ausgehend von einem Startknoten die kurzesten Wege zu allen anderen Knoten Ist man dagegen nur an dem Weg zu einem ganz bestimmten Knoten interessiert so kann man in Schritt 2 schon abbrechen wenn der gesuchte Knoten der aktive ist nbsp Negative Kantengewichte konnen zu nicht optimalen Losungen fuhren Aufgrund der Eigenschaft einmal festgelegte Distanzen zum Startknoten nicht mehr zu verandern gehort der Dijkstra Algorithmus zu den Greedy Algorithmen die in jedem Schritt die momentan aussichtsreichste Teillosung bevorzugen Anders als manche andere Greedy Algorithmen berechnet der Dijkstra Algorithmus jedoch stets eine optimale Losung Diese Eigenschaft basiert auf der Annahme dass die kurzesten Teilstrecken zwischen Knoten in einem Pfad zusammen die kurzeste Strecke auf diesem Pfad bilden Unter der Voraussetzung positiver Kantengewichte ist die Annahme gultig denn fande man nachtraglich einen kurzeren Weg vom Startknoten zu einem Zielknoten hatte man auch dessen kurzere Teilstrecke fruher untersuchen mussen um den Algorithmus korrekt durchzufuhren Dann hatte man aber uber die kurzere Teilstrecke den Zielknoten fruher gefunden als auf dem langeren Weg Die Annahme trifft jedoch nicht mehr zu wenn der Graph negative Kantengewichte enthalt Dann kann jede Teilstrecke fur sich zwar eine kurzeste Strecke zwischen den Endpunkten sein man konnte jedoch uber einen langeren Teilweg die Gesamtdistanz verbessern wenn eine negative Kante die Weglange wieder reduziert Im Bild mit den Knoten 1 2 3 und 4 wurde der Dijkstra Algorithmus den kurzesten Weg von 1 nach 3 uber 2 finden da der Schritt zu 4 insgesamt schon langer ist als der gesamte obere Pfad Die negative Kante bewirkt aber dass der untere Pfad kurzer ist Algorithmus in Pseudocode Bearbeiten Die folgenden Zeilen Pseudocode beschreiben eine Funktion namens Dijkstra die einen Graphen und einen Startknoten im Graphen als Eingabe erhalt Der Startknoten gibt den Knoten an von dem aus die kurzesten Wege zu allen Knoten gesucht werden Das Ergebnis ist eine Liste die zu jedem Knoten v den Vorgangerknoten auf dem Weg vom Startknoten zu v angibt Der Graph besteht aus Knoten und gewichteten Kanten wobei das Gewicht die Entfernung zwischen den Knoten darstellt Existiert eine Kante zwischen zwei Knoten so sind die Knoten jeweils Nachbarn Der aktuell im Teilschritt betrachtete Knoten wird mit u bezeichnet und wird Betrachtungsknoten genannt Die moglichen kommenden Nachbarknoten werden in der jeweiligen kommenden Zwischenuntersuchung mit jeweils v als Prufknoten bezeichnet Das Kantengewicht zwischen Betrachtungsknoten u und jeweiligen Prufknoten v wird im Pseudocode als abstand zwischen u v angegeben Der Zahlenwert von abstand v enthalt in dem Untersuchungszweig die jeweilige Gesamtentfernung die die Teilentfernungen vom Startpunkt uber mogliche Zwischenknoten und den aktuellen Knoten u bis zum nachsten zu untersuchenden Knoten v summiert Zunachst werden abhangig vom Graphen und Startknoten die Abstande und Vorganger initialisiert Dies geschieht in der Methode initialisiere Der eigentliche Algorithmus verwendet eine Methode distanz update die ein Update der Abstande durchfuhrt falls ein kurzerer Weg gefunden wurde 1 Funktion Dijkstra Graph Startknoten 2 initialisiere Graph Startknoten abstand vorganger Q 3 solange Q nicht leer Der eigentliche Algorithmus 4 u Knoten in Q mit kleinstem Wert in abstand 5 entferne u aus Q furuist der kurzeste Weg nun bestimmt 6 fur jeden Nachbarn v von u 7 falls v in Q falls noch nicht berechnet 8 distanz update u v abstand vorganger prufe Abstand vom Startknoten zuv 9 return vorganger Die Initialisierung setzt die Abstande auf unendlich und die Vorganger als unbekannt Nur der Startknoten hat die Distanz 0 Die Menge Q enthalt die Knoten zu denen noch kein kurzester Weg gefunden wurde 1 Methode initialisiere Graph Startknoten abstand vorganger Q 2 fur jeden Knoten v in Graph 3 abstand v unendlich 4 vorganger v null 5 abstand Startknoten 0 6 Q Alle Knoten in Graph Der Abstand vom Startknoten zum Knoten v verkurzt sich dann wenn der Weg zu v uber u kurzer als der bisher bekannte Weg ist Entsprechend wird u zum Vorganger von v auf dem kurzesten Weg 1 Methode distanz update u v abstand vorganger 2 alternativ abstand u abstand zwischen u v Weglange vom Startknoten nach v uber u 3 falls alternativ lt abstand v 4 abstand v alternativ 5 vorganger v u Falls man nur am kurzesten Weg zwischen zwei Knoten interessiert ist kann man den Algorithmus nach Zeile 5 der Dijkstra Funktion abbrechen lassen falls u Zielknoten ist Den kurzesten Weg zu einem Zielknoten kann man nun durch Iteration uber die vorganger ermitteln 1 Funktion erstelleKurzestenPfad Zielknoten vorganger 2 Weg Zielknoten 3 u Zielknoten 4 solange vorganger u nicht null Der Vorganger des Startknotens ist null 5 u vorganger u 6 fuge u am Anfang von Weg ein 7 return Weg Implementierung Bearbeiten Knoten und Kanten zwischen Knoten lassen sich meistens durch Matrizen oder Zeigerstrukturen darstellen Auch auf den Vorganger eines Knotens kann ein Zeiger verweisen Die Abstande der Knoten konnen in Feldern gespeichert werden Fur eine effiziente Implementierung wird die Menge Q der Knoten fur die noch kein kurzester Weg gefunden wurde durch eine Prioritatswarteschlange implementiert Die aufwandige Initialisierung findet nur einmal statt dafur sind die wiederholten Zugriffe auf Q effizienter Als Schlusselwert fur den Knoten wird sein jeweiliger Abstand verwendet der im Pseudocode mit abstand v angegeben ist Verkurzt sich der Abstand ist eine teilweise Neusortierung der Warteschlange notig Als Datenstruktur bietet sich hierfur eine Entfernungstabelle oder eine Adjazenzmatrix an Programmierung BearbeitenDas folgende Beispiel in der Programmiersprache C zeigt die Implementierung des Dijkstra Algorithmus fur einen ungerichteten Graphen der als Adjazenzliste gespeichert wird Bei der Ausfuhrung des Programms wird die Funktion main verwendet die einen kurzesten Weg auf der Konsole ausgibt 2 3 Code Schnipsel include lt iostream gt include lt limits gt include lt vector gt include lt list gt include lt set gt include lt map gt include lt algorithm gt include lt iterator gt include lt string gt using namespace std const double maximumWeight numeric limits lt double gt infinity Konstante fur das maximale Gewicht Datentyp der die Nachbarknoten eines Knotens definiert struct neighbor int targetIndex Index des Zielknotens string name Name des double weight Gewicht der Kante neighbor int target string name double weight targetIndex target name name weight weight Berechnet die kurzesten Wege fur den Knoten mit startIndex Der gerichtete Graph wird als Adjazenzliste ubergeben auto ComputeShortestPathsByDijkstra int startIndex const vector lt vector lt neighbor gt gt amp adjacencyList struct result vector lt double gt minimumDistances vector lt int gt previousVertices map lt int string gt vertexNames auto numberOfVertices adjacencyList size auto minimumDistances vector numberOfVertices maximumWeight auto previousVertices vector numberOfVertices 1 auto vertexNames map make pair startIndex s auto vertexQueue set make pair 0 0 startIndex minimumDistances startIndex 0 while vertexQueue empty Solange die Warteschlange nicht leer ist auto distance vertexQueue begin gt first Abstand auto index vertexQueue begin gt second vertexQueue erase vertexQueue begin Entfernt den ersten Knoten der Warteschlange const vector lt neighbor gt amp neighbors adjacencyList index Diese for Schleife durchlauft alle Nachbarn des Knoten mit index for const auto amp neighborIterator neighbors auto targetIndex neighborIterator targetIndex Index des Nachbarknotens auto name neighborIterator name Name des Nachbarknotens auto weight neighborIterator weight Abstand zum Nachbarknoten auto currentDistance distance weight Abstand vom Startknoten zum Knoten mit index if currentDistance lt minimumDistances targetIndex Wenn der Abstand zum Nachbarknoten kleiner als die Lange des bisher kurzesten Wegs ist vertexQueue erase make pair minimumDistances targetIndex targetIndex Entfernt den Knoten aus der Warteschlange vertexNames erase targetIndex Entfernt den Namen des Knotens aus der Zuordnungstabelle minimumDistances targetIndex currentDistance Speichert den Abstand vom Startknoten previousVertices targetIndex index Speichert den Index des Vorgangerknotens vertexQueue insert make pair minimumDistances targetIndex targetIndex Fugt den Knoten der Warteschlange hinzu vertexNames insert make pair targetIndex name Fugt den Namen des Knotens der Zuordnungstabelle hinzu return result minimumDistances previousVertices vertexNames Gibt einen kurzesten Weg fur den Knoten mit index zuruck auto GetShortestPathTo int index const vector lt int gt amp previousVertices const map lt int string gt amp vertexNames list lt string gt path for index 1 index previousVertices index Diese for Schleife durchlauft den Weg path push front vertexNames at index Fugt den Namen des Vorgangerknotens hinzu return path Hauptfunktion die das Programm ausfuhrt int main Initialisiert die Adjazenzliste des gerichteten Graphen mit 6 Knoten vector lt vector lt neighbor gt gt adjacencyList 6 adjacencyList 0 push back neighbor 1 Knoten 1 7 adjacencyList 0 push back neighbor 2 Knoten 2 9 adjacencyList 0 push back neighbor 5 Knoten 5 14 adjacencyList 1 push back neighbor 0 Knoten 0 7 adjacencyList 1 push back neighbor 2 Knoten 2 10 adjacencyList 1 push back neighbor 3 Knoten 3 15 adjacencyList 2 push back neighbor 0 Knoten 0 9 adjacencyList 2 push back neighbor 1 Knoten 1 10 adjacencyList 2 push back neighbor 3 Knoten 3 11 adjacencyList 2 push back neighbor 5 Knoten 5 2 adjacencyList 3 push back neighbor 1 Knoten 1 15 adjacencyList 3 push back neighbor 2 Knoten 2 11 adjacencyList 3 push back neighbor 4 Knoten 4 6 adjacencyList 4 push back neighbor 3 Knoten 3 6 adjacencyList 4 push back neighbor 5 Knoten 5 9 adjacencyList 5 push back neighbor 0 Knoten 0 14 adjacencyList 5 push back neighbor 2 Knoten 2 2 adjacencyList 5 push back neighbor 4 Knoten 4 9 auto minimumDistances previousVertices vertexNames ComputeShortestPathsByDijkstra 0 adjacencyList Aufruf der Methode die die kurzesten Wege fur den Knoten 0 zuruckgibt cout lt lt Abstand von Knoten 0 nach Knoten 4 lt lt minimumDistances 4 lt lt endl Ausgabe auf der Konsole auto path GetShortestPathTo 4 previousVertices vertexNames Aufruf der Methode die einen kurzesten Weg von Knoten 0 nach Knoten 4 zuruckgibt cout lt lt Kurzester Weg Ausgabe auf der Konsole copy path begin path end ostream iterator lt string gt cout Ausgabe auf der Konsole cout lt lt endl Ausgabe auf der Konsole Beispiel mit bekanntem Zielknoten BearbeitenEin Beispiel fur die Anwendung des Algorithmus von Dijkstra ist die Suche nach einem kurzesten Pfad auf einer Landkarte 4 Im hier verwendeten Beispiel will man in der unten gezeigten Landkarte von Deutschland einen kurzesten Pfad von Frankfurt nach Munchen finden Die Zahlen auf den Verbindungen zwischen zwei Stadten geben jeweils die Entfernung zwischen den beiden durch die Kante verbundenen Stadten an Die Zahlen hinter den Stadtenamen geben die ermittelte Distanz der Stadt zum Startknoten Frankfurt an steht dabei fur eine unbekannte Distanz Die hellgrau unterlegten Knoten sind die Knoten deren Abstand relaxiert wird also verkurzt wird falls eine kurzere Strecke gefunden wurde die dunkelgrau unterlegten Knoten sind diejenigen zu denen der kurzeste Weg von Frankfurt bereits bekannt ist Die Auswahl des nachsten Nachbarn erfolgt nach dem Prinzip einer Prioritatswarteschlange Relaxierte Abstande erfordern daher eine Neusortierung Beispiel nbsp Ausgangssituation Nicht initialisierter Graph mit Startknoten Frankfurt und Zielknoten Munchen nbsp Entfernungen vom Startknoten Frankfurt ermitteln Relaxierung Neusortieren der Prioritatswarteschlange Q 1 Mannheim 2 Kassel 3 Wurzburg nbsp Mannheim ist der nachstliegende Knoten Relaxierung mit dem Nachbarknoten Karlsruhe nachster Vorganger von Karlsruhe ist nun Mannheim Neusortieren von Q 1 Karlsruhe 2 Kassel 3 Wurzburg nbsp Dem Startpunkt nachstliegender zu untersuchender Knoten laut Q ist nun Karlsruhe Relaxierung mit Augsburg Neusortieren von Q 1 Kassel 2 Wurzburg 3 Augsburg nbsp Nachstliegender zu untersuchender Knoten ist nun Kassel Relaxierung mit Munchen Neusortieren von Q 1 Wurzburg 2 Augsburg 3 Munchen nbsp Nachstliegender zu untersuchender Knoten ist nun Wurzburg Relaxierung mit Erfurt und Nurnberg Neusortieren von Q 1 Nurnberg 2 Erfurt 3 Augsburg 4 Munchen nbsp Nachstliegender zu untersuchender Knoten ist nun Nurnberg Relaxierung mit Munchen und Stuttgart Neusortieren von Q 1 Erfurt 2 Augsburg 3 Munchen 4 Stuttgart nbsp Nachstliegender zu untersuchender Knoten ist nun Erfurt Relaxierung mit niemandem Neusortieren von Q 1 Augsburg 2 Munchen 3 Stuttgart nbsp Nachstliegender zu untersuchender Knoten ist nun Augsburg Relaxierung mit Munchen Neusortieren von Q 1 Munchen 2 Stuttgart nbsp Zielknoten soll untersucht werden Kurzester Weg nach Munchen ist nun bekannt Rekonstruktion mittels erstelleKurzestenPfad Dieser ist Frankfurt Wurzburg Nurnberg Munchen Grundlegende Konzepte und Verwandtschaften BearbeitenEin alternativer Algorithmus zur Suche kurzester Pfade der sich dagegen auf das Optimalitatsprinzip von Bellman stutzt ist der Floyd Warshall Algorithmus Das Optimalitatsprinzip besagt dass wenn der kurzeste Pfad von A nach C uber B fuhrt der Teilpfad A B auch der kurzeste Pfad von A nach B sein muss Ein weiterer alternativer Algorithmus ist der A Algorithmus der den Algorithmus von Dijkstra um eine Abschatzfunktion erweitert Falls diese gewisse Eigenschaften erfullt kann damit der kurzeste Pfad unter Umstanden schneller gefunden werden Es gibt verschiedene Beschleunigungstechniken fur den Dijkstra Algorithmus zum Beispiel Arcflag Berechnung eines Spannbaumes Bearbeiten nbsp Ein Graph bei dem der durch den Dijkstra Algorithmus startend in s berechnete Spannbaum kein minimaler Spannbaum des Graphen ist Nach Ende des Algorithmus ist in den Vorgangerzeigern p ein Teil Spannbaum der Komponente von s displaystyle s nbsp aus kurzesten Pfaden von s displaystyle s nbsp zu allen Knoten der Komponente die in die Queue aufgenommen wurden verzeichnet Dieser Baum ist jedoch nicht notwendigerweise auch minimal wie die Abbildung zeigt Sei x displaystyle x nbsp eine Zahl grosser 0 Minimal spannende Baume sind entweder durch die Kanten a s displaystyle left a s right nbsp und a b displaystyle left a b right nbsp oder b s displaystyle left b s right nbsp und a b displaystyle left a b right nbsp gegeben Die Gesamtkosten eines minimal spannenden Baumes betragen 2 x displaystyle 2 x nbsp Dijkstras Algorithmus liefert mit Startpunkt s displaystyle s nbsp die Kanten a s displaystyle left a s right nbsp und b s displaystyle left b s right nbsp als Ergebnis Die Gesamtkosten dieses spannenden Baumes betragen 2 2 x displaystyle 2 2x nbsp Die Berechnung eines minimalen Spannbaumes ist mit dem Algorithmus von Prim oder dem Algorithmus von Kruskal moglich Zeitkomplexitat BearbeitenDie folgende Abschatzung gilt nur fur Graphen die keine negativen Kantengewichte enthalten Die Laufzeit des Dijkstra Algorithmus hangt ab von der Anzahl der Kanten E displaystyle E nbsp und der Anzahl der Knoten V displaystyle V nbsp Die genaue Zeitkomplexitat hangt von der Datenstruktur Q displaystyle Q nbsp ab in der die Knoten gespeichert werden Fur alle Implementierungen von Q displaystyle Q nbsp gilt O E T d k V T e m displaystyle O E cdot T mathrm dk V cdot T mathrm em nbsp wobei T d k displaystyle T mathrm dk nbsp und T e m displaystyle T mathrm em nbsp fur die Komplexitat der decrease key und extract minimum Operationen bei Q displaystyle Q nbsp stehen Die einfachste Implementierung fur Q displaystyle Q nbsp ist eine Liste oder ein Array Dabei ist die Zeitkomplexitat O E V 2 O V 2 displaystyle O E V 2 O V 2 nbsp Im Normalfall wird man hier auf eine Vorrangwarteschlange zuruckgreifen indem man dort die Knoten als Elemente mit ihrer jeweiligen bisherigen Distanz als Schlussel Prioritat verwendet Die optimale Laufzeit fur einen Graphen G V E displaystyle G V E nbsp betragt O V log V E displaystyle O V log V E nbsp mittels Verwendung eines Fibonacci Heaps fur den Dijkstra Algorithmus 5 Anwendungen BearbeitenRoutenplaner sind ein prominentes Beispiel bei dem dieser Algorithmus eingesetzt werden kann Der Graph reprasentiert hier das Verkehrswegenetz das verschiedene Punkte miteinander verbindet Gesucht ist die kurzeste Route zwischen zwei Punkten Einige topologische Indizes etwa der J Index von Balaban benotigen gewichtete Distanzen zwischen den Atomen eines Molekuls Die Gewichtung ist in diesen Fallen die Bindungsordnung Dijkstras Algorithmus wird auch im Internet als Routing Algorithmus im OSPF IS IS und OLSR Protokoll eingesetzt Das letztere Optimized Link State Routing Protokoll ist eine an die Anforderungen eines mobilen drahtlosen LANs angepasste Version des Link State Routing Es ist wichtig fur mobile Ad hoc Netze Eine mogliche Anwendung davon sind die freien Funknetze Auch bei der Losung des Munzproblems eines zahlentheoretischen Problems das auf den ersten Blick nichts mit Graphen zu tun hat kann der Dijkstra Algorithmus eingesetzt werden Andere Verfahren zur Berechnung kurzester Pfade BearbeitenHat man genug Informationen uber die Kantengewichte im Graphen um daraus eine Heuristik fur die Kosten einzelner Knoten ableiten zu konnen ist es moglich den Algorithmus von Dijkstra zum A Algorithmus zu erweitern Um alle kurzesten Pfade von einem Knoten zu allen anderen Knoten in einem Graphen zu berechnen kann man auch den Bellman Ford Algorithmus verwenden der mit negativen Kantengewichten umgehen kann Der Algorithmus von Floyd und Warshall berechnet schliesslich die kurzesten Pfade aller Knoten zueinander Literatur BearbeitenThomas H Cormen Charles E Leiserson Ronald L Rivest Clifford Stein Algorithmen eine Einfuhrung Oldenbourg Munchen Wien 2004 ISBN 3 486 27515 1 S 598 604 englisch Introduction to algorithms Ubersetzt von Karen Lippert Micaela Krieger Hauwede Robert Sedgewick Algorithms in C Part 5 Graph Algorithms Indianapolis 2002 ISBN 0 201 36118 3 S 293 302 Edsger W Dijkstra A note on two problems in connexion with graphs In Numerische Mathematik 1 1959 S 269 271 ma tum de PDF 739 kB Weblinks Bearbeiten nbsp Commons Algorithmus von Dijkstra Album mit Bildern Videos und Audiodateien nbsp Wikibooks Dijkstra Algorithmus Implementierungen in der Algorithmensammlung Python Implementierung mit Erklarungen Implementierung in der freien Python Bibliothek NetworkX Interaktives Applet zur Lernen Ausprobieren und Demonstrieren des Algorithmus Interaktive Visualisierung und Animation von Dijkstras Algorithmus geeignet fur Personen ohne Vorkenntnisse von Algorithmen englisch Implementierung in C englisch Erklarung anhand eines analogen Modells PDF 213 kB Offentliche Softwarebibliothek in Java mit diesem und anderen Algorithmen englisch Java Implementierung Simulation Auswertung englisch Dijkstra Algorithmus in C csharp Memento vom 11 Februar 2013 im Webarchiv archive today Einzelnachweise Bearbeiten Tobias Haberlein Praktische Algorithmik mit Python Oldenbourg Munchen 2012 ISBN 978 3 486 71390 9 S 162 ff Rosetta Code Dijkstra s algorithm GeeksforGeeks Dijkstra s shortest path algorithm The Simple Elegant Algorithm That Makes Google Maps Possible Bei VICE Abgerufen am 3 Oktober 2020 Thomas H Cormen Introduction to Algorithms MIT Press S 663 Abgerufen von https de wikipedia org w index php title Dijkstra Algorithmus amp oldid 237355561