Glede na utežen graf in izvorno vozlišče v grafu poiščite najkrajše poti od vira do vseh drugih točk v danem grafu.
Opomba: Dani graf ne vsebuje nobenega negativnega roba.
Primeri:
Priporočena praksa implementacije Dijkstra algoritma Poskusite!Vnos: src = 0, je graf prikazan spodaj.
primeri operacijskega sistemaIzhod: 0 4 12 19 21 11 9 8 14
Pojasnilo: Razdalja od 0 do 1 = 4.
Najmanjša razdalja od 0 do 2 = 12. 0->1->2
Najmanjša razdalja od 0 do 3 = 19. 0->1->2->3
Najmanjša razdalja od 0 do 4 = 21. 0->7->6->5->4
Najmanjša razdalja od 0 do 5 = 11. 0->7->6->5
Najmanjša razdalja od 0 do 6 = 9. 0->7->6
Najmanjša razdalja od 0 do 7 = 8. 0->7
Najmanjša razdalja od 0 do 8 = 14. 0->1->2->8
Uporaba Dijkstrinega algoritma Matrika sosednosti :
Ideja je ustvariti a SPT (drevo najkrajše poti) z danim virom kot korenom. Ohranite matriko sosednosti z dvema nizoma,
- en niz vsebuje vozlišča, vključena v drevo najkrajše poti,
- drugi niz vključuje vozlišča, ki še niso vključena v drevo najkrajše poti.
Na vsakem koraku algoritma poiščite vozlišče, ki je v drugi množici (niz še ni vključen) in ima minimalno oddaljenost od vira.
Algoritem :
- Ustvari komplet sptSet (nabor dreves najkrajše poti), ki spremlja vozlišča, vključena v drevo najkrajše poti, tj. katerih najmanjša oddaljenost od vira je izračunana in dokončna. Na začetku je ta niz prazen.
- Dodelite vrednost razdalje vsem vozliščem v vhodnem grafu. Inicializirajte vse vrednosti razdalje kot NESKONČNO . Za izvorno točko dodelite vrednost razdalje 0, tako da bo izbrana prva.
- Medtem sptSet ne vključuje vseh vozlišč
- Izberite vrh v tega ni v sptSet in ima minimalno vrednost razdalje.
- Vključite vas v sptSet .
- Nato posodobite vrednost razdalje vseh sosednjih vozlišč v .
- Če želite posodobiti vrednosti razdalje, ponovite skozi vsa sosednja vozlišča.
- Za vsako sosednjo točko v, če je vsota vrednosti razdalje v (iz vira) in težo roba u-v , je manjša od vrednosti razdalje v , nato posodobite vrednost razdalje v .
Opomba: Uporabljamo logično matriko sptSet[] da predstavlja nabor vozlišč, vključenih v SPT . Če vrednost sptSet[v] velja, potem je vozlišče v vključeno vanj SPT , sicer ne. Array dist[] se uporablja za shranjevanje vrednosti najkrajše razdalje vseh vozlišč.
Ilustracija Dijkstra algoritma :
Da bi razumeli Dijkstrajev algoritem, vzemite graf in poiščite najkrajšo pot od vira do vseh vozlišč.
Razmislite o spodnjem grafu in src = 0
Korak 1:
- Komplet sptSet je na začetku prazen in razdalje, dodeljene vozliščem, so {0, INF, INF, INF, INF, INF, INF, INF}, kjer je INF označuje neskončno.
- Zdaj izberite točko z najmanjšo vrednostjo razdalje. Točka 0 je izbrana, vključite jo sptSet . torej sptSet postane {0}. Po vključitvi 0 do sptSet , posodobi vrednosti razdalje svojih sosednjih vozlišč.
- Sosednji točki 0 sta 1 in 7. Vrednosti razdalje 1 in 7 sta posodobljeni kot 4 in 8.
Naslednji podgraf prikazuje oglišča in njihove vrednosti razdalje, prikazana so samo oglišča s končnimi vrednostmi razdalje. Točke, vključene v SPT so prikazani v zelena barva.
2. korak:
- Izberite točko z najmanjšo vrednostjo razdalje, ki še ni vključena SPT (ni notri sptSET ). Točka 1 je izbrana in dodana sptSet .
- torej sptSet zdaj postane {0, 1}. Posodobite vrednosti razdalje sosednjih vozlišč 1.
- Vrednost razdalje oglišča 2 postane 12 .
3. korak:
- Izberite točko z najmanjšo vrednostjo razdalje, ki še ni vključena SPT (ni notri sptSET ). Točka 7 je izbrana. torej sptSet zdaj postane {0, 1, 7}.
- Posodobite vrednosti razdalje sosednjih oglišč 7. Vrednost razdalje oglišč 6 in 8 postane končna ( 15 in 9 oz.).
4. korak:
- Izberite točko z najmanjšo vrednostjo razdalje, ki še ni vključena SPT (ni notri sptSET ). Točka 6 je izbrana. torej sptSet zdaj postane {0, 1, 7, 6} .
- Posodobite vrednosti razdalje sosednjih tock 6. Vrednost razdalje tock 5 in 8 sta posodobljeni.
Zgornje korake ponavljamo, dokler sptSet vključuje vse točke danega grafa. Končno dobimo naslednje S Hortest Path Tree (SPT).
Spodaj je izvedba zgornjega pristopa:
C++ // C++ program for Dijkstra's single source shortest path // algorithm. The program is for adjacency matrix // representation of the graph #include using namespace std; #include // Number of vertices in the graph #define V 9 // A utility function to find the vertex with minimum // distance value, from the set of vertices not yet included // in shortest path tree int minDistance(int dist[], bool sptSet[]) { // Initialize min value int min = INT_MAX, min_index; for (int v = 0; v < V; v++) if (sptSet[v] == false && dist[v] <= min) min = dist[v], min_index = v; return min_index; } // A utility function to print the constructed distance // array void printSolution(int dist[]) { cout << 'Vertex Distance from Source' << endl; for (int i = 0; i < V; i++) cout << i << ' ' << dist[i] << endl; } // Function that implements Dijkstra's single source // shortest path algorithm for a graph represented using // adjacency matrix representation void dijkstra(int graph[V][V], int src) { int dist[V]; // The output array. dist[i] will hold the // shortest // distance from src to i bool sptSet[V]; // sptSet[i] will be true if vertex i is // included in shortest // path tree or shortest distance from src to i is // finalized // Initialize all distances as INFINITE and stpSet[] as // false for (int i = 0; i < V; i++) dist[i] = INT_MAX, sptSet[i] = false; // Distance of source vertex from itself is always 0 dist[src] = 0; // Find shortest path for all vertices for (int count = 0; count < V - 1; count++) { // Pick the minimum distance vertex from the set of // vertices not yet processed. u is always equal to // src in the first iteration. int u = minDistance(dist, sptSet); // Mark the picked vertex as processed sptSet[u] = true; // Update dist value of the adjacent vertices of the // picked vertex. for (int v = 0; v < V; v++) // Update dist[v] only if is not in sptSet, // there is an edge from u to v, and total // weight of path from src to v through u is // smaller than current value of dist[v] if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v]) dist[v] = dist[u] + graph[u][v]; } // print the constructed distance array printSolution(dist); } // driver's code int main() { /* Let us create the example graph discussed above */ int graph[V][V] = { { 0, 4, 0, 0, 0, 0, 0, 8, 0 }, { 4, 0, 8, 0, 0, 0, 0, 11, 0 }, { 0, 8, 0, 7, 0, 4, 0, 0, 2 }, { 0, 0, 7, 0, 9, 14, 0, 0, 0 }, { 0, 0, 0, 9, 0, 10, 0, 0, 0 }, { 0, 0, 4, 14, 10, 0, 2, 0, 0 }, { 0, 0, 0, 0, 0, 2, 0, 1, 6 }, { 8, 11, 0, 0, 0, 0, 1, 0, 7 }, { 0, 0, 2, 0, 0, 0, 6, 7, 0 } }; // Function call dijkstra(graph, 0); return 0; } // This code is contributed by shivanisinghss2110> C // C program for Dijkstra's single source shortest path // algorithm. The program is for adjacency matrix // representation of the graph #include #include #include // Number of vertices in the graph #define V 9 // A utility function to find the vertex with minimum // distance value, from the set of vertices not yet included // in shortest path tree int minDistance(int dist[], bool sptSet[]) { // Initialize min value int min = INT_MAX, min_index; for (int v = 0; v < V; v++) if (sptSet[v] == false && dist[v] <= min) min = dist[v], min_index = v; return min_index; } // A utility function to print the constructed distance // array void printSolution(int dist[]) { printf('Vertex Distance from Source
'); for (int i = 0; i < V; i++) printf('%d %d
', i, dist[i]); } // Function that implements Dijkstra's single source // shortest path algorithm for a graph represented using // adjacency matrix representation void dijkstra(int graph[V][V], int src) { int dist[V]; // The output array. dist[i] will hold the // shortest // distance from src to i bool sptSet[V]; // sptSet[i] will be true if vertex i is // included in shortest // path tree or shortest distance from src to i is // finalized // Initialize all distances as INFINITE and stpSet[] as // false for (int i = 0; i < V; i++) dist[i] = INT_MAX, sptSet[i] = false; // Distance of source vertex from itself is always 0 dist[src] = 0; // Find shortest path for all vertices for (int count = 0; count < V - 1; count++) { // Pick the minimum distance vertex from the set of // vertices not yet processed. u is always equal to // src in the first iteration. int u = minDistance(dist, sptSet); // Mark the picked vertex as processed sptSet[u] = true; // Update dist value of the adjacent vertices of the // picked vertex. for (int v = 0; v < V; v++) // Update dist[v] only if is not in sptSet, // there is an edge from u to v, and total // weight of path from src to v through u is // smaller than current value of dist[v] if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v]) dist[v] = dist[u] + graph[u][v]; } // print the constructed distance array printSolution(dist); } // driver's code int main() { /* Let us create the example graph discussed above */ int graph[V][V] = { { 0, 4, 0, 0, 0, 0, 0, 8, 0 }, { 4, 0, 8, 0, 0, 0, 0, 11, 0 }, { 0, 8, 0, 7, 0, 4, 0, 0, 2 }, { 0, 0, 7, 0, 9, 14, 0, 0, 0 }, { 0, 0, 0, 9, 0, 10, 0, 0, 0 }, { 0, 0, 4, 14, 10, 0, 2, 0, 0 }, { 0, 0, 0, 0, 0, 2, 0, 1, 6 }, { 8, 11, 0, 0, 0, 0, 1, 0, 7 }, { 0, 0, 2, 0, 0, 0, 6, 7, 0 } }; // Function call dijkstra(graph, 0); return 0; }> Java // A Java program for Dijkstra's single source shortest path // algorithm. The program is for adjacency matrix // representation of the graph import java.io.*; import java.lang.*; import java.util.*; class ShortestPath { // A utility function to find the vertex with minimum // distance value, from the set of vertices not yet // included in shortest path tree static final int V = 9; int minDistance(int dist[], Boolean sptSet[]) { // Initialize min value int min = Integer.MAX_VALUE, min_index = -1; for (int v = 0; v < V; v++) if (sptSet[v] == false && dist[v] <= min) { min = dist[v]; min_index = v; } return min_index; } // A utility function to print the constructed distance // array void printSolution(int dist[]) { System.out.println( 'Vertex Distance from Source'); for (int i = 0; i < V; i++) System.out.println(i + ' ' + dist[i]); } // Function that implements Dijkstra's single source // shortest path algorithm for a graph represented using // adjacency matrix representation void dijkstra(int graph[][], int src) { int dist[] = new int[V]; // The output array. // dist[i] will hold // the shortest distance from src to i // sptSet[i] will true if vertex i is included in // shortest path tree or shortest distance from src // to i is finalized Boolean sptSet[] = new Boolean[V]; // Initialize all distances as INFINITE and stpSet[] // as false for (int i = 0; i < V; i++) { dist[i] = Integer.MAX_VALUE; sptSet[i] = false; } // Distance of source vertex from itself is always 0 dist[src] = 0; // Find shortest path for all vertices for (int count = 0; count < V - 1; count++) { // Pick the minimum distance vertex from the set // of vertices not yet processed. u is always // equal to src in first iteration. int u = minDistance(dist, sptSet); // Mark the picked vertex as processed sptSet[u] = true; // Update dist value of the adjacent vertices of // the picked vertex. for (int v = 0; v < V; v++) // Update dist[v] only if is not in sptSet, // there is an edge from u to v, and total // weight of path from src to v through u is // smaller than current value of dist[v] if (!sptSet[v] && graph[u][v] != 0 && dist[u] != Integer.MAX_VALUE && dist[u] + graph[u][v] < dist[v]) dist[v] = dist[u] + graph[u][v]; } // print the constructed distance array printSolution(dist); } // Driver's code public static void main(String[] args) { /* Let us create the example graph discussed above */ int graph[][] = new int[][] { { 0, 4, 0, 0, 0, 0, 0, 8, 0 }, { 4, 0, 8, 0, 0, 0, 0, 11, 0 }, { 0, 8, 0, 7, 0, 4, 0, 0, 2 }, { 0, 0, 7, 0, 9, 14, 0, 0, 0 }, { 0, 0, 0, 9, 0, 10, 0, 0, 0 }, { 0, 0, 4, 14, 10, 0, 2, 0, 0 }, { 0, 0, 0, 0, 0, 2, 0, 1, 6 }, { 8, 11, 0, 0, 0, 0, 1, 0, 7 }, { 0, 0, 2, 0, 0, 0, 6, 7, 0 } }; ShortestPath t = new ShortestPath(); // Function call t.dijkstra(graph, 0); } } // This code is contributed by Aakash Hasija> Python # Python program for Dijkstra's single # source shortest path algorithm. The program is # for adjacency matrix representation of the graph # Library for INT_MAX import sys class Graph(): def __init__(self, vertices): self.V = vertices self.graph = [[0 for column in range(vertices)] for row in range(vertices)] def printSolution(self, dist): print('Vertex Distance from Source') for node in range(self.V): print(node, ' ', dist[node]) # A utility function to find the vertex with # minimum distance value, from the set of vertices # not yet included in shortest path tree def minDistance(self, dist, sptSet): # Initialize minimum distance for next node min = sys.maxsize # Search not nearest vertex not in the # shortest path tree for u in range(self.V): if dist[u] < min and sptSet[u] == False: min = dist[u] min_index = u return min_index # Function that implements Dijkstra's single source # shortest path algorithm for a graph represented # using adjacency matrix representation def dijkstra(self, src): dist = [sys.maxsize] * self.V dist[src] = 0 sptSet = [False] * self.V for cout in range(self.V): # Pick the minimum distance vertex from # the set of vertices not yet processed. # x is always equal to src in first iteration x = self.minDistance(dist, sptSet) # Put the minimum distance vertex in the # shortest path tree sptSet[x] = True # Update dist value of the adjacent vertices # of the picked vertex only if the current # distance is greater than new distance and # the vertex in not in the shortest path tree for y in range(self.V): if self.graph[x][y]>0 in sptSet[y] == False in dist[y]> dist[x] + self.graph[x][y]: dist[y] = dist[x] + self.graph[x][y] self.printSolution(dist) # Koda voznika, če je __name__ == '__main__': g = Graph(9) g.graph = [[0, 4, 0, 0, 0, 0, 0, 8, 0], [4, 0, 8, 0, 0, 0, 0, 11, 0], [0, 8, 0, 7, 0, 4, 0, 0, 2], [0, 0, 7, 0, 9, 14, 0, 0, 0], [0, 0, 0, 9, 0, 10, 0, 0, 0], [0, 0, 4, 14, 10, 0, 2, 0, 0], [0, 0, 0, 0, 0, 2, 0, 1, 6], [8, 11, 0, 0, 0, 0, 1, 0, 7], [0, 0, 2, 0, 0, 0, 6, 7, 0] ] g.dijkstra(0) # To kodo je prispeval Divyanshu Mehta, posodobil pa Pranav Singh Sambyal> C# // C# program for Dijkstra's single // source shortest path algorithm. // The program is for adjacency matrix // representation of the graph using System; class GFG { // A utility function to find the // vertex with minimum distance // value, from the set of vertices // not yet included in shortest // path tree static int V = 9; int minDistance(int[] dist, bool[] sptSet) { // Initialize min value int min = int.MaxValue, min_index = -1; for (int v = 0; v < V; v++) if (sptSet[v] == false && dist[v] <= min) { min = dist[v]; min_index = v; } return min_index; } // A utility function to print // the constructed distance array void printSolution(int[] dist) { Console.Write('Vertex Distance ' + 'from Source
'); for (int i = 0; i < V; i++) Console.Write(i + ' ' + dist[i] + '
'); } // Function that implements Dijkstra's // single source shortest path algorithm // for a graph represented using adjacency // matrix representation void dijkstra(int[, ] graph, int src) { int[] dist = new int[V]; // The output array. dist[i] // will hold the shortest // distance from src to i // sptSet[i] will true if vertex // i is included in shortest path // tree or shortest distance from // src to i is finalized bool[] sptSet = new bool[V]; // Initialize all distances as // INFINITE and stpSet[] as false for (int i = 0; i < V; i++) { dist[i] = int.MaxValue; sptSet[i] = false; } // Distance of source vertex // from itself is always 0 dist[src] = 0; // Find shortest path for all vertices for (int count = 0; count < V - 1; count++) { // Pick the minimum distance vertex // from the set of vertices not yet // processed. u is always equal to // src in first iteration. int u = minDistance(dist, sptSet); // Mark the picked vertex as processed sptSet[u] = true; // Update dist value of the adjacent // vertices of the picked vertex. for (int v = 0; v < V; v++) // Update dist[v] only if is not in // sptSet, there is an edge from u // to v, and total weight of path // from src to v through u is smaller // than current value of dist[v] if (!sptSet[v] && graph[u, v] != 0 && dist[u] != int.MaxValue && dist[u] + graph[u, v] < dist[v]) dist[v] = dist[u] + graph[u, v]; } // print the constructed distance array printSolution(dist); } // Driver's Code public static void Main() { /* Let us create the example graph discussed above */ int[, ] graph = new int[, ] { { 0, 4, 0, 0, 0, 0, 0, 8, 0 }, { 4, 0, 8, 0, 0, 0, 0, 11, 0 }, { 0, 8, 0, 7, 0, 4, 0, 0, 2 }, { 0, 0, 7, 0, 9, 14, 0, 0, 0 }, { 0, 0, 0, 9, 0, 10, 0, 0, 0 }, { 0, 0, 4, 14, 10, 0, 2, 0, 0 }, { 0, 0, 0, 0, 0, 2, 0, 1, 6 }, { 8, 11, 0, 0, 0, 0, 1, 0, 7 }, { 0, 0, 2, 0, 0, 0, 6, 7, 0 } }; GFG t = new GFG(); // Function call t.dijkstra(graph, 0); } } // This code is contributed by ChitraNayal> Javascript // A Javascript program for Dijkstra's single // source shortest path algorithm. // The program is for adjacency matrix // representation of the graph let V = 9; // A utility function to find the // vertex with minimum distance // value, from the set of vertices // not yet included in shortest // path tree function minDistance(dist,sptSet) { // Initialize min value let min = Number.MAX_VALUE; let min_index = -1; for(let v = 0; v < V; v++) { if (sptSet[v] == false && dist[v] <= min) { min = dist[v]; min_index = v; } } return min_index; } // A utility function to print // the constructed distance array function printSolution(dist) { console.log('Vertex Distance from Source '); for(let i = 0; i < V; i++) { console.log(i + ' ' + dist[i] + ' '); } } // Function that implements Dijkstra's // single source shortest path algorithm // for a graph represented using adjacency // matrix representation function dijkstra(graph, src) { let dist = new Array(V); let sptSet = new Array(V); // Initialize all distances as // INFINITE and stpSet[] as false for(let i = 0; i < V; i++) { dist[i] = Number.MAX_VALUE; sptSet[i] = false; } // Distance of source vertex // from itself is always 0 dist[src] = 0; // Find shortest path for all vertices for(let count = 0; count < V - 1; count++) { // Pick the minimum distance vertex // from the set of vertices not yet // processed. u is always equal to // src in first iteration. let u = minDistance(dist, sptSet); // Mark the picked vertex as processed sptSet[u] = true; // Update dist value of the adjacent // vertices of the picked vertex. for(let v = 0; v < V; v++) { // Update dist[v] only if is not in // sptSet, there is an edge from u // to v, and total weight of path // from src to v through u is smaller // than current value of dist[v] if (!sptSet[v] && graph[u][v] != 0 && dist[u] != Number.MAX_VALUE && dist[u] + graph[u][v] < dist[v]) { dist[v] = dist[u] + graph[u][v]; } } } // Print the constructed distance array printSolution(dist); } // Driver code let graph = [ [ 0, 4, 0, 0, 0, 0, 0, 8, 0 ], [ 4, 0, 8, 0, 0, 0, 0, 11, 0 ], [ 0, 8, 0, 7, 0, 4, 0, 0, 2 ], [ 0, 0, 7, 0, 9, 14, 0, 0, 0], [ 0, 0, 0, 9, 0, 10, 0, 0, 0 ], [ 0, 0, 4, 14, 10, 0, 2, 0, 0], [ 0, 0, 0, 0, 0, 2, 0, 1, 6 ], [ 8, 11, 0, 0, 0, 0, 1, 0, 7 ], [ 0, 0, 2, 0, 0, 0, 6, 7, 0 ] ] dijkstra(graph, 0); // This code is contributed by rag2127> Izhod
Vertex Distance from Source 0 0 1 4 2 12 3 19 4 21 5 11 6 9 7 8 8 14>
Časovna zapletenost: O(V2)
Pomožni prostor: O(V)
Opombe:
- Koda izračuna najkrajšo razdaljo, vendar ne izračuna informacij o poti. Ustvarite nadrejeno matriko, posodobite nadrejeno matriko, ko je razdalja posodobljena, in jo uporabite za prikaz najkrajše poti od izvora do različnih točk.
- Čas Zahtevnost izvedbe je O(V 2 ) . Če je vnos graf je predstavljen s seznamom sosednosti , ga je mogoče zmanjšati na O(E * log V) s pomočjo binarne kopice. Prosim poglej Dijkstrajev algoritem za predstavitev seznama sosednosti za več podrobnosti.
- Dijkstrajev algoritem ne deluje za grafe z negativnimi utežnimi cikli.
Zakaj Dijkstrovi algoritmi ne uspejo za grafe z negativnimi robovi?
Težava z negativnimi utežmi izhaja iz dejstva, da Dijkstrajev algoritem predpostavlja, da ko je vozlišče dodano naboru obiskanih vozlišč, je njegova razdalja dokončna in se ne bo spremenila. Vendar pa lahko ob prisotnosti negativnih uteži ta predpostavka vodi do napačnih rezultatov.
Za primer si oglejte naslednji graf:

V zgornjem grafu je A izvorno vozlišče med robovi A do B in A do C , A do B je manjša utež in Dijkstra dodeli najkrajšo razdaljo B kot 2, ampak zaradi obstoja negativnega roba od C do B , se dejanska najkrajša razdalja zmanjša na 1, česar Dijkstra ne zazna.
Opomba: Uporabljamo Bellman Fordov algoritem najkrajše poti v primeru, da imamo v grafu negativne robove.
Uporaba Dijkstrinega algoritma Seznam sosednosti v O(E logV):
Za Dijkstrajev algoritem je vedno priporočljiva uporaba Kadarkoli se razdalja vozlišča zmanjša, dodamo še en primerek vozlišča v priority_queue. Tudi če obstaja več primerkov, upoštevamo samo primer z minimalno razdaljo in zanemarimo druge primere.
Časovna zapletenost ostaja O(E * LogV) ker bo v prednostni čakalni vrsti največ O(E) točk in je O(logE) enako O(logV)
Spodaj je izvedba zgornjega pristopa:
C++ // C++ Program to find Dijkstra's shortest path using // priority_queue in STL #include using namespace std; #define INF 0x3f3f3f3f // iPair ==>Integer Pair typedef par iPair; // Ta razred predstavlja usmerjen graf z uporabo // seznama sosednosti reprezentančni razred Graph { int V; // Število tock // V uteženem grafu moramo shraniti točko // in par uteži za vsak seznam robov>* adj; javno: Graf(int V); // Konstruktor // funkcija za dodajanje roba grafu void addEdge(int u, int v, int w); // natisne najkrajšo pot iz s void shortestPath(int s); }; // Dodeli pomnilnik za seznam sosednosti Graph::Graph(int V) { this->V = V; adj = nov seznam [V]; } void Graph::addEdge(int u, int v, int w) { adj[u].push_back(make_pair(v, w)); adj[v].push_back(make_pair(u, w)); } // Natisne najkrajše poti od src do vseh drugih točk void Graph::shortestPath(int src) { // Ustvari prednostno čakalno vrsto za shranjevanje točk, ki // so v predobdelavi. To je čudna sintaksa v C++. // Glejte spodnjo povezavo za podrobnosti te sintakse // https://www.techcodeview.com priority_queue , večji > pq; // Ustvarite vektor za razdalje in inicializirajte vse // razdalje kot neskončni (INF) vektor dist(V, INF); // Vstavi sam vir v prednostno čakalno vrsto in inicializira // njegovo razdaljo kot 0. pq.push(make_pair(0, src)); dist[src] = 0; /* Vrtenje v zanko, dokler prednostna čakalna vrsta ne postane prazna (ali vse razdalje niso dokončane) */ while (!pq.empty()) { // Prva točka v paru je najmanjša razdalja // točka, ekstrahirajte jo iz prednostne čakalne vrste. // oznaka vozlišča je shranjena v drugem paru (to // je treba storiti tako, da ohranimo // razvrščeno razdaljo med vozlišči (razdalja mora biti prvi element // v paru) int u = pq.top().second; pq.pop(); // 'i' se uporablja za pridobitev vseh sosednjih točk // seznama točk>::iterator i; for (i = adj[u].begin(); i != adj[u].end(); ++i) { // Pridobi oznako vozlišča in težo trenutnega // sosednjega u. int v = (*i).prvi; int teža = (*i).drugo; // Če je skrajšana pot do v skozi u. if (dist[v]> dist[u] + teža) { // Posodabljanje razdalje v dist[v] = dist[u] + teža; pq.push(make_pair(dist[v], v)); } } } // Natisni najkrajše razdalje, shranjene v dist[] printf('Razdalja vozlišča od vira
'); za (int i = 0; i< V; ++i) printf('%d %d
', i, dist[i]); } // Driver's code int main() { // create the graph given in above figure int V = 9; Graph g(V); // making above shown graph g.addEdge(0, 1, 4); g.addEdge(0, 7, 8); g.addEdge(1, 2, 8); g.addEdge(1, 7, 11); g.addEdge(2, 3, 7); g.addEdge(2, 8, 2); g.addEdge(2, 5, 4); g.addEdge(3, 4, 9); g.addEdge(3, 5, 14); g.addEdge(4, 5, 10); g.addEdge(5, 6, 2); g.addEdge(6, 7, 1); g.addEdge(6, 8, 6); g.addEdge(7, 8, 7); // Function call g.shortestPath(0); return 0; }>
Java import java.util.*; class Graph { private int V; private List> adj; Graf(int V) { this.V = V; adj = nov ArrayList(); za (int i = 0; i< V; i++) { adj.add(new ArrayList()); } } void addEdge(int u, int v, int w) { adj.get(u).add(new iPair(v, w)); adj.get(v).add(new iPair(u, w)); } void shortestPath(int src) { PriorityQueue pq = nova PriorityQueue(V, Comparator.comparingInt(o -> o.second)); int[] dist = novo int[V]; Arrays.fill(dist, Integer.MAX_VALUE); pq.add(nov iPair(0, src)); dist[src] = 0; medtem ko (!pq.isEmpty()) { int u = pq.poll().second; for (iPair v : adj.get(u)) { if (dist[v.first]> dist[u] + v.second) { dist[v.first] = dist[u] + v.second; pq.add(nov iPair(dist[v.prvi], v.prvi)); } } } System.out.println('Oddaljenost vozlišča od vira'); za (int i = 0; i< V; i++) { System.out.println(i + ' ' + dist[i]); } } static class iPair { int first, second; iPair(int first, int second) { this.first = first; this.second = second; } } } public class Main { public static void main(String[] args) { int V = 9; Graph g = new Graph(V); g.addEdge(0, 1, 4); g.addEdge(0, 7, 8); g.addEdge(1, 2, 8); g.addEdge(1, 7, 11); g.addEdge(2, 3, 7); g.addEdge(2, 8, 2); g.addEdge(2, 5, 4); g.addEdge(3, 4, 9); g.addEdge(3, 5, 14); g.addEdge(4, 5, 10); g.addEdge(5, 6, 2); g.addEdge(6, 7, 1); g.addEdge(6, 8, 6); g.addEdge(7, 8, 7); g.shortestPath(0); } }>
Python import heapq # iPair ==>Integer Pair iPair = tuple # Ta razred predstavlja usmerjen graf z # razredom predstavitve seznama sosednosti Graph: def __init__(self, V: int): # Konstruktor self.V = V self.adj = [[] for _ in range(V )] def addEdge(self, u: int, v: int, w: int): self.adj[u].append((v, w)) self.adj[v].append((u, w)) # Natisne najkrajše poti od src do vseh drugih točk def shortestPath(self, src: int): # Ustvari prednostno čakalno vrsto za shranjevanje točk, # ki so v predobdelavi pq = [] heapq.heappush(pq, (0, src)) # Ustvarite vektor za razdalje in inicializirajte vse # razdalje kot neskončne (INF) dist = [float('inf')] * self.V dist[src] = 0 medtem ko je pq: # Prva točka v paru je najmanjša razdalja # vozlišče, izvlecite ga iz prednostne čakalne vrste. # Oznaka vozlišča je shranjena v drugem paru d, u = heapq.heappop(pq) # 'i' se uporablja za pridobitev vseh sosednjih vozlišč # vozlišča za v, teža v self.adj[u]: # Če do v je skrajšana pot skozi u. if dist[v]> dist[u] + weight: # Posodabljanje razdalje v dist[v] = dist[u] + weight heapq.heappush(pq, (dist[v], v)) # Natisni najkrajše razdalje, shranjene v dist[] for i in range(self.V): print(f'{i} {dist[i]}') # Koda voznika if __name__ == '__main__': # izdelava grafa, podanega na zgornji sliki V = 9 g = Graph(V) # izdelava zgoraj prikazanega grafa g.addEdge(0, 1, 4) g.addEdge(0, 7, 8) g.addEdge(1, 2, 8) g.addEdge(1, 7, 11) g.addEdge(2, 3, 7) g.addEdge(2, 8, 2) g.addEdge(2, 5, 4) g.addEdge(3, 4, 9) g.addEdge(3, 5, 14) g.addEdge(4, 5, 10) g.addEdge(5, 6, 2) g.addEdge(6, 7, 1) g.addEdge(6, 8, 6) g.addEdge(7, 8, 7) g.shortestPath(0)> C# using System; using System.Collections.Generic; // This class represents a directed graph using // adjacency list representation public class Graph { private const int INF = 2147483647; private int V; private List [] adj; public Graph(int V) { // Št. vozlišč this.V = V; // V uteženem grafu moramo shraniti oglišče // in utežni par za vsak rob this.adj = new List [V]; za (int i = 0; i< V; i++) { this.adj[i] = new List (); } } public void AddEdge(int u, int v, int w) { this.adj[u].Add(new int[] { v, w }); this.adj[v].Add(novo int[] { u, w }); } // Natisne najkrajše poti od src do vseh drugih točk public void ShortestPath(int src) { // Ustvari prednostno čakalno vrsto za shranjevanje točk, // ki so v predobdelavi. SortedSet pq = nov RazvrščenSet (novo DistanceComparer()); // Ustvari niz za razdalje in inicializiraj vse // razdalje kot neskončne (INF) int[] dist = new int[V]; za (int i = 0; i< V; i++) { dist[i] = INF; } // Insert source itself in priority queue and initialize // its distance as 0. pq.Add(new int[] { 0, src }); dist[src] = 0; /* Looping till priority queue becomes empty (or all distances are not finalized) */ while (pq.Count>0) { // Prva točka v paru je najmanjša razdalja // točka, ekstrahirajte jo iz prednostne čakalne vrste. // oznaka vozlišča je shranjena v drugem paru (to // je treba narediti na ta način, da ohranimo vozlišča // razvrščena po razdalji) int[] minDistVertex = pq.Min; pq.Odstrani(minDistVertex); int u = minDistVertex[1]; // 'i' se uporablja za pridobitev vseh sosednjih tock // tocke foreach (int[] adjVertex in this.adj[u]) { // Pridobi oznako tocke in težo trenutne // tocke, ki je sosednja u. int v = adjVertex[0]; int teža = adjVertex[1]; // Če obstaja krajša pot do v skozi u. if (dist[v]> dist[u] + teža) { // Posodabljanje razdalje v dist[v] = dist[u] + teža; pq.Add(novo int[] { dist[v], v }); } } } // Natisni najkrajše razdalje, shranjene v dist[] Console.WriteLine('Razdalja vozlišča od vira'); za (int i = 0; i< V; ++i) Console.WriteLine(i + ' ' + dist[i]); } private class DistanceComparer : IComparer { public int Compare(int[] x, int[] y) { if (x[0] == y[0]) { return x[1] - y[1]; } vrni x[0] - y[0]; } } } public class Program { // Koda gonilnika public static void Main() { // ustvari graf, podan na zgornji sliki int V = 9; Graf g = nov graf(V); // izdelava zgoraj prikazanega grafa g.AddEdge(0, 1, 4); g.AddEdge(0, 7, 8); g.AddEdge(1, 2, 8); g.AddEdge(1, 7, 11); g.AddEdge(2, 3, 7); g.AddEdge(2, 8, 2); g.AddEdge(2, 5, 4); g.AddEdge(3, 4, 9); g.AddEdge(3, 5, 14); g.AddEdge(4, 5, 10); g.AddEdge(5, 6, 2); g.AddEdge(6, 7, 1); g.AddEdge(6, 8, 6); g.AddEdge(7, 8, 7); g.NajkrajšaPot(0); } } // to kodo je prispeval bhardwajji> Javascript // javascript Program to find Dijkstra's shortest path using // priority_queue in STL const INF = 2147483647; // This class represents a directed graph using // adjacency list representation class Graph { constructor(V){ // No. of vertices this.V = V; // In a weighted graph, we need to store vertex // and weight pair for every edge this.adj = new Array(V); for(let i = 0; i < V; i++){ this.adj[i] = new Array(); } } addEdge(u, v, w) { this.adj[u].push([v, w]); this.adj[v].push([u, w]); } // Prints shortest paths from src to all other vertices shortestPath(src) { // Create a priority queue to store vertices that // are being preprocessed. This is weird syntax in C++. // Refer below link for details of this syntax // https://www.techcodeview.com let pq = []; // Create a vector for distances and initialize all // distances as infinite (INF) let dist = new Array(V).fill(INF); // Insert source itself in priority queue and initialize // its distance as 0. pq.push([0, src]); dist[src] = 0; /* Looping till priority queue becomes empty (or all distances are not finalized) */ while (pq.length>0) { // Prva točka v paru je najmanjša razdalja // točka, ekstrahirajte jo iz prednostne čakalne vrste. // oznaka vozlišča je shranjena v drugo od para (to // je treba storiti na ta način, da ohranimo točke // razvrščene razdalje (razdalja mora biti prvi element // v paru) let u = pq[0][1]; pq.shift(); // 'i' se uporablja za pridobitev vseh sosednjih tock // tocke for(let i = 0; i< this.adj[u].length; i++){ // Get vertex label and weight of current // adjacent of u. let v = this.adj[u][i][0]; let weight = this.adj[u][i][1]; // If there is shorted path to v through u. if (dist[v]>dist[u] + teža) { // Posodabljanje razdalje v dist[v] = dist[u] + teža; pq.push([dist[v], v]); pq.sort((a, b) =>{ if(a[0] == b[0]) return a[1] - b[1]; return a[0] - b[0]; }); } } } // Natisni najkrajše razdalje, shranjene v dist[] console.log('Razdalja vozlišča od vira'); za (naj bo i = 0; i< V; ++i) console.log(i, ' ', dist[i]); } } // Driver's code // create the graph given in above figure let V = 9; let g = new Graph(V); // making above shown graph g.addEdge(0, 1, 4); g.addEdge(0, 7, 8); g.addEdge(1, 2, 8); g.addEdge(1, 7, 11); g.addEdge(2, 3, 7); g.addEdge(2, 8, 2); g.addEdge(2, 5, 4); g.addEdge(3, 4, 9); g.addEdge(3, 5, 14); g.addEdge(4, 5, 10); g.addEdge(5, 6, 2); g.addEdge(6, 7, 1); g.addEdge(6, 8, 6); g.addEdge(7, 8, 7); // Function call g.shortestPath(0); // The code is contributed by Nidhi goel.> Izhod
Vertex Distance from Source 0 0 1 4 2 12 3 19 4 21 5 11 6 9 7 8 8 14>
Časovna zapletenost: O(E * logV), kjer je E število robov in V število oglišč.
Pomožni prostor: O(V)
Uporaba Dijkstrinega algoritma:
- Google zemljevidi uporablja algoritem Dijkstra za prikaz najkrajše razdalje med izvorom in ciljem.
- noter računalniško mreženje , je Dijkstrajev algoritem osnova za različne usmerjevalne protokole, kot sta OSPF (najprej odpri najkrajšo pot) in IS-IS (vmesni sistem do vmesnega sistema).
- Sistemi za promet in upravljanje prometa uporabljajo Dijkstrajev algoritem za optimizacijo pretoka prometa, zmanjšanje zastojev in načrtovanje najučinkovitejših poti za vozila.
- Letalske družbe uporabljajo Dijkstrajev algoritem za načrtovanje poti letenja, ki zmanjšujejo porabo goriva in čas potovanja.
- Dijkstrajev algoritem se uporablja pri avtomatizaciji elektronskega načrtovanja za usmerjanje povezav na integriranih vezjih in čipih za integracijo zelo velikega obsega (VLSI).
Za podrobnejšo razlago glejte ta članek Dijkstrajev algoritem najkrajše poti z uporabo priority_queue STL .





