Dijkstra -Algorithmus C ++

Dijkstra -Algorithmus C ++

Der Algorithmus von Dijkstra ist auch als der kürzest mögliche Pfadalgorithmus bekannt. Es ist das Verfahren, um den kürzesten Pfad zwischen den Knoten/ Kanten des Diagramms zu finden. Die kürzeste Grafik eines Baumes wird erstellt, indem vom Quellscheitelpunkt bis zu allen anderen Punkten in der Grafik beginnt.

Algorithmus

  • Vor der direkten Implementierung des Dijkstra -Graphen in der C ++ - Programmiersprache müssen wir die Arbeit dieses Graph -Algorithmus verstehen.
  • Der erste Schritt ist die Erstellung von „Sptset“, das als kürzester Pfadbaum -Set abgekürzt wird. Es speichert die Aufzeichnung dieser Eckpunkte, die auf dem kürzesten Weg enthalten sind. In der Anfangsphase wird dieser Satz als NULL deklariert.
  • Im nächsten Schritt werden alle diese Werte an den Knoten als unendlich deklariert, da wir das Gewicht der Pfade bis jetzt nicht kennen.
  • Wählen Sie einen Scheitelpunkt „U“ aus, der nicht bereits in sptset vorhanden ist und minimaler Wert hat. Dann schließen Sie es in SptSet ein. Aktualisieren Sie danach die Entfernungswerte aller Knoten, die benachbarte Eckpunkte von „u“ sind.Dies ist alles unter der Schleife erfolgen, bis SptSet alle Scheitelpunkte enthalten kann.

Implementierung des Dijkstra -Graph -Algorithmus

Hier ist die Implementierung des Dijkstra -Diagramms, in dem ein Programm für die Adjazenzmatrix -Darstellung dieses Diagramms geschrieben wird. Starten Sie das Programm, indem Sie zwei Bibliotheken hinzufügen, die für die Durchführung des Programms in der C ++ - Programmiersprache sehr wichtig sind, wodurch wir in der Lage sind, CIN- und Cout -Funktionen zu verwenden.

#enthalten
#enthalten

Nachdem wir die Bibliotheken beschrieben haben, werden wir jetzt die Größe oder Scheitelpunkte des Diagramms bereitstellen, in dem wir den kürzesten Weg benötigen. Wir haben 9 Eckpunkte gegeben, was bedeutet, dass die Matrix ein Quadrat von [9] [9] ist.

#define v 9

"V" ist für die Eckpunkte. Da der Algorithmus viele Schritte benötigt, um die bereitgestellte Aufgabe zu erfüllen, wird jeder Schritt oder Prozess in separate Funktionen unterteilt, um sie auszuführen, damit der Code klar ist und es keine Unklarheiten in Bezug auf die Logik gibt. Darüber hinaus wird auch die Komplexität entfernt.

Die Funktion wird hier erstellt, um den Scheitelpunkt zu durchsuchen, der einen Mindestabstandswert hat. Es enthält den Satz von Scheitelpunkten, die nicht im Baum enthalten sind und den kürzesten Weg haben. Die Funktion enthält das Abstandsarray und ein Bool -Typ sptset, den kürzesten Pfadbaumsatz und das Array als Parameter der Funktion. Innerhalb der Funktion wird der Mindestwert initialisiert, indem eine Variable des Ganzzahltyps deklariert wird, der den zurückgegebenen Wert speichert. Zwei Variablen, max und der min_index werden eingeführt.

Int min = int_max, min_index;

A für Schleife wird hier verwendet; In dem ein Startscheitel in allen Scheitelpunkten aufgenommen wird, wird die Schleife fortgesetzt, bis alle Scheitelpunkte durchquert werden. Hier wird hier eine Bedingung angewendet, indem eine IF -Anweisung verwendet wird, die überprüft, ob der kürzeste Pfadsatz falsch ist, sie derzeit leer ist und der Abstand des Scheitelpunkts kleiner ist als der des Mindestwerts des Scheitelpunkts, der früher deklariert wird. zuweisen Sie dann den aktuellen Wert von Scheitelpunkt als min, und der min_index enthält auch denselben Wert des Scheitelpunkts.

Min = dist [v], min_index = v;

