Dado un gráfico ponderado y un vértice fuente en el gráfico, encuentre el caminos más cortos desde la fuente hasta todos los demás vértices del gráfico dado.
Nota: El gráfico dado no contiene ningún borde negativo.
Ejemplos:
Práctica recomendada Implementación del algoritmo de Dijkstra ¡Pruébelo!Aporte: src = 0, el gráfico se muestra a continuación.
Producción: 0 4 12 19 21 11 9 8 14
Explicación: La distancia de 0 a 1 = 4.
La distancia mínima de 0 a 2 = 12. 0->1->2
La distancia mínima de 0 a 3 = 19. 0->1->2->3
La distancia mínima de 0 a 4 = 21. 0->7->6->5->4
La distancia mínima de 0 a 5 = 11. 0->7->6->5
La distancia mínima de 0 a 6 = 9. 0->7->6
La distancia mínima de 0 a 7 = 8. 0->7
La distancia mínima de 0 a 8 = 14. 0->1->2->8
Algoritmo de Dijkstra usando Matriz de adyacencia :
La idea es generar una SPT (árbol de ruta más corta) con una fuente determinada como raíz. Mantener una Matriz de Adyacencia con dos conjuntos,
- un conjunto contiene vértices incluidos en el árbol de ruta más corta,
- otro conjunto incluye vértices que aún no están incluidos en el árbol de ruta más corta.
En cada paso del algoritmo, encuentre un vértice que esté en el otro conjunto (conjunto aún no incluido) y que tenga una distancia mínima desde la fuente.
Algoritmo :
- crear un conjunto sptSet (conjunto de árbol de ruta más corto) que realiza un seguimiento de los vértices incluidos en el árbol de ruta más corto, es decir, cuya distancia mínima desde la fuente se calcula y finaliza. Inicialmente, este conjunto está vacío.
- Asigne un valor de distancia a todos los vértices en el gráfico de entrada. Inicialice todos los valores de distancia como INFINITO . Asigne el valor de distancia como 0 para el vértice de origen para que se seleccione primero.
- Mientras sptSet no incluye todos los vértices
- Elige un vértice en eso no esta ahí en sptSet y tiene un valor de distancia mínimo.
- incluirte a sptSet .
- Luego actualice el valor de distancia de todos los vértices adyacentes de en .
- Para actualizar los valores de distancia, repita todos los vértices adyacentes.
- Para cada vértice adyacente en, si la suma del valor de la distancia de en (de la fuente) y peso del borde u-v , es menor que el valor de distancia de en , luego actualice el valor de distancia de en .
Nota: Usamos una matriz booleana conjunto spt[] para representar el conjunto de vértices incluidos en SPT . si un valor conjunto spt[v] es cierto, entonces el vértice v está incluido en SPT , de otra forma no. Formación dist[] se utiliza para almacenar los valores de distancia más cortos de todos los vértices.
Ilustración del algoritmo de Dijkstra :
Para comprender el algoritmo de Dijkstra, tomemos un gráfico y encontremos el camino más corto desde la fuente hasta todos los nodos.
cadena a carácter javaConsidere el siguiente gráfico y origen = 0
Paso 1:
- El conjunto sptSet está inicialmente vacío y las distancias asignadas a los vértices son {0, INF, INF, INF, INF, INF, INF, INF} donde INF indica infinito.
- Ahora elige el vértice con un valor de distancia mínimo. El vértice 0 está elegido, inclúyalo en sptSet . Entonces sptSet se convierte en {0}. Después de incluir 0 a sptSet , actualiza los valores de distancia de sus vértices adyacentes.
- Los vértices adyacentes de 0 son 1 y 7. Los valores de distancia de 1 y 7 se actualizan como 4 y 8.
El siguiente subgráfico muestra los vértices y sus valores de distancia, solo se muestran los vértices con valores de distancia finitos. Los vértices incluidos en SPT se muestran en verde color.
Paso 2:
- Elija el vértice con el valor de distancia mínimo y que aún no esté incluido en SPT (no en sptSET ). El vértice 1 se elige y se agrega a sptSet .
- Entonces sptSet ahora se convierte en {0, 1}. Actualice los valores de distancia de los vértices adyacentes de 1.
- El valor de distancia del vértice 2 se convierte en 12 .
Paso 3:
- Elija el vértice con el valor de distancia mínimo y que aún no esté incluido en SPT (no en sptSET ). Se elige el vértice 7. Entonces sptSet ahora se convierte {0, 1, 7}.
- Actualice los valores de distancia de los vértices adyacentes de 7. El valor de distancia de los vértices 6 y 8 se vuelve finito ( 15 y 9 respectivamente).
Etapa 4:
- Elija el vértice con el valor de distancia mínimo y que aún no esté incluido en SPT (no en sptSET ). Se elige el vértice 6. Entonces sptSet ahora se convierte {0, 1, 7, 6} .
- Actualice los valores de distancia de los vértices adyacentes de 6. Se actualizan los valores de distancia de los vértices 5 y 8.
Repetimos los pasos anteriores hasta sptSet incluye todos los vértices del gráfico dado. Finalmente obtenemos la siguiente S Árbol de ruta más corto (SPT).
A continuación se muestra la implementación del enfoque anterior:
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> Pitón # 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 y sptSet[y] == False y dist[y]> dist[x] + self.graph[x][y]: dist[y] = dist[x] + self.graph[x][y] self.printSolution(dist) # Código del controlador 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) # Este código fue aportado por Divyanshu Mehta y actualizado por 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> Producción
Vertex Distance from Source 0 0 1 4 2 12 3 19 4 21 5 11 6 9 7 8 8 14>
Complejidad del tiempo: O(V2)
Espacio Auxiliar: O(V)
Notas:
- El código calcula la distancia más corta pero no calcula la información de la ruta. Cree una matriz principal, actualice la matriz principal cuando se actualice la distancia y úsela para mostrar la ruta más corta desde la fuente a los diferentes vértices.
- El tiempo La complejidad de la implementación es O(V 2 ) . Si la entrada El gráfico se representa mediante la lista de adyacencia. , se puede reducir a O(E * log V) con la ayuda de un montón binario. Por favor mira Algoritmo de Dijkstra para la representación de listas de adyacencia para más detalles.
- El algoritmo de Dijkstra no funciona para gráficos con ciclos de peso negativos.
¿Por qué los algoritmos de Dijkstra fallan en los gráficos que tienen aristas negativas?
El problema con los pesos negativos surge del hecho de que el algoritmo de Dijkstra supone que una vez que se agrega un nodo al conjunto de nodos visitados, su distancia finaliza y no cambiará. Sin embargo, en presencia de ponderaciones negativas, esta suposición puede conducir a resultados incorrectos.
Considere el siguiente gráfico como ejemplo:

En el gráfico anterior, A es el nodo fuente, entre los bordes A a B y A a C , A a B es el peso menor y Dijkstra asigna la distancia más corta de B como 2, pero debido a la existencia de un borde negativo de C a B , la distancia más corta real se reduce a 1 y Dijkstra no logra detectar.
Nota: Usamos Algoritmo del camino más corto de Bellman Ford en caso de que tengamos aristas negativas en el gráfico.
Algoritmo de Dijkstra usando Lista de adyacencia en O(E logV):
Para el algoritmo de Dijkstra, siempre se recomienda utilizar Siempre que se reduce la distancia de un vértice, agregamos una instancia más de un vértice en prioridad_queue. Incluso si hay varias instancias, solo consideramos la instancia con una distancia mínima e ignoramos otras instancias.
La complejidad del tiempo permanece O(E * LogV) ya que habrá como máximo vértices O(E) en la cola de prioridad y O(logE) es lo mismo que O(logV)
A continuación se muestra la implementación del enfoque anterior:
C++ // C++ Program to find Dijkstra's shortest path using // priority_queue in STL #include using namespace std; #define INF 0x3f3f3f3f // iPair ==>par entero typedef par par; // Esta clase representa un gráfico dirigido usando // representación de lista de adyacencia class Graph { int V; // Número de vértices // En un gráfico ponderado, necesitamos almacenar el vértice // y el par de pesos para cada lista de aristas>* adj; público: Gráfico (int V); // Constructor // función para agregar un borde al gráfico void addEdge(int u, int v, int w); // imprime la ruta más corta desde s voidshortPath(int s); }; // Asigna memoria para la lista de adyacencia Graph::Graph(int V) { this->V = V; adj = nueva lista [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)); } // Imprime las rutas más cortas desde src a todos los demás vértices void Graph::shortestPath(int src) { // Crea una cola de prioridad para almacenar los vértices que // están siendo preprocesados. Esta es una sintaxis extraña en C++. // Consulte el enlace a continuación para obtener detalles de esta sintaxis // https://www.techcodeview.com prioridad_queue , mayor que >pq; // Crea un vector para distancias e inicializa todas // las distancias como un vector infinito (INF) dist(V,INF); // Inserta la fuente en la cola de prioridad e inicializa // su distancia como 0. pq.push(make_pair(0, src)); dist[fuente] = 0; /* Recorriendo hasta que la cola de prioridad se vacíe (o no se finalicen todas las distancias) */ while (!pq.empty()) { // El primer vértice del par es la distancia mínima // vértice, extráigalo de la cola de prioridad. // la etiqueta del vértice se almacena en el segundo del par ( // debe hacerse de esta manera para mantener los vértices // distancia ordenada (la distancia debe ser el primer elemento // del par) int u = pq.top().segundo; pq.pop(); // 'i' se usa para obtener todos los vértices adyacentes de una // lista de vértices>::iterador i; for (i = adj[u].begin(); i != adj[u].end(); ++i) { // Obtener la etiqueta del vértice y el peso del // actual adyacente de u. int v = (*i).primero; peso int = (*i).segundo; // Si hay un camino corto de v a través de u. if (dist[v]> dist[u] + peso) { // Actualizando la distancia de v dist[v] = dist[u] + peso; pq.push(make_pair(dist[v], v)); } } } // Imprime las distancias más cortas almacenadas en dist[] printf('Distancia de vértice desde la fuente
'); para (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; Gráfico(int V) { this.V = V; adj = nueva ArrayList(); para (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.segundo)); int[] dist = nuevo int[V]; Arrays.fill(dist, Integer.MAX_VALUE); pq.add(nuevo iPair(0, origen)); dist[fuente] = 0; mientras (!pq.isEmpty()) { int u = pq.poll().segundo; for (iPair v : adj.get(u)) { if (dist[v.primero]> dist[u] + v.segundo) { dist[v.primero] = dist[u] + v.segundo; pq.add(new iPair(dist[v.first], v.first)); } } } System.out.println('Distancia del vértice desde la fuente'); para (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); } }>
Pitón import heapq # iPair ==>Par entero iPair = tupla # Esta clase representa un gráfico dirigido usando # la clase de representación de lista de adyacencia Gráfico: def __init__(self, V: int): # Constructor 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)) # Imprime las rutas más cortas desde src a todos los demás vértices defshortPath(self, src: int): # Crea una cola de prioridad para almacenar los vértices que # están siendo preprocesados pq = [] heapq.heappush(pq, (0, src)) # Cree un vector para distancias e inicialice todas las # distancias como infinitas (INF) dist = [float('inf')] * self.V dist[src] = 0 mientras pq: # El primer vértice del par es la distancia mínima # vértice, extráigalo de la cola de prioridad. # la etiqueta de vértice se almacena en el segundo del par d, u = heapq.heappop(pq) # 'i' se usa para obtener todos los vértices adyacentes de un # vértice para v, peso en self.adj[u]: # Si hay un camino corto de v a través de u. if dist[v]> dist[u] + peso: # Actualizando distancia de v dist[v] = dist[u] + peso heapq.heappush(pq, (dist[v], v)) # Imprime las distancias más cortas almacenadas en dist[] for i in range(self.V): print(f'{i} {dist[i]}') # Código del conductor si __name__ == '__main__': # crear el gráfico mostrado en la figura anterior V = 9 g = Graph(V) # hacer el gráfico mostrado arriba 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) { // No. de vértices this.V = V; // En un gráfico ponderado, necesitamos almacenar el vértice // y el par de pesos para cada arista this.adj = new List [V]; para (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 }); } // Imprime las rutas más cortas desde src a todos los demás vértices public void ShortestPath(int src) { // Crea una cola de prioridad para almacenar los vértices que // se están preprocesando. Conjunto ordenado pq = nuevo conjunto ordenado (nuevo Comparador de distancia()); // Crea una matriz para distancias e inicializa todas // las distancias como infinitas (INF) int[] dist = new int[V]; para (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) { // El primer vértice del par es la distancia mínima // vértice, extráigalo de la cola de prioridad. // la etiqueta del vértice se almacena en el segundo del par ( // debe hacerse de esta manera para mantener los vértices // ordenados por distancia) int[] minDistVertex = pq.Min; pq.Remove(minDistVertex); int u = minDistVertex[1]; // 'i' se usa para obtener todos los vértices adyacentes de un // vértice foreach (int[] adjVertex in this.adj[u]) { // Obtener la etiqueta del vértice y el peso del // actual adyacente de u. int v = adjVértice[0]; int peso = adjVertex[1]; // Si hay un camino más corto desde v hasta u. if (dist[v]> dist[u] + peso) { // Actualizando la distancia de v dist[v] = dist[u] + peso; pq.Add(new int[] { dist[v], v }); } } } // Imprime las distancias más cortas almacenadas en dist[] Console.WriteLine('Vertex Distance from Source'); para (int i = 0; i< V; ++i) Console.WriteLine(i + ' ' + dist[i]); } private class DistanceComparer : IComparer { público int Comparar(int[] x, int[] y) { if (x[0] == y[0]) { return x[1] - y[1]; } devolver x[0] - y[0]; } } } public class Program { // Código de controlador public static void Main() { // crea el gráfico mostrado en la figura anterior int V = 9; Gráfico g = nuevo gráfico (V); // haciendo el gráfico mostrado arriba 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); } } // este código es aportado por 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) { // El primer vértice del par es la distancia mínima // vértice, extráigalo de la cola de prioridad. // la etiqueta del vértice se almacena en el segundo del par ( // debe hacerse de esta manera para mantener los vértices // distancia ordenada (la distancia debe ser el primer elemento // en el par) let u = pq[0][1]; pq.shift(); // 'i' se usa para obtener todos los vértices adyacentes de un // vértice 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] + peso) { // Actualizando la distancia de v dist[v] = dist[u] + peso; pq.push([dist[v], v]); pq.sort((a, b) =>{ if(a[0] == b[0]) devolver a[1] - b[1]; devolver a[0] - b[0]; }); } } } // Imprime las distancias más cortas almacenadas en dist[] console.log('Vertex Distance from Source'); para (sea 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.> Producción
Vertex Distance from Source 0 0 1 4 2 12 3 19 4 21 5 11 6 9 7 8 8 14>
Complejidad del tiempo: O (E * logV), donde E es el número de aristas y V es el número de vértices.
Espacio Auxiliar: O(V)
Aplicaciones del algoritmo de Dijkstra:
- Mapas de Google utiliza el algoritmo de Dijkstra para mostrar la distancia más corta entre el origen y el destino.
- En redes de computadoras , el algoritmo de Dijkstra forma la base para varios protocolos de enrutamiento, como OSPF (Abrir primero la ruta más corta) e IS-IS (Sistema intermedio a sistema intermedio).
- Los sistemas de transporte y gestión del tráfico utilizan el algoritmo de Dijkstra para optimizar el flujo del tráfico, minimizar la congestión y planificar las rutas más eficientes para los vehículos.
- Las aerolíneas utilizan el algoritmo de Dijkstra para planificar rutas de vuelo que minimicen el consumo de combustible y reduzcan el tiempo de viaje.
- El algoritmo de Dijkstra se aplica en la automatización del diseño electrónico para enrutar conexiones en circuitos integrados y chips de integración a muy gran escala (VLSI).
Para una explicación más detallada consulte este artículo. Algoritmo de ruta más corta de Dijkstra usando prioridad_queue de STL .





