Este artículo presenta el algoritmo de Dijkstra basado en Java en forma de ejemplos. Creo que será útil para los lectores a la hora de estudiar y aprender algoritmos de dominio de estructura de datos.
Dijkstra propuso un algoritmo para generar el camino más corto a cada vértice en orden creciente de la longitud del camino entre cada vértice y el punto fuente v. Es decir, primero encuentre el camino más corto con la longitud más corta y luego utilícelo para encontrar el camino más corto con la siguiente longitud más corta, y así sucesivamente, hasta que se encuentren todos los caminos más cortos desde el punto de origen v hasta otros vértices.
La implementación del código es la siguiente:
paquete com.algorithm.impl; public class Dijkstra { private static int M = 10000; //Este camino está bloqueado public static void main(String[] args) { int[][] peso1 = {//Matriz de adyacencia {0, 3 ,2000,7,M}, {3,0,4,2,M}, {M,4,0,5,4}, {7,2,5,0,6}, {M,M,4,6,0} }; int[][] peso2 = { {0,10,M,30,100}, {M,0,50,M,M}, {M,M,0, M,10}, {M,M,20,0,60}, {M,M,M,M,0} }; int inicio=0; dijkstra(weight2,start); for(int i = 0;i < shortPath.length;i++) System.out.println("La distancia más corta desde "+start+" a "+i+" es: "+shortPath[i] ); } public static int[] dijkstra(int[][] peso, int inicio) { //Acepta una matriz de peso de un gráfico dirigido y un número de punto de inicio inicio (numerado desde 0, el vértice se almacena en la matriz) //Devuelve una matriz int[], que indica la longitud de la ruta más corta desde el inicio hasta él int n = peso.longitud; //Número de vértices int[] shortPath = new int[n]; //Guarda la ruta más corta desde el inicio hasta otros puntos String[] path = new String[n]; ruta desde el inicio a otros puntos Representación de cadena para (int i=0;i<n;i++) path[i]=new String(start+"-->"+i); int[] visitado = new int[n] //Marca si la ruta más corta al vértice actual ha sido Buscar, 1 significa que se ha encontrado // Inicialización, se ha encontrado el primer vértice shortPath[start] = 0; visitado[start] = 1 for(int count = 1; count < n; count++) { //Para agregar n-1 vértices int k = -1; //Seleccione un vértice sin marcar más cercano al vértice inicial start int dmin = Integer.MAX_VALUE; for(int i = 0; i < n; i++) { if(visited; [i] == 0 && peso[inicio][i] < dmin) { dmin = peso[inicio][i]; //Marque el vértice recién seleccionado como la ruta más corta que se ha encontrado, y la ruta más corta para comenzar es dmin shortPath[k] = dmin; visited[k] = 1 //Con k como punto medio, corrija la ruta desde; empezar a Distancia de puntos no visitados for(int i = 0; i < n; i++) { if(visitado[i] == 0 && peso[inicio][k] + peso[k][i] < peso[inicio] [i]) { peso[inicio][i] = peso[inicio][k] + peso[k][i]; ruta[i] = ruta[k] + "-->" + i; 0; i < n; i++) { System.out.println("La ruta más corta desde "+inicio+" a "+i+" es: "+ruta[i]); System.out.println("======================================"); }}El resultado de ejecutar este programa es:
El camino más corto de 0 a 0 es: 0-->0 El camino más corto de 0 a 1 es: 0-->1 El camino más corto de 0 a 2 es: 0-->3-->2 desde El camino más corto de 0 a 3 es: 0-->3 El camino más corto de 0 a 4 es: 0-->3-->2-->4==== =================================La distancia más corta de 0 a 0 es: 0 de 0 a 1 La distancia más corta de 0 a 2 es: 50 La distancia más corta de 0 a 3 es: 30 La distancia más corta de 0 a 4 es: 60