Atsižvelgdami į svertinį grafiką ir grafiko šaltinio viršūnę, raskite trumpiausi keliai nuo šaltinio iki visų kitų duotojo grafiko viršūnių.
Pastaba: Pateiktame grafike nėra neigiamos briaunos.
kuriais metais buvo išrastas kompiuteris
Pavyzdžiai:
Rekomenduojama Dijkstra algoritmo įgyvendinimo praktika Išbandykite!Įvestis: src = 0, grafikas parodytas žemiau.
Išvestis: 0 4 12 19 21 11 9 8 14
Paaiškinimas: Atstumas nuo 0 iki 1 = 4.
Mažiausias atstumas nuo 0 iki 2 = 12. 0->1->2
Mažiausias atstumas nuo 0 iki 3 = 19. 0->1->2->3
Mažiausias atstumas nuo 0 iki 4 = 21. 0->7->6->5->4
Mažiausias atstumas nuo 0 iki 5 = 11. 0->7->6->5
Mažiausias atstumas nuo 0 iki 6 = 9. 0->7->6
Mažiausias atstumas nuo 0 iki 7 = 8. 0->7
Mažiausias atstumas nuo 0 iki 8 = 14. 0->1->2->8
Dijkstros algoritmo naudojimas Gretimo matrica :
Idėja yra sukurti a SPT (trumpiausio kelio medis) su duotu šaltiniu kaip šaknimi. Išlaikyti gretimų matricą su dviem rinkiniais,
- viename rinkinyje yra viršūnių, įtrauktų į trumpiausio kelio medį,
- kitas rinkinys apima viršūnes, kurios dar neįtrauktos į trumpiausio kelio medį.
Kiekviename algoritmo žingsnyje suraskite viršūnę, kuri yra kitoje rinkinyje (rinkinys dar neįtrauktas) ir turi minimalų atstumą nuo šaltinio.
Algoritmas :
- Sukurkite rinkinį sptSet (trumpiausio kelio medžio rinkinys), kuris seka viršūnes, įtrauktas į trumpiausio kelio medį, t. y. kurių mažiausias atstumas nuo šaltinio yra apskaičiuojamas ir baigiamas. Iš pradžių šis rinkinys tuščias.
- Priskirkite atstumo reikšmę visoms įvesties grafiko viršūnėms. Inicijuoti visas atstumo reikšmes kaip BEGALINIS . Priskirkite šaltinio viršūnės atstumo reikšmę 0, kad ji būtų pasirinkta pirmiausia.
- Nors sptSet neapima visų viršūnių
- Pasirinkite viršūnę in to ten nėra sptSet ir turi minimalią atstumo reikšmę.
- Įtraukti jus į sptSet .
- Tada atnaujinkite visų gretimų viršūnių atstumo reikšmę in .
- Norėdami atnaujinti atstumo reikšmes, kartokite visas gretimas viršūnes.
- Kiekvienai gretimai viršūnei į, jei atstumo vertės suma in (iš šaltinio) ir krašto svoris u-v , yra mažesnė už atstumo reikšmę in , tada atnaujinkite atstumo reikšmę in .
Pastaba: Mes naudojame loginį masyvą sptSet[] kad pavaizduotų viršūnių, įtrauktų į SPT . Jei vertė sptSet[v] yra tiesa, tada viršūnė v įtraukiama į SPT , kitaip ne. Masyvas dist[] naudojamas visų viršūnių trumpiausioms atstumo reikšmėms išsaugoti.
Dijkstra algoritmo iliustracija :
Norėdami suprasti Dijkstra algoritmą, paimkite grafiką ir raskite trumpiausią kelią nuo šaltinio iki visų mazgų.
Apsvarstykite žemiau pateiktą grafiką ir src = 0
1 žingsnis:
- Rinkinys sptSet iš pradžių yra tuščias, o viršūnėms priskirti atstumai yra {0, INF, INF, INF, INF, INF, INF, INF} kur INF rodo begalybę.
- Dabar pasirinkite viršūnę su mažiausia atstumo reikšme. Parenkama viršūnė 0, įtraukite ją į ją sptSet . Taigi sptSet tampa {0}. Įtraukus 0 iki sptSet , atnaujinkite gretimų viršūnių atstumo reikšmes.
- Gretimos 0 viršūnės yra 1 ir 7. Atstumo reikšmės 1 ir 7 atnaujinamos kaip 4 ir 8.
Toliau pateiktame pografike rodomos viršūnės ir jų atstumo reikšmės, rodomos tik viršūnės su baigtinėmis atstumo reikšmėmis. Viršūnės, įtrauktos į SPT yra rodomi žalias spalva.
java int eilutėje
2 žingsnis:
- Pasirinkite viršūnę su mažiausia atstumo verte, kuri dar neįtraukta SPT (ne viduje sptSET ). 1 viršūnė parenkama ir pridedama prie jos sptSet .
- Taigi sptSet dabar tampa {0, 1}. Atnaujinkite gretimų viršūnių atstumo reikšmes 1.
- 2 viršūnės atstumo reikšmė tampa 12 .
3 veiksmas:pitono rūšiavimo korteles
- Pasirinkite viršūnę su mažiausia atstumo verte, kuri dar neįtraukta SPT (ne viduje sptSET ). Pasirinkta viršūnė 7. Taigi sptSet dabar tampa 0, 1, 7}.
- Atnaujinkite gretimų 7 viršūnių atstumo reikšmes. Viršūnių 6 ir 8 atstumo reikšmė tampa baigtinė ( 15 ir 9 atitinkamai).
4 veiksmas:
- Pasirinkite viršūnę su mažiausia atstumo verte, kuri dar neįtraukta SPT (ne viduje sptSET ). Pasirinkta viršūnė 6. Taigi sptSet dabar tampa 0, 1, 7, 6} .
- Atnaujinkite gretimų 6 viršūnių atstumo reikšmes. Atnaujinamos 5 ir 8 viršūnių atstumo reikšmės.
Kartojame aukščiau nurodytus veiksmus, kol sptSet apima visos duoto grafo viršūnės. Galiausiai gauname tokį S Hortest Path Tree (SPT).
Toliau pateikiamas pirmiau minėto metodo įgyvendinimas:
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 ir sptSet[y] == Netiesa ir dist[y]> dist[x] + self.graph[x][y]: dist[y] = dist[x] + self.graph[x][y] self.printSolution(dist) # Tvarkyklės kodas 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) # Šį kodą sukūrė Divyanshu Mehta ir atnaujino Pranav Singh Sambyal>>C# 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> Išvestis
Vertex Distance from Source 0 0 1 4 2 12 3 19 4 21 5 11 6 9 7 8 8 14>
Laiko sudėtingumas: O(V2)
Pagalbinė erdvė: O(V)
Pastabos:
- Kodas apskaičiuoja trumpiausią atstumą, bet neapskaičiuoja kelio informacijos. Sukurkite pirminį masyvą, atnaujinkite pirminį masyvą, kai atnaujinamas atstumas, ir naudokite jį, kad parodytumėte trumpiausią kelią nuo šaltinio iki skirtingų viršūnių.
- Laikas Įgyvendinimo sudėtingumas yra O(V 2 ) . Jei įvestis grafikas pavaizduotas naudojant gretimų sąrašą , jį galima sumažinti iki O(E * log V) dvejetainės krūvos pagalba. Prašau pažiūrėk Dijkstra algoritmas gretimų vietų sąrašui pateikti daugiau detalių.
- Dijkstra algoritmas neveikia grafikams su neigiamais svorio ciklais.
Kodėl Dijkstros algoritmai nepavyksta, kai grafikai turi neigiamus kraštus?
Neigiamų svorių problema kyla dėl to, kad Dijkstra algoritmas daro prielaidą, kad kai mazgas įtraukiamas į aplankytų mazgų rinkinį, jo atstumas yra galutinis ir nepasikeis. Tačiau, esant neigiamiems svoriams, ši prielaida gali lemti neteisingus rezultatus.
Kaip pavyzdį apsvarstykite toliau pateiktą grafiką:

