<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://demowiki.knowlus.com/index.php?action=history&amp;feed=atom&amp;title=Dijkstra-Algorithmus</id>
	<title>Dijkstra-Algorithmus - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://demowiki.knowlus.com/index.php?action=history&amp;feed=atom&amp;title=Dijkstra-Algorithmus"/>
	<link rel="alternate" type="text/html" href="https://demowiki.knowlus.com/index.php?title=Dijkstra-Algorithmus&amp;action=history"/>
	<updated>2026-05-14T22:09:48Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Demo Wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://demowiki.knowlus.com/index.php?title=Dijkstra-Algorithmus&amp;diff=9474&amp;oldid=prev</id>
		<title>imported&gt;Krdbot: Bot: Entferne 2 weiche Trennzeichen</title>
		<link rel="alternate" type="text/html" href="https://demowiki.knowlus.com/index.php?title=Dijkstra-Algorithmus&amp;diff=9474&amp;oldid=prev"/>
		<updated>2025-08-25T17:56:27Z</updated>

		<summary type="html">&lt;p&gt;Bot: Entferne 2 &lt;a href=&quot;/index.php?title=Weiches_Trennzeichen&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Weiches Trennzeichen (Seite nicht vorhanden)&quot;&gt;weiche Trennzeichen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Datei:Dijkstra Animation.gif|mini|[[Animation]] des Dijkstra-Algorithmus]]&lt;br /&gt;