Nachdem der Mindestwert des Scheitelpunkts berechnet wurde. Auf eine Schleife wird auf jeden Index aufgenommen, auf den zugegriffen und angezeigt wird. Erstens wird die Scheitelpunktzahl ab dem Nullwert angezeigt, und der Abstand des Scheitelpunkts von der Quelle wird auch hier mit einer Sequenz erwähnt. Diese Funktion wird hier deklariert, wird jedoch später im Programm aufgerufen, wenn der gesamte Pfad als kürzester Entfernung berechnet wird.

Der Hauptteil des gesamten Quellcodes wird nun deklariert, bei dem die Implementierung des kürzesten Einstiegspfads berechnet wird. Eine Grafik wird durch die Adjazenzmatrixdarstellung dargestellt. Diese Funktion nimmt eine Diagrammmatrix und die Quelle als Parameterwerte auf, die als Eingabe für die Entfernungsberechnung wirken. Innerhalb der Funktion deklarieren wir zuerst das Ausgangsarray, das den kürzesten Pfad von der Quelle zu einem bestimmten Punkt enthält. Zweiten.

Int dist [v]; bool sptset [v];

Alle Entfernungen werden als unendlich eingestellt, und das kürzeste Baumpfadarray ist falsch. Mit Hilfe einer Schleife findet all dieser Prozess statt.

In der Schleife wird der Mindestabstandscheitelx. In der ersten Iteration ist 'u' immer gleich dem Quellscheitelpunkt.

Int u = mindistance (dist, sptset);

Diejenigen Scheitelpunkte, die ausgewählt und durchquert werden.

sptset [u] = true;

Wenn ein Scheitelpunkt hinzugefügt wird, werden auch alle an diesen bestimmten Scheitelpunkt angrenzenden Scheitelpunkte überprüft. Dies erfordert ein Update. Wir werden also den Wert von „Dist“ der angrenzenden Scheitelpunkte jener Scheitelpunkte aktualisieren, die bisher Streikposten waren.

In diesem SOOP werden wir Dist [v] nur dann aktualisieren, wenn es sich nicht um die Sptset befindet, es gibt eine Linie, die als Kante vom Scheitelpunkt U bis V bezeichnet wird, und das Gesamtgewicht des Pfades, der von „SRC“ beginnt, von „SRC“ beginnt. zu „v“ durch Durchlaufen von „U“ ist kleiner als der aktuelle Wert, der im Dist [V] vorhanden ist.

Dist [v] = dist [u] + graph [u] [v];

Danach wird die oben deklarierte Druckfunktion aufgerufen, indem das Dist [] -Array als Parameter bestanden hat.

printSolution (dist);

Im Hauptprogramm erstellen wir eine 9*9 -Matrix -Grafik. Und dann wird der Funktionsaufruf für die Dijkstra -Funktion gemacht, über die die Grafik übergeben wird.

Speichern Sie den gesamten Code. Kompilieren Sie den Code mit einem G ++ - Compiler im Ubuntu -Terminal. '-o' ist ein Symbol, das die Ausgabe der Datei speichert.

$ g ++ -o dij Dij.C
$ ./Dij

Sie können sehen, dass alle Scheitelpunkte in jeder separaten Linie zusammen mit dem Abstand jedes Scheitelpunkts von der Quelle angezeigt werden.

Dieser Code berechnet die kürzeste Entfernung, unterstützt jedoch nicht die Berechnung der Informationen über den Pfad. Dieser Quellcode ist gut für die ungerichteten Grafiken, kann aber auch für die gerichteten Grafiken verwendet werden. Durch die Verwendung dieses Code können wir den kürzesten Abstand vom Punkt der Quelle zu allen anderen Scheitelpunkten in der Grafik finden.

Die zeitliche Komplexität des Dijkstra -Graphen

Wir werden über die Zeitkomplexität der Implementierung sprechen. Es ist:

0 (v^2).

Dies kann auf 0 (e log v) reduziert werden, indem der Prozess des binären Haufens verwendet wird. Das Dijkstra -Diagramm gilt nicht für die Grafiken mit negativen Gewichten.

Abschluss

Dieser Artikel enthält den Prozess, den kürzesten Abstand zwischen dem Quellknoten zum Rest der Knoten zu finden. Dies kann viele Ansätze geben. Aber das Dijkstra -Diagramm ist einer der besten Mechanismen für diesen Zweck. Es ist für ungerichtete Graphen ausgelegt. Wir haben den Prozess Schritt für Schritt mit dem Quellcode erläutert, um die neuen Benutzer lebendig zu machen. Wir hoffen, dass diese Bemühungen für die Leser den Marke entsprechen werden.