Aukščiau pateiktame grafike A yra šaltinio mazgas tarp kraštų A į B ir A į C , A į B yra mažesnis svoris, o Dijkstra priskiria trumpiausią atstumą B kaip 2, bet dėl neigiamo krašto iš egzistavimo C į B , tikrasis trumpiausias atstumas sumažėja iki 1, kurio Dijkstra neaptinka.
Pastaba: Mes naudojame Bellmano Fordo trumpiausio kelio algoritmas tuo atveju, jei grafike turime neigiamų briaunų.
Dijkstros algoritmo naudojimas Gretimų sąrašas O(E logV):
Dijkstra algoritmui visada rekomenduojama naudoti Kaskart sumažinus viršūnės atstumą, į priority_queue pridedame dar vieną viršūnės egzempliorių. Net jei yra keli egzemplioriai, mes atsižvelgiame tik į egzempliorių su minimaliu atstumu ir nepaisome kitų atvejų.
Laiko sudėtingumas išlieka O(E * LogV) nes prioritetinėje eilėje bus daugiausia O(E) viršūnių, o O(logE) yra toks pat kaip O(logV)
Toliau pateikiamas pirmiau minėto metodo įgyvendinimas:
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 pora iPair; // Ši klasė vaizduoja nukreiptą grafiką naudojant // gretimų sąrašo reprezentacijos klasė Graph { int V; // Viršūnių skaičius // Svertiniame grafe turime išsaugoti kiekvieno briaunų sąrašo viršūnę // ir svorio porą>> adj; vieša: Grafas(int V); // Konstruktorius // funkcija pridėti briauną į grafiką void addEdge(int u, int v, int w); // spausdina trumpiausią kelią iš s void shortestPath(int s); }; // Skiria atmintį gretimų sąrašui Graph::Graph(int V) { this->V = V; adj = naujas sąrašas [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)); } // Spausdina trumpiausius kelius nuo src iki visų kitų viršūnių void Graph::shortestPath(int src) { // Sukurkite prioritetinę eilę viršūnėms, kurios // yra iš anksto apdorojamos, saugoti. Tai keista C++ sintaksė. // Norėdami sužinoti daugiau apie šią sintaksę, žr. toliau pateiktą nuorodą // https://www.techcodeview.com priority_queue , didesnis > pq; // Sukurkite atstumų vektorių ir inicijuokite visus // atstumus kaip begalinį (INF) vektorių dist(V, INF); // Įterpti patį šaltinį į prioritetinę eilę ir inicijuoti // jo atstumą kaip 0. pq.push(make_pair(0, src)); dist[src] = 0; /* Perėjimas, kol prioritetinė eilė tampa tuščia (arba visi atstumai nėra užbaigti) */ while (!pq.empty()) { // Pirmoji poros viršūnė yra mažiausias atstumas // viršūnė, ištraukite ją iš prioritetinės eilės. // viršūnių etiketė saugoma antroje poroje (tai // turi būti padaryta taip, kad viršūnės išliktų // surūšiuotas atstumas (atstumas turi būti pirmasis elementas // poroje) int u = pq.top().second; pq.pop(); // 'i' naudojamas visoms gretimoms // viršūnių sąrašo viršūnėms gauti>::iteratorius i; for (i = adj[u].begin(); i != adj[u].end(); ++i) { // Gauti viršūnės etiketę ir srovės svorį // greta u. int v = (*i).pirma; int svoris = (*i).sekundė; // Jei yra sutrumpintas kelias į v per u. if (dist[v]> dist[u] + svoris) { // Atnaujinamas v atstumas dist[v] = dist[u] + svoris; pq.push(make_pair(dist[v], v)); } } } // Spausdinti trumpiausius atstumus, saugomus dist[] printf('Vertex Distance from Source
'); už (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; Grafas(int V) { this.V = V; adj = naujas ArrayList(); už (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 = naujas int[V]; Masyvai.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'); už (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 ==>Sveikųjų skaičių pora iPair = korta # Ši klasė reiškia nukreiptą grafiką naudojant # gretimų sąrašo vaizdavimo klasę Grafikas: def __init__(self, V: int): # Konstruktorius self.V = V self.adj = [[] _ diapazone(V) )] def addEdge(self, u: int, v: int, w: int): self.adj[u].append((v, w)) self.adj[v].append((u, w)) # Spausdina trumpiausius kelius nuo src iki visų kitų viršūnių def shortestPath(self, src: int): # Sukurkite prioritetinę eilę viršūnėms, kurios # yra iš anksto apdorojamos, saugoti pq = [] heapq.heappush(pq, (0, src)) # Sukurkite atstumų vektorių ir inicijuokite visus # atstumus kaip begalinius (INF) dist = [float('inf')] * self.V dist[src] = 0, o pq: # Pirmoji poros viršūnė yra mažiausias atstumas # viršūnė, išskleiskite ją iš prioritetinės eilės. # viršūnės etiketė saugoma antroje poros d, u = heapq.heappop(pq) # 'i' naudojamas norint gauti visas gretimas # viršūnės viršūnes v, svoris self.adj[u]: # Jei yra sutrumpintas kelias į v per u. if dist[v]> dist[u] + svoris: # Atnaujinamas atstumas nuo v dist[v] = dist[u] + svoris heapq.heappush(pq, (dist[v], v)) # Spausdinti trumpiausius atstumus, saugomus dist[] i diapazone(self.V): print(f'{i} {dist[i]}') # Tvarkyklės kodas if __name__ == '__main__': # sukurkite grafiką, pateiktą aukščiau esančiame paveikslėlyje V = 9 g = Grafas(V) # sukurkite aukščiau parodytą grafiką g.addEdge(0, 1, 4) g.addEdge(0, 7, 8) g.addEdge(1, 2, 8) g.pridėtiEdge(1, 7, 11) g.addEdge(2, 3, 7) g.addEdge(2, 8, 2) g.addEdge(2, 5, 4) g.addEdge(3, 4, 9) g.pridėtiEdge(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# dist[u] + svoris) { // Atnaujinamas v atstumas dist[v] = dist[u] + svoris; pq.Add(new int[] { dist[v], v }); } } } // Spausdinti trumpiausius atstumus, saugomus dist[] Console.WriteLine('Vertex Distance from Source'); už (int i = 0; i< V; ++i) Console.WriteLine(i + ' ' + dist[i]); } private class DistanceComparer : IComparer { public int Palyginti(int[] x, int[] y) { if (x[0] == y[0]) { return x[1] - y[1]; } grįžti x[0] - y[0]; } } } public class Programa { // Vairuotojo kodas public static void Main() { // sukurti grafiką, pateiktą aukščiau esančiame paveikslėlyje int V = 9; Grafas g = naujas Grafas(V); // Aukščiau parodyto grafiko sudarymas 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); } } // šį kodą pateikė 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) { // Pirmoji poros viršūnė yra mažiausias atstumas // viršūnė, ištraukite ją iš prioritetinės eilės. // viršūnių etiketė saugoma antroje poroje (tai // turi būti padaryta taip, kad viršūnės išliktų // surūšiuotas atstumas (atstumas turi būti pirmasis elementas // poroje) tegul u = pq[0][1]; pq.shift(); // 'i' naudojamas norint gauti visas gretimas // viršūnės for(te 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] + svoris) { // Atnaujinamas v atstumas dist[v] = dist[u] + svoris; pq.push([dist[v], v]); pq.sort((a, b) =>{ if(a[0] == b[0]) return a[1] - b[1]; return a[0] - b[0]; }); } } } // Spausdinti trumpiausius atstumus, saugomus dist[] console.log('Vertex Distance from Source'); for (tegul 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.> Išvestis
Vertex Distance from Source 0 0 1 4 2 12 3 19 4 21 5 11 6 9 7 8 8 14>
Laiko sudėtingumas: O(E * logV), kur E yra briaunų skaičius, o V yra viršūnių skaičius.
Pagalbinė erdvė: O(V)
modifikavimo klavišai
Dijkstra algoritmo taikymas:
- Google žemėlapiai naudoja Dijkstra algoritmą, kad parodytų trumpiausią atstumą tarp šaltinio ir paskirties vietos.
- Į kompiuterių tinklas Dijkstra algoritmas sudaro pagrindą įvairiems maršruto parinkimo protokolams, tokiems kaip OSPF (pirmiausia atidarykite trumpiausią kelią) ir IS-IS (nuo tarpinės sistemos iki tarpinės sistemos).
- Transporto ir eismo valdymo sistemos naudoja Dijkstra algoritmą, kad optimizuotų eismo srautą, sumažintų spūstis ir suplanuotų efektyviausius transporto priemonių maršrutus.
- Avialinijos naudoja Dijkstra algoritmą, kad suplanuotų skrydžių trajektorijas, kurios sumažintų degalų sąnaudas ir sumažintų kelionės laiką.
- Dijkstra algoritmas taikomas elektroninėje projektavimo automatizacijoje, skirtoje jungtims nukreipti į integrinius grandynus ir labai didelio masto integravimo (VLSI) lustus.
Išsamesnį paaiškinimą rasite šiame straipsnyje Dijkstra trumpiausio kelio algoritmas, naudojant STL priority_queue .