[[Datei:DijkstraDemo.gif|mini|[[Animation]] des Dijkstra-Algorithmus. Die roten [[Kante (Graphentheorie)|Kanten]] bilden [[Kürzester Weg|kürzeste Wege]] vom Startknoten. Die blaue Kante gibt an, für welchen [[Knoten (Graphentheorie)|Knoten]] der [[Abstand (Graphentheorie)|Abstand]] zum Startknoten geprüft wird.]]&lt;br /&gt;
Der &amp;#039;&amp;#039;&amp;#039;Algorithmus von Dijkstra&amp;#039;&amp;#039;&amp;#039; (nach seinem Erfinder [[Edsger W. Dijkstra]]) ist ein [[Algorithmus]] aus der Klasse der [[Greedy-Algorithmus|Greedy-Algorithmen]]&amp;lt;ref&amp;gt;Tobias Häberlein: &amp;#039;&amp;#039;Praktische Algorithmik mit Python.&amp;#039;&amp;#039; Oldenbourg, München 2012, ISBN 978-3-486-71390-9, S. 162 ff.&amp;lt;/ref&amp;gt; und löst das Problem der [[Kürzester Pfad|kürzesten Pfade]] für einen gegebenen Startknoten. Er berechnet somit einen kürzesten Pfad zwischen dem gegebenen Startknoten und einem der (oder allen) übrigen Knoten in einem [[Kantengewichteter Graph|kantengewichteten Graphen]] (sofern dieser keine Negativkanten enthält).&lt;br /&gt;
&lt;br /&gt;
Für [[Zusammenhang von Graphen|unzusammenhängende]] [[Ungerichtete Kante|ungerichtete]] Graphen ist der Abstand zu denjenigen Knoten unendlich, zu denen kein Pfad vom Startknoten aus existiert. Dasselbe gilt auch für [[Gerichtete Kante|gerichtete]] nicht [[Stark zusammenhängender Graph|stark zusammenhängende Graphen]]. Dabei wird der Abstand synonym auch als Entfernung, Kosten oder Gewicht bezeichnet.&lt;br /&gt;
&lt;br /&gt;
== Algorithmus ==&lt;br /&gt;
=== Informelle Darstellung ===&lt;br /&gt;
Die Grundidee des Algorithmus ist es, immer derjenigen [[Kante (Graphentheorie)|Kante]] zu folgen, die den kürzesten Streckenabschnitt vom Startknoten aus verspricht. Andere Kanten werden erst dann verfolgt, wenn alle kürzeren Streckenabschnitte (auch über andere Knoten hinaus) beachtet wurden. Dieses Vorgehen gewährleistet, dass bei Erreichen eines [[Knoten (Graphentheorie)|Knotens]] kein kürzerer 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 können sich hingegen im Laufe des Algorithmus durchaus verändern, nämlich verringern. Dieses Vorgehen wird fortgesetzt, bis die Distanz des Zielknotens berechnet wurde (&amp;#039;&amp;#039;{{lang|en|single-pair shortest path}}&amp;#039;&amp;#039;) oder die Distanzen aller Knoten zum Startknoten bekannt sind (&amp;#039;&amp;#039;{{lang|en|single-source shortest path}}&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
[[Datei:Dijkstra&amp;#039;s algorithm.svg|mini|hochkant=0.6|Berechnung der [[Kürzester Weg|kürzesten Wege]] zum linken [[Knoten (Graphentheorie)|Knoten]]]]&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus lässt sich durch die folgenden Schritte beschreiben. Es werden sowohl die kürzesten (aufsummierten) Wegstrecken als auch deren Knotenfolgen berechnet.&lt;br /&gt;
&lt;br /&gt;
# Weise allen Knoten die beiden Eigenschaften (Attribute) „Distanz“ und „Vorgänger“ zu. Initialisiere die Distanz im Startknoten mit 0 und in allen anderen Knoten mit &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Solange es noch unbesuchte Knoten gibt, wähle darunter denjenigen mit minimaler (aufsummierter) Distanz aus und&lt;br /&gt;
## Speichere, dass dieser Knoten schon besucht wurde.&lt;br /&gt;
## Berechne für alle noch unbesuchten Nachbarknoten die Gesamtdistanz des Pfades über die Summe des jeweiligen Kantengewichtes und der bereits berechneten Distanz des Pfades vom Startknoten zum aktuellen Knoten.&lt;br /&gt;
## Ist dieser Wert für einen Knoten kleiner als die dort gespeicherte bisherige aufsummierte Distanz des Pfades, aktualisiere sie und setze den aktuellen Knoten als Vorgänger.&lt;br /&gt;
##: Dieser Schritt wird auch als &amp;#039;&amp;#039;Update&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;Relaxation/Relaxierung&amp;#039;&amp;#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
In dieser Form berechnet der Algorithmus ausgehend von einem Startknoten die kürzesten Wege zu allen anderen Knoten. Ist man dagegen nur an dem Weg zu einem ganz bestimmten Zielknoten interessiert, so kann man in Schritt (2) schon abbrechen, wenn der gesuchte Knoten der aktive ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Dijkstra-negative-edge-weights-error.svg|mini|Negative Kantengewichte können zu nicht-optimalen Lösungen führen.]]&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Eigenschaft, einmal festgelegte Distanzen zum Startknoten nicht mehr zu verändern, gehört der Dijkstra-Algorithmus zu den Greedy-Algorithmen, die in jedem Schritt die momentan aussichtsreichste Teillösung bevorzugen. Anders als manche andere Greedy-Algorithmen berechnet der Dijkstra-Algorithmus jedoch stets eine optimale Lösung. Diese Eigenschaft basiert auf der Annahme, dass die kürzesten Teilstrecken zwischen Knoten in einem Pfad zusammen die kürzeste Strecke auf diesem Pfad bilden. Unter der Voraussetzung positiver Kantengewichte ist die Annahme gültig, denn fände man nachträglich einen kürzeren Weg vom Startknoten zu einem Zielknoten, hätte man auch dessen kürzere Teilstrecke früher untersuchen müssen, um den Algorithmus korrekt durchzuführen. Dann hätte man aber über die kürzere Teilstrecke den Zielknoten früher gefunden als auf dem längeren Weg.&lt;br /&gt;
&lt;br /&gt;
Die Annahme trifft jedoch nicht mehr zu, wenn der Graph negative Kantengewichte enthält. Dann kann jede Teilstrecke für sich zwar eine kürzeste Strecke zwischen den Endpunkten sein, man könnte jedoch über einen längeren Teilweg die Gesamtdistanz verbessern, wenn eine negative Kante die Weglänge wieder reduziert. Im Bild mit den Knoten 1, 2, 3 und 4 würde der Dijkstra-Algorithmus den kürzesten Weg von 1 nach 3 über 2 finden, da der Schritt zu 4 insgesamt schon länger ist als der gesamte obere Pfad. Die negative Kante bewirkt aber, dass der untere Pfad kürzer ist.&lt;br /&gt;
&lt;br /&gt;
=== Algorithmus in Pseudocode ===&lt;br /&gt;
Die folgenden Zeilen Pseudocode beschreiben eine Funktion namens &amp;#039;&amp;#039;Dijkstra,&amp;#039;&amp;#039; die einen Graphen und einen Startknoten im Graphen als Eingabe erhält. Der Startknoten gibt den Knoten an, von dem aus die kürzesten Wege zu allen Knoten gesucht werden. Das Ergebnis ist eine Liste, die zu jedem Knoten &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; den Vorgängerknoten auf dem Weg vom Startknoten zu &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; angibt.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; bezeichnet und wird „Betrachtungsknoten“ genannt. Die möglichen, kommenden Nachbarknoten werden in der jeweiligen, kommenden Zwischenuntersuchung mit jeweils &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; als „Prüfknoten“ bezeichnet. Das Kantengewicht zwischen Betrachtungsknoten &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; und jeweiligen Prüfknoten &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; wird im Pseudocode als &amp;#039;&amp;#039;abstand_zwischen(u,v)&amp;#039;&amp;#039; angegeben.&lt;br /&gt;
&lt;br /&gt;
Der Zahlenwert von &amp;#039;&amp;#039;abstand[v]&amp;#039;&amp;#039; enthält in dem Untersuchungszweig die jeweilige Gesamtentfernung, die die Teilentfernungen vom Startpunkt über mögliche Zwischenknoten und den aktuellen Knoten &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; bis zum nächsten zu untersuchenden Knoten &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; summiert.&lt;br /&gt;
&lt;br /&gt;
Zunächst werden abhängig vom Graphen und Startknoten die Abstände und Vorgänger initialisiert. Dies geschieht in der Methode &amp;#039;&amp;#039;initialisiere&amp;#039;&amp;#039;. Der eigentliche Algorithmus verwendet eine Methode &amp;#039;&amp;#039;distanz_update&amp;#039;&amp;#039;, die ein Update der Abstände durchführt, falls ein kürzerer Weg gefunden wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
  1  Funktion Dijkstra(Graph, Startknoten):&lt;br /&gt;
  2      initialisiere(Graph,Startknoten,abstand[],vorgänger[],Q)&lt;br /&gt;
  3      solange Q nicht leer:                       // Der eigentliche Algorithmus&lt;br /&gt;
  4          u := Knoten in Q mit kleinstem Wert in abstand[]&lt;br /&gt;
  5          entferne u aus Q                        // für u ist der kürzeste Weg nun bestimmt&lt;br /&gt;
  6          für jeden Nachbarn v von u:&lt;br /&gt;
  7              falls v in Q:                       // falls noch nicht berechnet&lt;br /&gt;
  8                 distanz_update(u,v,abstand[],vorgänger[])   // prüfe Abstand vom Startknoten zu v&lt;br /&gt;
  9      return vorgänger[]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Initialisierung setzt die Abstände auf unendlich und die Vorgänger als unbekannt. Nur der Startknoten hat die Distanz&amp;amp;nbsp;0. Die Menge&amp;amp;nbsp;&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; enthält die Knoten, zu denen noch kein kürzester Weg gefunden wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
  1  Methode initialisiere(Graph,Startknoten,abstand[],vorgänger[],Q):&lt;br /&gt;
  2      für jeden Knoten v in Graph:&lt;br /&gt;
  3          abstand[v] := unendlich&lt;br /&gt;
  4          vorgänger[v] := null&lt;br /&gt;
  5      abstand[Startknoten] := 0&lt;br /&gt;
  6      Q := Alle Knoten in Graph&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Abstand vom Startknoten zum Knoten &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; verkürzt sich dann, wenn der Weg zu &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; über &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; kürzer als der bisher bekannte Weg ist. Entsprechend wird &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; zum Vorgänger von &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; auf dem kürzesten Weg.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
  1  Methode distanz_update(u,v,abstand[],vorgänger[]):&lt;br /&gt;
  2      alternativ := abstand[u] + abstand_zwischen(u, v)   // Weglänge vom Startknoten nach v über u&lt;br /&gt;
  3      falls alternativ &amp;lt; abstand[v]:&lt;br /&gt;
  4          abstand[v] := alternativ&lt;br /&gt;
  5          vorgänger[v] := u&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls man nur am kürzesten Weg zwischen zwei Knoten interessiert ist, kann man den Algorithmus nach Zeile&amp;amp;nbsp;5 der &amp;#039;&amp;#039;Dijkstra&amp;#039;&amp;#039;-Funktion abbrechen lassen, falls &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;&amp;amp;nbsp;=&amp;amp;nbsp;&amp;#039;&amp;#039;Zielknoten&amp;#039;&amp;#039; ist.&lt;br /&gt;
&lt;br /&gt;
Den kürzesten Weg zu einem &amp;#039;&amp;#039;Zielknoten&amp;#039;&amp;#039; kann man nun durch Iteration über die &amp;#039;&amp;#039;vorgänger&amp;#039;&amp;#039; ermitteln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 1  Funktion erstelleKürzestenPfad(Zielknoten,vorgänger[])&lt;br /&gt;
 2   Weg[] := [Zielknoten]&lt;br /&gt;
 3   u := Zielknoten&lt;br /&gt;
 4   solange vorgänger[u] nicht null:   // Der Vorgänger des Startknotens ist null&lt;br /&gt;
 5       u := vorgänger[u]&lt;br /&gt;
 6       füge u am Anfang von Weg[] ein&lt;br /&gt;
 7   return Weg[]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementierung ===&lt;br /&gt;
Knoten und Kanten zwischen Knoten lassen sich meistens durch [[Matrix (Mathematik)|Matrizen]] oder [[Zeiger (Informatik)|Zeigerstrukturen]] darstellen. Auch auf den Vorgänger eines Knotens kann ein Zeiger verweisen. Die Abstände der Knoten können in [[Feld (Datentyp)|Feldern]] gespeichert werden.&lt;br /&gt;
&lt;br /&gt;
Für eine effiziente Implementierung wird die Menge &amp;#039;&amp;#039;Q&amp;#039;&amp;#039; der Knoten, für die noch kein kürzester Weg gefunden wurde, durch eine [[Vorrangwarteschlange|Prioritätswarteschlange]] implementiert. Die aufwändige Initialisierung findet nur einmal statt, dafür sind die wiederholten Zugriffe auf &amp;#039;&amp;#039;Q&amp;#039;&amp;#039; effizienter. Als Schlüsselwert für den Knoten wird sein jeweiliger Abstand verwendet, der im Pseudocode mit &amp;#039;&amp;#039;abstand[v]&amp;#039;&amp;#039; angegeben ist. Verkürzt sich der Abstand, ist eine teilweise Neusortierung der Warteschlange nötig.&lt;br /&gt;
&lt;br /&gt;
Als Datenstruktur bietet sich hierfür eine [[Entfernungstabelle]] oder eine [[Adjazenzmatrix]] an.&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Das folgende Beispiel in der [[Programmiersprache]] [[C++]] zeigt die Implementierung des Dijkstra-Algorithmus für einen [[Ungerichteter Graph|ungerichteten Graphen]], der als [[Adjazenzliste]] gespeichert wird. Bei der Ausführung des Programms wird die [[Funktion (Informatik)|Funktion]] &amp;#039;&amp;#039;main&amp;#039;&amp;#039; verwendet, die einen [[Kürzester Weg|kürzesten Weg]] auf der Konsole ausgibt.&amp;lt;ref&amp;gt;Rosetta Code: [https://rosettacode.org/wiki/Dijkstra%27s_algorithm Dijkstra&amp;#039;s algorithm]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;GeeksforGeeks: [https://www.geeksforgeeks.org/dijkstras-shortest-path-algorithm-greedy-algo-7/ Dijkstra’s shortest path algorithm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable left mw-collapsible mw-collapsed font-size: 105.3%;&amp;quot;&lt;br /&gt;
|style=&amp;quot;text-align:left; font-size: 95%;&amp;quot;| &amp;#039;&amp;#039;&amp;#039;Code-Schnipsel&amp;#039;&amp;#039;&amp;#039;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;limits&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;list&amp;gt;&lt;br /&gt;
#include &amp;lt;set&amp;gt;&lt;br /&gt;
#include &amp;lt;map&amp;gt;&lt;br /&gt;
#include &amp;lt;algorithm&amp;gt;&lt;br /&gt;
#include &amp;lt;iterator&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
const double maximumWeight = numeric_limits&amp;lt;double&amp;gt;::infinity(); // Konstante für das maximale Gewicht&lt;br /&gt;
&lt;br /&gt;
// Datentyp, der die Nachbarknoten eines Knotens definiert&lt;br /&gt;
struct neighbor&lt;br /&gt;
{&lt;br /&gt;
    int targetIndex; // Index des Zielknotens&lt;br /&gt;
    string name; // Name des &lt;br /&gt;
    double weight; // Gewicht der Kante&lt;br /&gt;
    neighbor(int _target, string _name, double _weight) : targetIndex(_target), name(_name), weight(_weight) { }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Berechnet die kürzesten Wege für den Knoten mit startIndex. Der gerichtete Graph wird als Adjazenzliste übergeben.&lt;br /&gt;
auto ComputeShortestPathsByDijkstra(int startIndex, const vector&amp;lt;vector&amp;lt;neighbor&amp;gt;&amp;gt;&amp;amp; adjacencyList)&lt;br /&gt;
{&lt;br /&gt;
	struct result {&lt;br /&gt;
		vector&amp;lt;double&amp;gt; minimumDistances;&lt;br /&gt;
		vector&amp;lt;int&amp;gt; previousVertices;&lt;br /&gt;
		map&amp;lt;int, string&amp;gt; vertexNames;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	auto numberOfVertices = adjacencyList.size();&lt;br /&gt;
	auto minimumDistances = vector(numberOfVertices, maximumWeight);&lt;br /&gt;
	auto previousVertices = vector(numberOfVertices, -1);&lt;br /&gt;
    auto vertexNames = map{make_pair(startIndex, &amp;quot;&amp;quot;s)};&lt;br /&gt;
    auto vertexQueue = set{make_pair(0.0, startIndex)};&lt;br /&gt;
    minimumDistances[startIndex] = 0;&lt;br /&gt;
&lt;br /&gt;
    while (!vertexQueue.empty()) // Solange die Warteschlange nicht leer ist&lt;br /&gt;
    {&lt;br /&gt;
        auto distance = vertexQueue.begin()-&amp;gt;first; // Abstand&lt;br /&gt;
        auto index = vertexQueue.begin()-&amp;gt;second;&lt;br /&gt;
        vertexQueue.erase(vertexQueue.begin()); // Entfernt den ersten Knoten der Warteschlange&lt;br /&gt;
        const vector&amp;lt;neighbor&amp;gt;&amp;amp; neighbors {adjacencyList[index]};&lt;br /&gt;
        // Diese for-Schleife durchläuft alle Nachbarn des Knoten mit index&lt;br /&gt;
        for(const auto&amp;amp; neighborIterator : neighbors)&lt;br /&gt;
        {&lt;br /&gt;
            auto targetIndex = neighborIterator.targetIndex; // Index des Nachbarknotens&lt;br /&gt;
            auto name = neighborIterator.name; // Name des Nachbarknotens&lt;br /&gt;
            auto weight = neighborIterator.weight; // Abstand zum Nachbarknoten&lt;br /&gt;
            auto currentDistance = distance + weight; // Abstand vom Startknoten zum Knoten mit index&lt;br /&gt;
            if (currentDistance &amp;lt; minimumDistances[targetIndex]) // Wenn der Abstand zum Nachbarknoten kleiner als die Länge des bisher kürzesten Wegs ist&lt;br /&gt;
            {&lt;br /&gt;
                vertexQueue.erase(make_pair(minimumDistances[targetIndex], targetIndex)); // Entfernt den Knoten aus der Warteschlange&lt;br /&gt;
                vertexNames.erase(targetIndex); // Entfernt den Namen des Knotens aus der Zuordnungstabelle&lt;br /&gt;
                minimumDistances[targetIndex] = currentDistance; // Speichert den Abstand vom Startknoten&lt;br /&gt;
                previousVertices[targetIndex] = index; // Speichert den Index des Vorgängerknotens&lt;br /&gt;
                vertexQueue.insert(make_pair(minimumDistances[targetIndex], targetIndex)); // Fügt den Knoten der Warteschlange hinzu&lt;br /&gt;
                vertexNames.insert(make_pair(targetIndex, name)); // Fügt den Namen des Knotens der Zuordnungstabelle hinzu&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
	return result{minimumDistances, previousVertices, vertexNames};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Gibt einen kürzesten Weg für den Knoten mit index zurück&lt;br /&gt;
auto GetShortestPathTo(int index, const vector&amp;lt;int&amp;gt;&amp;amp; previousVertices, const map&amp;lt;int, string&amp;gt;&amp;amp; vertexNames)&lt;br /&gt;
{&lt;br /&gt;
    list&amp;lt;string&amp;gt; path;&lt;br /&gt;
    for (; index != -1; index = previousVertices[index]) // Diese for-Schleife durchläuft den Weg&lt;br /&gt;
    {&lt;br /&gt;
        path.push_front(vertexNames.at(index)); // Fügt den Namen des Vorgängerknotens hinzu&lt;br /&gt;
    }&lt;br /&gt;
    return path;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Hauptfunktion die das Programm ausführt&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    // Initialisiert die Adjazenzliste des gerichteten Graphen mit 6 Knoten&lt;br /&gt;
    vector&amp;lt;vector&amp;lt;neighbor&amp;gt;&amp;gt; adjacencyList(6);&lt;br /&gt;
&lt;br /&gt;
    adjacencyList[0].push_back(neighbor(1, &amp;quot;Knoten 1&amp;quot;, 7));&lt;br /&gt;
    adjacencyList[0].push_back(neighbor(2, &amp;quot;Knoten 2&amp;quot;, 9));&lt;br /&gt;
    adjacencyList[0].push_back(neighbor(5, &amp;quot;Knoten 5&amp;quot;, 14));&lt;br /&gt;
&lt;br /&gt;
    adjacencyList[1].push_back(neighbor(0, &amp;quot;Knoten 0&amp;quot;, 7));&lt;br /&gt;
    adjacencyList[1].push_back(neighbor(2, &amp;quot;Knoten 2&amp;quot;, 10));&lt;br /&gt;
    adjacencyList[1].push_back(neighbor(3, &amp;quot;Knoten 3&amp;quot;, 15));&lt;br /&gt;
&lt;br /&gt;
    adjacencyList[2].push_back(neighbor(0, &amp;quot;Knoten 0&amp;quot;, 9));&lt;br /&gt;
    adjacencyList[2].push_back(neighbor(1, &amp;quot;Knoten 1&amp;quot;, 10));&lt;br /&gt;
    adjacencyList[2].push_back(neighbor(3, &amp;quot;Knoten 3&amp;quot;, 11));&lt;br /&gt;
    adjacencyList[2].push_back(neighbor(5, &amp;quot;Knoten 5&amp;quot;, 2));&lt;br /&gt;
&lt;br /&gt;
    adjacencyList[3].push_back(neighbor(1, &amp;quot;Knoten 1&amp;quot;, 15));&lt;br /&gt;
    adjacencyList[3].push_back(neighbor(2, &amp;quot;Knoten 2&amp;quot;, 11));&lt;br /&gt;
    adjacencyList[3].push_back(neighbor(4, &amp;quot;Knoten 4&amp;quot;, 6));&lt;br /&gt;
&lt;br /&gt;
    adjacencyList[4].push_back(neighbor(3, &amp;quot;Knoten 3&amp;quot;, 6));&lt;br /&gt;
    adjacencyList[4].push_back(neighbor(5, &amp;quot;Knoten 5&amp;quot;, 9));&lt;br /&gt;
&lt;br /&gt;
    adjacencyList[5].push_back(neighbor(0, &amp;quot;Knoten 0&amp;quot;, 14));&lt;br /&gt;
    adjacencyList[5].push_back(neighbor(2, &amp;quot;Knoten 2&amp;quot;, 2));&lt;br /&gt;
    adjacencyList[5].push_back(neighbor(4, &amp;quot;Knoten 4&amp;quot;, 9));&lt;br /&gt;
&lt;br /&gt;
    auto [minimumDistances, previousVertices, vertexNames] = ComputeShortestPathsByDijkstra(0, adjacencyList); // Aufruf der Methode, die die kürzesten Wege für den Knoten 0 zurückgibt&lt;br /&gt;
    cout &amp;lt;&amp;lt; &amp;quot;Abstand von Knoten 0 nach Knoten 4: &amp;quot; &amp;lt;&amp;lt; minimumDistances[4] &amp;lt;&amp;lt; endl; // Ausgabe auf der Konsole&lt;br /&gt;
    auto path = GetShortestPathTo(4, previousVertices, vertexNames); // Aufruf der Methode, die einen kürzesten Weg von Knoten 0 nach Knoten 4 zurückgibt&lt;br /&gt;
    cout &amp;lt;&amp;lt; &amp;quot;Kürzester Weg:&amp;quot;; // Ausgabe auf der Konsole&lt;br /&gt;
    copy(path.begin(), path.end(), ostream_iterator&amp;lt;string&amp;gt;(cout, &amp;quot; &amp;quot;)); // Ausgabe auf der Konsole&lt;br /&gt;
    cout &amp;lt;&amp;lt; endl; // Ausgabe auf der Konsole&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Beispiel mit bekanntem Zielknoten ==&lt;br /&gt;
Ein Beispiel für die Anwendung des Algorithmus von Dijkstra ist die Suche nach einem kürzesten Pfad auf einer Landkarte.&amp;lt;ref&amp;gt;[http://www.vice.com/en/article/4x3pp9/the-simple-elegant-algorithm-that-makes-google-maps-possible &amp;#039;&amp;#039;The Simple, Elegant Algorithm That Makes Google Maps Possible.&amp;#039;&amp;#039;] Bei: &amp;#039;&amp;#039;[[Vice (Magazin)|VICE.]]&amp;#039;&amp;#039; Abgerufen am 3.&amp;amp;nbsp;Oktober 2020.&amp;lt;/ref&amp;gt; Im hier verwendeten Beispiel will man in der unten gezeigten Landkarte&amp;lt;!-- keine Landkarte wie man sie gewohnt ist, eventuell [[Topografie (Kartografie)]] --&amp;gt; von [[Deutschland]] einen kürzesten Pfad von [[Frankfurt am Main|Frankfurt]] nach [[München]] finden.&lt;br /&gt;
&lt;br /&gt;
Die Zahlen auf den Verbindungen zwischen zwei Städten geben jeweils die Entfernung zwischen den beiden durch die Kante verbundenen Städten an. Die Zahlen hinter den Städtenamen geben die ermittelte Distanz der Stadt zum Startknoten &amp;#039;&amp;#039;Frankfurt&amp;#039;&amp;#039; an, ∞ steht dabei für eine unbekannte Distanz. Die hellgrau unterlegten Knoten sind die Knoten, deren Abstand relaxiert wird (also verkürzt wird, falls eine kürzere Strecke gefunden wurde), die dunkelgrau unterlegten Knoten sind diejenigen, zu denen der kürzeste Weg von Frankfurt bereits bekannt ist.&lt;br /&gt;
&lt;br /&gt;
Die Auswahl des nächsten Nachbarn erfolgt nach dem Prinzip einer Prioritätswarteschlange. Relaxierte Abstände erfordern daher eine Neusortierung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;250&amp;quot; perrow=&amp;quot;2&amp;quot; caption=&amp;quot;Beispiel&amp;quot;&amp;gt;&lt;br /&gt;
   MapGermanyGraph.svg|Ausgangssituation: Nicht-initialisierter Graph mit Startknoten Frankfurt und Zielknoten München&lt;br /&gt;
   DijkstraStep01.svg|Entfernungen vom Startknoten (Frankfurt) ermitteln (&amp;#039;&amp;#039;Relaxierung&amp;#039;&amp;#039;), Neusortieren der Prioritätswarteschlange Q (1.&amp;amp;nbsp;Mannheim, 2.&amp;amp;nbsp;Kassel, 3.&amp;amp;nbsp;Würzburg,&amp;amp;nbsp;…)&lt;br /&gt;
   DijkstraStep02.svg|Mannheim ist der nächstliegende Knoten, Relaxierung mit dem Nachbarknoten Karlsruhe, nächster Vorgänger von Karlsruhe ist nun Mannheim, Neusortieren von Q (1.&amp;amp;nbsp;Karlsruhe, 2.&amp;amp;nbsp;Kassel, 3.&amp;amp;nbsp;Würzburg,&amp;amp;nbsp;…)&lt;br /&gt;
   DijkstraStep03.svg|Dem Startpunkt nächstliegender zu untersuchender Knoten laut Q ist nun Karlsruhe, Relaxierung mit Augsburg, Neusortieren von Q (1.&amp;amp;nbsp;Kassel, 2.&amp;amp;nbsp;Würzburg, 3.&amp;amp;nbsp;Augsburg,&amp;amp;nbsp;…)&lt;br /&gt;
   DijkstraStep04.svg|Nächstliegender zu untersuchender Knoten ist nun Kassel, Relaxierung mit München, Neusortieren von Q (1.&amp;amp;nbsp;Würzburg, 2.&amp;amp;nbsp;Augsburg, 3.&amp;amp;nbsp;München,&amp;amp;nbsp;…)&lt;br /&gt;
   DijkstraStep05.svg|Nächstliegender zu untersuchender Knoten ist nun Würzburg, Relaxierung mit Erfurt und Nürnberg, Neusortieren von Q (1.&amp;amp;nbsp;Nürnberg, 2.&amp;amp;nbsp;Erfurt, 3.&amp;amp;nbsp;Augsburg, 4.&amp;amp;nbsp;München,&amp;amp;nbsp;…)&lt;br /&gt;
   DijkstraStep06.svg|Nächstliegender zu untersuchender Knoten ist nun Nürnberg, Relaxierung mit München und Stuttgart, Neusortieren von Q (1.&amp;amp;nbsp;Erfurt, 2.&amp;amp;nbsp;Augsburg, 3.&amp;amp;nbsp;München, 4.&amp;amp;nbsp;Stuttgart,&amp;amp;nbsp;…)&lt;br /&gt;
   DijkstraStep07.svg|Nächstliegender zu untersuchender Knoten ist nun Erfurt, Relaxierung mit niemandem, Neusortieren von Q (1.&amp;amp;nbsp;Augsburg, 2.&amp;amp;nbsp;München, 3.&amp;amp;nbsp;Stuttgart,&amp;amp;nbsp;…)&lt;br /&gt;
   DijkstraStep08.svg|Nächstliegender zu untersuchender Knoten ist nun Augsburg, Relaxierung mit München, Neusortieren von Q (1.&amp;amp;nbsp;München, 2.&amp;amp;nbsp;Stuttgart&amp;amp;nbsp;…)&lt;br /&gt;
   DijkstraStep09.svg|Zielknoten soll untersucht werden: Kürzester Weg nach München ist nun bekannt; Rekonstruktion mittels &amp;#039;&amp;#039;erstelleKürzestenPfad()&amp;#039;&amp;#039;. Dieser ist: Frankfurt-Würzburg-Nürnberg-München.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Grundlegende Konzepte und Verwandtschaften ==&lt;br /&gt;
Ein alternativer Algorithmus zur Suche kürzester Pfade, der sich dagegen auf das [[Optimalitätsprinzip von Bellman]] stützt, ist der [[Floyd-Warshall-Algorithmus]]. Das Optimalitätsprinzip besagt, dass, wenn der kürzeste Pfad von A nach C über B führt, der Teilpfad A&amp;amp;nbsp;B auch der kürzeste Pfad von A nach B sein muss.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer alternativer Algorithmus ist der [[A*-Algorithmus]], der den Algorithmus von Dijkstra um eine Abschätzfunktion erweitert. Falls diese gewisse Eigenschaften erfüllt, kann damit der kürzeste Pfad unter Umständen schneller gefunden werden.&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Beschleunigungstechniken für den Dijkstra-Algorithmus, zum Beispiel [[Arcflag]].&lt;br /&gt;
&lt;br /&gt;
== Berechnung eines Spannbaumes ==&lt;br /&gt;
[[Datei:Dijkstra-MSG-Negativbsp.svg|gerahmt|Ein [[Graph (Graphentheorie)|Graph]], bei dem der durch den Dijkstra-Algorithmus (startend in s) berechnete [[Spannbaum]] kein minimaler Spannbaum des Graphen ist.]]&lt;br /&gt;
&lt;br /&gt;
Nach Ende des Algorithmus ist in den Vorgängerzeigern &amp;#039;&amp;#039;π&amp;#039;&amp;#039; ein Teil-[[Spannbaum]] der [[Zusammenhang von Graphen|Komponente]] von &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; aus kürzesten Pfaden von &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; zu allen Knoten der Komponente, die in die Queue aufgenommen wurden, verzeichnet. Dieser Baum ist jedoch nicht notwendigerweise auch minimal, wie die Abbildung zeigt:&lt;br /&gt;
&lt;br /&gt;
Sei &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; eine Zahl größer 0. Minimal spannende Bäume sind entweder durch die Kanten &amp;lt;math&amp;gt;\left\{ a,s \right\}&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;\left\{ a,b \right\}&amp;lt;/math&amp;gt; oder &amp;lt;math&amp;gt;\left\{ b,s \right\}&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;\left\{ a,b \right\}&amp;lt;/math&amp;gt; gegeben. Die Gesamtkosten eines minimal spannenden Baumes betragen &amp;lt;math&amp;gt;2+x&amp;lt;/math&amp;gt;. Dijkstras Algorithmus liefert mit Startpunkt &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; die Kanten &amp;lt;math&amp;gt;\left\{ a,s \right\}&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;\left\{ b,s \right\}&amp;lt;/math&amp;gt; als Ergebnis. Die Gesamtkosten dieses spannenden Baumes betragen &amp;lt;math&amp;gt;2+2x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Berechnung eines [[Spannbaum|minimalen Spannbaumes]] ist mit dem [[Algorithmus von Prim]] oder dem [[Algorithmus von Kruskal]] möglich.&lt;br /&gt;
&lt;br /&gt;
== Zeitkomplexität ==&lt;br /&gt;
Die folgende Abschätzung gilt nur für Graphen, die keine negativen Kantengewichte enthalten.&lt;br /&gt;
&lt;br /&gt;
Die Laufzeit des Dijkstra-Algorithmus hängt ab von der Anzahl der Kanten &amp;lt;math&amp;gt;|E|&amp;lt;/math&amp;gt; und der Anzahl der Knoten &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;. Die genaue Zeitkomplexität hängt von der Datenstruktur &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ab, in der die Knoten gespeichert werden.&lt;br /&gt;
Für alle Implementierungen von &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; gilt:&lt;br /&gt;
:&amp;lt;math&amp;gt;O(|E| \cdot T_\mathrm{dk} + |V| \cdot T_\mathrm{em})&amp;lt;/math&amp;gt;&lt;br /&gt;
wobei &amp;lt;math&amp;gt;T_\mathrm{dk}&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;T_\mathrm{em}&amp;lt;/math&amp;gt; für die Komplexität der &amp;#039;&amp;#039;decrease-key&amp;#039;&amp;#039;- und &amp;#039;&amp;#039;extract-minimum&amp;#039;&amp;#039;-Operationen bei &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; stehen. Die einfachste Implementierung für &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ist eine Liste oder ein Array. Dabei ist die Zeitkomplexität &amp;lt;math&amp;gt;O(|E| + |V|^2) = O(|V|^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Im Normalfall wird man hier auf eine [[Vorrangwarteschlange]] zurückgreifen, indem man dort die Knoten als Elemente mit ihrer jeweiligen bisherigen Distanz als Schlüssel/Priorität verwendet.&lt;br /&gt;
&lt;br /&gt;
Die optimale Laufzeit für einen Graphen &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; beträgt &amp;lt;math&amp;gt;O(|V| \log(|V|) + |E|)&amp;lt;/math&amp;gt; mittels Verwendung eines [[Fibonacci-Heap|Fibonacci-Heaps]] für den Dijkstra-Algorithmus.&amp;lt;ref&amp;gt;{{Literatur |Autor=Thomas H. Cormen |Titel=Introduction to Algorithms |Verlag=MIT Press |Datum= |Seiten=663}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Brechen der „Sortierbarriere“ ==&lt;br /&gt;
Forschung aus dem Jahr 2025 zeigt, dass die Schranke &amp;lt;math&amp;gt;O(m+n\log n)&amp;lt;/math&amp;gt; nicht grundsätzlich optimal für SSSP in reell gewichteten Graphen ist, sofern nur Distanzen, nicht aber die vollständige Reihenfolge der Knoten nach Distanz ausgegeben werden muss. Duan u.&amp;amp;nbsp;a. (2025) geben einen deterministischen Algorithmus mit Laufzeit &amp;lt;math&amp;gt;O(m \log^{2/3} n)&amp;lt;/math&amp;gt; im Comparison-Addition-Modell (nur Vergleiche und Additionen der Kantengewichte, konstante Kosten pro Operation) für gerichtete Graphen mit nichtnegativen Gewichten an.&amp;lt;ref name=&amp;quot;Duan2025&amp;quot;&amp;gt;{{Internetquelle |url=https://arxiv.org/abs/2504.17033v2 |titel=Breaking the Sorting Barrier for Directed Single-Source Shortest Paths |autor=Ran Duan; Jiayi Mao; Xiao Mao; Xinkai Shu; Longhui Yin |werk=arXiv |datum=31. Juli 2025 |zugriff=13. August 2025}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Ansatz verringert die Größe der „Frontier“ (Menge der relevanten Kandidatenknoten) rekursiv, kombiniert Dijkstra-artige Extraktionen mit Bellman-Ford-artigen Mehrschritt-Relaxationen und nutzt partielle Priorisierung statt vollständiger Sortierung. Dadurch wird die klassische Sortierbarriere umgangen. Das Ergebnis belegt, dass Dijkstras Algorithmus für die reine Distanzberechnung auf dünn besetzten (&amp;#039;&amp;#039;sparse&amp;#039;&amp;#039;) Graphen nicht optimal ist; eine universelle Optimalität bleibt bestehen, wenn die Ausgabe die vollständige Distanzordnung verlangt (siehe u.&amp;amp;nbsp;a. Haeupler, Hladík, Rozhoň, Tarjan, Tětek, 2024).&amp;lt;ref name=&amp;quot;Duan2025&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Einordnung: Für ungerichtete Graphen existieren bereits frühere deterministische Verbesserungen im selben Modell, z.&amp;amp;nbsp;B. durch Pettie und Ramachandran (2005) mit einer Laufzeit von &amp;lt;math&amp;gt;O(m \alpha(m,n) + \min\{n\log n,\, n\log\log r\})&amp;lt;/math&amp;gt;, wobei &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; die inverse Ackermann-Funktion und &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; das Verhältnis zweier Kantengewichte bezeichnet; die Arbeit von Duan u.&amp;amp;nbsp;a. durchbricht die Sortierbarriere explizit für den gerichteten Fall.&amp;lt;ref name=&amp;quot;Duan2025&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anwendungen ==&lt;br /&gt;
[[Routenplaner]] sind ein prominentes Beispiel, bei dem dieser Algorithmus eingesetzt werden kann. Der Graph repräsentiert hier das Verkehrswegenetz, das verschiedene Punkte miteinander verbindet. Gesucht ist die kürzeste Route zwischen zwei Punkten.&lt;br /&gt;
&lt;br /&gt;
Einige [[Topologischer Deskriptor|topologische Indizes]], etwa der [[Balaban-J-Index|J-Index]] von Balaban, benötigen gewichtete Distanzen zwischen den Atomen eines [[Molekül]]s. Die Gewichtung ist in diesen Fällen die Bindungsordnung.&lt;br /&gt;
&lt;br /&gt;
Dijkstras Algorithmus wird auch im [[Internet]] als [[Routing]]-Algorithmus im [[Open Shortest Path First|OSPF]]-, [[IS-IS]]- und [[Optimized Link State Routing|OLSR]]-Protokoll eingesetzt. Das letztere &amp;#039;&amp;#039;Optimized Link State Routing&amp;#039;&amp;#039;-Protokoll ist eine an die Anforderungen eines mobilen drahtlosen LANs angepasste Version des [[Link-State|Link State Routing]]. Es ist wichtig für mobile [[Ad-hoc-Netz]]e. Eine mögliche Anwendung davon sind die [[Freies Funknetz|freien Funknetze]].&lt;br /&gt;
&lt;br /&gt;
Auch bei der Lösung des [[Münzproblem]]s, eines zahlentheoretischen Problems, das auf den ersten Blick nichts mit Graphen zu tun hat, kann der Dijkstra-Algorithmus eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
== Andere Verfahren zur Berechnung kürzester Pfade ==&lt;br /&gt;
Hat man genug Informationen über die Kantengewichte im Graphen, um daraus eine [[Heuristik]] für die Kosten einzelner Knoten ableiten zu können, ist es möglich, den Algorithmus von Dijkstra zum [[A*-Algorithmus]] zu erweitern. Um alle kürzesten 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 schließlich die kürzesten Pfade aller Knoten zueinander.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* {{BibISBN|3486275151|Seite=598–604}}&lt;br /&gt;
* [[Robert Sedgewick (Informatiker)|Robert Sedgewick]]: &amp;#039;&amp;#039;Algorithms in C++ Part 5: Graph Algorithms.&amp;#039;&amp;#039; Indianapolis 2002, ISBN 0-201-36118-3, S. 293–302.&lt;br /&gt;
* [[Edsger W. Dijkstra]]: &amp;#039;&amp;#039;A note on two problems in connexion with graphs.&amp;#039;&amp;#039; In: &amp;#039;&amp;#039;Numerische Mathematik.&amp;#039;&amp;#039; 1, 1959, S. 269–271; [http://www-m3.ma.tum.de/twiki/pub/MN0506/WebHome/dijkstra.pdf ma.tum.de] (PDF; 739&amp;amp;nbsp;kB).&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
{{commons|Dijkstra&amp;#039;s algorithm|Algorithmus von Dijkstra}}&lt;br /&gt;
{{Wikibooks|Algorithmensammlung: Graphentheorie: Dijkstra-Algorithmus|Dijkstra-Algorithmus|suffix=Implementierungen in der Algorithmensammlung}}&lt;br /&gt;
* [http://web.archive.org/web/20210917222324/https://www.gilles-bertrand.com/2014/03/dijkstra-algorithm-python-example-source-code-shortest-path.html Python-Implementierung mit Erklärungen]&lt;br /&gt;
* [https://networkx.github.io/documentation/stable/reference/algorithms/shortest_paths.html Implementierung] in der freien [[Python (Programmiersprache)|Python]]-[[Programmbibliothek|Bibliothek]] [[NetworkX]]&lt;br /&gt;
* [https://algorithms.discrete.ma.tum.de/graph-algorithms/spp-dijkstra/index_de.html Interaktives Applet zur Lernen, Ausprobieren und Demonstrieren des Algorithmus]&lt;br /&gt;
* [http://www.uweschmidt.org/dijkstravis Interaktive Visualisierung und Animation von Dijkstras Algorithmus, geeignet für Personen ohne Vorkenntnisse von Algorithmen] (englisch)&lt;br /&gt;
* [http://computer.howstuffworks.com/routing-algorithm3.htm Implementierung in C] (englisch)&lt;br /&gt;
* [http://algo2.iti.uni-karlsruhe.de/singler/algorithmus-der-woche/Kuerzeste%20Wege.pdf Erklärung anhand eines analogen Modells] (PDF; 213&amp;amp;nbsp;kB)&lt;br /&gt;
* [http://jgrapht.org/ Öffentliche Softwarebibliothek in Java mit diesem und anderen Algorithmen] (englisch)&lt;br /&gt;
* [http://sourceforge.net/projects/dijkstromania/ Java Implementierung – Simulation / Auswertung] (englisch)&lt;br /&gt;
* {{Webarchiv |url=http://www.hann3mann.de/artikel/dijkstra-algorithmus-in-c-csharp/ |text=&amp;#039;&amp;#039;Dijkstra Algorithmus in C# (csharp).&amp;#039;&amp;#039; |archive-is=20130211062327}}.&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Optimierungsalgorithmus|Dijkstra, Algorithmus von]]&lt;br /&gt;
[[Kategorie:Graphsuchalgorithmus]]&lt;br /&gt;
[[Kategorie:Routing]]&lt;br /&gt;
[[Kategorie:Reise- und Routenplanung]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Krdbot</name></author>
	</entry>
</feed>