Kun on annettu painotettu graafi ja kaavion lähdepiste, etsi lyhyimmät polut lähteestä kaikkiin muihin annetun graafin pisteisiin.
Huomautus: Annettu graafi ei sisällä negatiivista reunaa.
Esimerkkejä:
Suositeltu käytäntö Dijkstra-algoritmin käyttöönotolle Kokeile!Syöte: src = 0, kaavio näkyy alla.
Lähtö: 0 4 12 19 21 11 9 8 14
Selitys: Etäisyys 0 - 1 = 4.
Pienin etäisyys 0-2 = 12. 0->1->2
Pienin etäisyys 0-3 = 19. 0->1->2->3
Pienin etäisyys 0-4 = 21. 0->7->6->5->4
Pienin etäisyys 0-5 = 11. 0->7->6->5
Pienin etäisyys 0-6 = 9. 0->7->6
Minimietäisyys 0-7 = 8. 0->7
Pienin etäisyys 0-8 = 14. 0->1->2->8
Dijkstran algoritmi Vierekkäisyysmatriisi :
Ajatuksena on luoda a SPT (lyhyin polkupuu) tietyn lähteen juurena. Ylläpidä vierekkäisyysmatriisia kahdella sarjalla,
- yksi joukko sisältää pisteitä, jotka sisältyvät lyhimmän polun puuhun,
- toinen joukko sisältää kärjet, jotka eivät vielä sisälly lyhimmän polun puuhun.
Etsi jokaisessa algoritmin vaiheessa kärkipiste, joka on toisessa joukossa (joukko ei vielä sisälly) ja jolla on vähimmäisetäisyys lähteestä.
Algoritmi :
- Luo sarja sptSet (lyhyin polkupuujoukko), joka pitää kirjaa lyhimmän polun puun pisteistä, eli joiden minimietäisyys lähteestä lasketaan ja viimeistellään. Aluksi tämä sarja on tyhjä.
- Määritä etäisyysarvo kaikille syötekaavion kärjeille. Alusta kaikki etäisyysarvot muodossa ÄÄRETÖN . Anna lähdepisteen etäisyysarvoksi 0, jotta se valitaan ensin.
- Sillä aikaa sptSet ei sisällä kaikkia huippuja
- Valitse huippupiste sisään joka ei ole siellä sptSet ja sillä on vähimmäisetäisyysarvo.
- Sisällytä sinut sptSet .
- Päivitä sitten kaikkien vierekkäisten kärkien etäisyysarvo sisään .
- Päivitä etäisyysarvot iteroimalla kaikkien vierekkäisten kärkien läpi.
- Jokaiselle viereiselle kärkipisteelle sisään, jos etäisyyden arvon summa sisään (lähteestä) ja reunan paino u-v , on pienempi kuin etäisyyden arvo sisään , päivitä sitten etäisyysarvo sisään .
Huomautus: Käytämme boolen taulukkoa sptSet[] edustamaan joukkoon sisältyviä pisteitä SPT . Jos arvo sptSet[v] on totta, silloin kärki v sisältyy SPT , muuten ei. Array dist[] käytetään tallentamaan kaikkien pisteiden lyhimmän etäisyyden arvot.
Kuva Dijkstra-algoritmista :
Ymmärtääksesi Dijkstran algoritmin, ota kaavio ja etsi lyhin polku lähteestä kaikkiin solmuihin.
Harkitse alla olevaa kuvaajaa ja src = 0
Vaihe 1:
- Setti sptSet on alun perin tyhjä ja pisteille määritetyt etäisyydet ovat 0, INF, INF, INF, INF, INF, INF, INF} missä INF osoittaa ääretöntä.
- Valitse nyt huippupiste, jolla on pienin etäisyysarvo. Vertex 0 on valittu, sisällytä se sptSet . Niin sptSet muuttuu {0}. Kun olet sisällyttänyt 0 - sptSet , päivittää vierekkäisten kärkien etäisyysarvot.
- Arvon 0 vierekkäiset kärjet ovat 1 ja 7. Etäisyysarvot 1 ja 7 päivitetään arvoiksi 4 ja 8.
Seuraava alikaavio näyttää kärjet ja niiden etäisyysarvot, näytetään vain kärjet, joilla on äärelliset etäisyysarvot. Mukana olevat kärjet SPT näkyvät vihreä väri.
Vaihe 2:
- Valitse huippupiste, jolla on pienin etäisyysarvo ja joka ei vielä sisälly SPT (ei mukana sptSET ). Vertex 1 valitaan ja lisätään siihen sptSet .
- Niin sptSet muuttuu nyt {0, 1}. Päivitä 1:n vierekkäisten kärkien etäisyysarvot.
- Vertexin 2 etäisyysarvo tulee 12 .
Vaihe 3:
- Valitse huippupiste, jolla on pienin etäisyysarvo ja joka ei vielä sisälly SPT (ei mukana sptSET ). Vertex 7 on poimittu. Niin sptSet nyt tulee 0, 1, 7}.
- Päivitä 7:n vierekkäisten pisteiden etäisyysarvot. Huippupisteiden 6 ja 8 etäisyysarvosta tulee äärellinen ( 15 ja 9 vastaavasti).
Vaihe 4:
- Valitse huippupiste, jolla on pienin etäisyysarvo ja joka ei vielä sisälly SPT (ei mukana sptSET ). Vertex 6 on poimittu. Niin sptSet nyt tulee 0, 1, 7, 6} .
- Päivitä 6:n viereisten kärkien etäisyysarvot. Huippupisteiden 5 ja 8 etäisyysarvot päivitetään.
Toistamme yllä olevat vaiheet, kunnes sptSet sisältää kaikki annetun graafin kärjet. Lopuksi saamme seuraavan S Horst Path Tree (SPT).
Alla on yllä olevan lähestymistavan toteutus:
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 ja sptSet[y] == Väärä ja dist[y]> dist[x] + self.graph[x][y]: dist[y] = dist[x] + self.graph[x][y] self.printSolution(dist) # Ohjaimen koodi if __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) # Tämän koodin on tuottanut Divyanshu Mehta ja päivittänyt 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> Lähtö
Vertex Distance from Source 0 0 1 4 2 12 3 19 4 21 5 11 6 9 7 8 8 14>
Aika monimutkaisuus: O(V2)
Aputila: O(V)
Huomautuksia:
- Koodi laskee lyhimmän etäisyyden, mutta ei laske polkutietoja. Luo päätaulukko, päivitä päätaulukko, kun etäisyys päivitetään, ja käytä sitä näyttämään lyhimmän polun lähteestä eri kärkipisteisiin.
- Aika Toteutuksen monimutkaisuus on O(V 2 ) . Jos syöttö kaavio esitetään vierekkäisyysluettelon avulla , se voidaan pelkistää arvoon O(E * log V) binäärikeon avulla. Ole hyvä ja katso Dijkstran algoritmi vierekkäisyysluettelon esittämiseen Lisätietoja.
- Dijkstran algoritmi ei toimi kaavioissa, joissa on negatiivinen painosykli.
Miksi Dijkstran algoritmit epäonnistuvat kaavioissa, joissa on negatiiviset reunat?
Negatiivisten painojen ongelma johtuu siitä tosiasiasta, että Dijkstran algoritmi olettaa, että kun solmu lisätään vierailtujen solmujen joukkoon, sen etäisyys on viimeistelty eikä muutu. Negatiivisten painojen ollessa kyseessä tämä oletus voi kuitenkin johtaa vääriin tuloksiin.
Harkitse esimerkkiä seuraavaa kaaviota:

Yllä olevassa kaaviossa A on lähdesolmu reunojen joukossa A to B ja A to C , A to B on pienempi paino ja Dijkstra määrittää lyhimmän etäisyyden B kuin 2, mutta negatiivisen reunan olemassaolon takia C to B , todellinen lyhin etäisyys pienenee 1:ksi, jota Dijkstra ei havaitse.
Huomautus: Käytämme Bellman Fordin lyhimmän polun algoritmi jos meillä on negatiiviset reunat kaaviossa.
Dijkstran algoritmi Lähialueiden luettelo O(E logV):
Dijkstran algoritmille on aina suositeltavaa käyttää Aina kun kärjen etäisyyttä pienennetään, lisäämme vielä yhden kärjen esiintymän prioriteettijonoon. Vaikka esiintymiä olisi useita, otamme huomioon vain esiintymän, jonka etäisyys on pieni, ja jätämme huomioimatta muut ilmentymät.
Aika monimutkaisuus säilyy O(E * LogV) koska prioriteettijonossa on enintään O(E) kärkeä ja O(logE) on sama kuin O(logV)
Alla on yllä olevan lähestymistavan toteutus:
C++ // C++ Program to find Dijkstra's shortest path using // priority_queue in STL #include using namespace std; #define INF 0x3f3f3f3f // iPair ==>Kokonaislukupari typedef pari iPair; // Tämä luokka edustaa suunnattua graafia käyttäen // vierekkäisyysluettelon esitysluokka Graph { int V; // Piikkien lukumäärä // Painotetussa graafissa meidän on tallennettava kärkipiste // ja painopari jokaiselle reunalistalle>> adj; julkinen: Graph(int V); // Rakentaja // funktio reunan lisäämiseksi graafiin void addEdge(int u, int v, int w); // tulostaa lyhimmän polun kohteesta s void shortestPath(int s); }; // Varaa muistia viereisyysluettelolle Graph::Graph(int V) { this->V = V; adj = uusi lista [V]; } void Graph::lisääEdge(int u, int v, int w) { adj[u].push_back(make_pair(v, w)); adj[v].push_back(make_pair(u, w)); } // Tulostaa lyhyimmät polut src:stä kaikkiin muihin pisteisiin void Graph::shortestPath(int src) { // Luo prioriteettijono esikäsiteltyjen pisteiden // tallentamiseen. Tämä on outo syntaksi C++:ssa. // Katso tämän syntaksin yksityiskohdat alla olevasta linkistä // https://www.techcodeview.com priority_queue , suurempi > pq; // Luo vektori etäisyyksille ja alusta kaikki // etäisyydet äärettömäksi (INF) vektoriksi dist(V, INF); // Lisää itse lähde prioriteettijonoon ja alusta // sen etäisyys 0:ksi. pq.push(make_pair(0, src)); dist[src] = 0; /* Silmukka, kunnes prioriteettijonosta tulee tyhjä (tai kaikkia etäisyyksiä ei ole viimeistelty) */ while (!pq.empty()) { // Ensimmäinen parin kärkipiste on minimietäisyys // kärki, erota se prioriteettijonosta. // vertex label tallennetaan parin toiseksi (se // täytyy tehdä tällä tavalla, jotta kärjet säilyvät // lajiteltuna etäisyyden (etäisyyden on oltava ensimmäinen kohde // parissa) int u = pq.top().second; pq.pop(); // 'i' käytetään saamaan // kärkiluettelon kaikki vierekkäiset pisteet>::iteraattori i; for (i = adj[u].begin(); i != adj[u].end(); ++i) { // Hae u:n vieressä olevan virran huippupiste ja paino //. int v = (*i).ensimmäinen; int paino = (*i).sekunti; // Jos polku v:ään on oikosulussa u:n kautta. if (dist[v]> dist[u] + paino) { // V:n päivitysetäisyys dist[v] = dist[u] + paino; pq.push(make_pair(dist[v], v)); } } } // Tulosta lyhyimmät etäisyydet, jotka on tallennettu dist[] printf('Vertex Distance from Source
'); for (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; Kaavio(int V) { this.V = V; adj = new ArrayList(); for (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 = new PriorityQueue(V, Comparator.comparingInt(o -> o.second)); int[] dist = uusi int[V]; Arrays.fill(dist, Integer.MAX_VALUE); pq.add(new iPair(0, src)); dist[src] = 0; while (!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(new iPair(dist[v.first], v.first)); } } } System.out.println('Vertex Distance from Source'); for (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 ==>Kokonaislukupari iPair = tuple # Tämä luokka edustaa suunnattua kuvaajaa, jossa käytetään # vierekkäisyysluettelon esitysluokkaa Kaavio: def __init__(self, V: int): # Konstruktori self.V = V self.adj = [[] for _ in range(V) )] def addEdge(self, u: int, v: int, w: int): itse.adj[u].append((v, w)) self.adj[v].append((u, w)) # Tulostaa lyhyimmät polut src:stä kaikkiin muihin pisteisiin def shortestPath(self, src: int): # Luo prioriteettijono tallentaaksesi kärjet, jotka # ovat esikäsitelty pq = [] heapq.heappush(pq, (0, src)) # Luo vektori etäisyyksille ja alusta kaikki # etäisyydet äärettömäksi (INF) dist = [float('inf')] * self.V dist[src] = 0, kun taas pq: # Parin ensimmäinen kärki on pienin etäisyys # vertex, pura se prioriteettijonosta. # vertex label tallennetaan parin d toiseksi, u = heapq.heappop(pq) # 'i' käytetään saamaan kaikki vierekkäiset # kärjen pisteet v:lle, paino itse.adj[u]:ssa: # Jos polku v:hen on oikosulussa u:n kautta. if dist[v]> dist[u] + paino: # Päivitetään v:n etäisyys dist[v] = dist[u] + paino heapq.heappush(pq, (dist[v], v)) # Tulosta lyhyimmät etäisyydet, jotka on tallennettu dist[] for i in range(self.V): print(f'{i} {dist[i]}') # Ohjaimen koodi if __name__ == '__main__': # luo yllä olevassa kuvassa oleva kaavio V = 9 g = Graafi(V) # luo yllä oleva kaavio 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) { // Vertisien lukumäärä this.V = V; // Painotetussa graafissa meidän on tallennettava kärkipiste // ja painopari jokaiselle reunalle this.adj = new List [V]; for (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(new int[] { u, w }); } // Tulostaa lyhyimmat polut src:stä kaikkiin muihin pisteisiin public void Lyhyin polku(int src) { // Luo prioriteettijono esikäsiteltyjen pisteiden // tallentamiseen. LajiteltuSet pq = uusi lajiteltu sarja (uusi DistanceComparer()); // Luo taulukko etäisyyksille ja alusta kaikki // etäisyydet äärettömäksi (INF) int[] dist = new int[V]; for (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) { // Ensimmäinen parin kärkipiste on minimietäisyys // kärki, poimi se prioriteettijonosta. // vertex label on tallennettu parin toiseen (se // täytyy tehdä näin, jotta kärjet // etäisyyden mukaan lajitellaan) int[] minDistVertex = pq.Min; pq.Remove(minDistVertex); int u = minDistVertex[1]; // Komentoa 'i' käytetään saamaan kaikki // vertexin viereiset kärjet foreach (int[] adjVertex tässä.adj[u]) { // Hae u:n vieressä olevan vertexin nimi ja paino //. int v = adjVertex[0]; int paino = adjVertex[1]; // Jos on lyhyempi polku v:ään u:n kautta. if (dist[v]> dist[u] + paino) { // V:n päivitysetäisyys dist[v] = dist[u] + paino; pq.Add(new int[] { dist[v], v }); } } } // Tulosta lyhyimmät etäisyydet, jotka on tallennettu dist[] Console.WriteLine('Vertex Distance from Source'); for (int i = 0; i< V; ++i) Console.WriteLine(i + ' ' + dist[i]); } private class DistanceComparer : IComparer { public int Vertaa(int[] x, int[] y) { if (x[0] == y[0]) { return x[1] - y[1]; } palauttaa x[0] - y[0]; } } } public class Ohjelma { // Ohjainkoodi public static void Main() { // luo yllä olevan kuvan kaavio int V = 9; Kuvaaja g = uusi Kuvaaja(V); // yllä olevan graafin tekeminen 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); } } // tämän koodin tarjoaa 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) { // Ensimmäinen parin kärkipiste on minimietäisyys // kärki, poimi se prioriteettijonosta. // vertex label tallennetaan parin toiseksi (se // täytyy tehdä tällä tavalla, jotta kärjet säilyvät // lajiteltuna etäisyyden (etäisyyden on oltava ensimmäinen kohde // parissa) olkoon u = pq[0][1]; pq.shift(); // 'i' käytetään saamaan kaikki vierekkäiset kärkipisteet for(olkoon 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] + paino) { // Päivitetään v:n etäisyys dist[v] = dist[u] + paino; pq.push([dist[v], v]); pq.sort((a, b) =>{ if(a[0] == b[0]) return a[1] - b[1]; return a[0] - b[0]; }); } } } // Tulosta lyhyimmät etäisyydet, jotka on tallennettu dist[] console.log('Vertex Distance from Source'); for (olkoon 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.> Lähtö
Vertex Distance from Source 0 0 1 4 2 12 3 19 4 21 5 11 6 9 7 8 8 14>
Aika monimutkaisuus: O(E * logV), jossa E on reunojen lukumäärä ja V on kärkien lukumäärä.
Aputila: O(V)
Dijkstran algoritmin sovellukset:
- Google Kartat käyttää Dijkstra-algoritmia näyttääkseen lyhimmän etäisyyden lähteen ja määränpään välillä.
- Sisään tietokoneverkot Dijkstran algoritmi muodostaa perustan erilaisille reititysprotokolloille, kuten OSPF (Open Shortest Path First) ja IS-IS (Intermediate System to Intermediate System).
- Liikenne- ja liikenteenhallintajärjestelmät käyttävät Dijkstran algoritmia liikenteen sujuvuuden optimointiin, ruuhkien minimoimiseen ja ajoneuvojen tehokkaimpien reittien suunnitteluun.
- Lentoyhtiöt käyttävät Dijkstran algoritmia suunnitellakseen lentoreittejä, jotka minimoivat polttoaineenkulutuksen ja lyhentävät matka-aikaa.
- Dijkstran algoritmia käytetään elektronisessa suunnitteluautomaatiossa integroitujen piirien yhteyksien reitittämiseen ja erittäin suuren mittakaavan integraatiopiirien (VLSI) piiriin.
Katso tarkempi selitys tästä artikkelista Dijkstran lyhimmän polun algoritmi, joka käyttää STL:n prioriteettijonoa .
kartoitus koneella





