1: Dijkstra algoritmo
El algoritmo se puede realizar algoritmo codicioso, partiendo del punto de partida para encontrar la distancia más corta desde otros puntos, encontrar el vértice de la distancia más corta, y luego en el vértice como punto de tránsito, para encontrar
A partir de punto de tránsito a otros vértices distancia más cercana, con el fin de encontrar la ruta paso a paso a través óptima elección!
2: proceso algorítmico
Como se muestra en el flujo de la figura, la distancia a otro v0 vértice se establece en una ruta de array [0,1,5,65535,65535,65535,65535,65535,65535] donde v0 65535 sustituyendo la distancia entre el punto a ser infinito. En primer lugar, encontramos el vértice más cercano en el camino hacia la v1, v1 entonces como punto de tránsito para actualizar la matriz, cómo actualizar Nepal? V0 a V1 a través de unirse ruta y llega al otro v0 vértice es menor que el camino directamente al otro vértice, en lugar de utilizar directamente los valores en la matriz de camino más pequeño. A su vez continuar el ciclo venir y encontrar V0 a v2, v3, v4 a, a V5, V6, V7 a V8 de la distancia. En él.
3: Ejemplo de código
Pena nearstWay paquete de; importación sun.security.util.Length; / * * * @author: Dazhu * @date: Creación: 18/03/2020 11:37 * @description: ruta más corta * @modified Por: * @version: $ * / público clase los principales { público estáticas void principales (String [] args) { // crear una matriz vértice, la adyacencia matriz int INF = 65535 ; vértice [] VertexList = nuevo nuevo vértice [] { nuevo nuevo vértice ( " V0 " ), nueva nuevo vértice ( " v1" ), Nuevo Vertex ( " v2 " ), nuevo Vertex ( " v3 " ), nuevo Vertex ( " v4 " ), nuevo Vertex ( " v5 " ), nuevo Vertex ( " v6 " ), nuevo Vertex ( " v7 " ) , nuevo Vertex ( " V8 " ) }; En t[] [] AdjMat = nuevo int [] [] { { 0 , 1 , 5 , inf, inf, inf, inf, inf, inf}, { 1 , 0 , 3 , 7 , 5 , inf, inf, inf, inf}, { 5 , 3 , 0 , inf, 1 , 7 , inf, inf, inf}, {inf, 7 , inf, 0 , 2 , inf, 3 , inf, inf}, {inf, 5 , 1 , 2 , 0 , 3 , 6 , 9 , inf}, {inf inf, 7 , inf, 3 , 0 , inf, 5 , inf}, {inf inf inf, 3 , 6 , INF, 0 , 2 , 7 }, {inf inf inf inf, 9 , 5 , 2 , 0 , 4 }, {inf inf inf inf inf inf, 7 , 4, 0 }, }; Gráfico G = nuevo nuevo Graph (VertexList, adjMat); el Dijkstra DJK = nuevo nuevo el Dijkstra (G); djk.findNearestWay ( 0 ); } } clase el Dijkstra { público Gráfico G = nulo ; público int nVertex; público int [] pathMatirx; // para el almacenamiento de tabla de matriz del camino más corto pública int [] shortPathTable; // para almacenar punto más corta valor de peso camino correcto público int [] markArr; //markArr [k] = 1 se obtiene representante de la ruta más corta vk v0 al público el Dijkstra (Gráfico G) { el este .g = G; el este .nVertex = g.vertexList.length; // inicializa una matriz de acuerdo con el número de vértices de salida gráfica el este .pathMatirx = new new int [nVertex]; el este .shortPathTable = new new int [nVertex]; el este .markArr = new new int [nVertex]; } público void findNearestWay ( int V0) { int V = 0 , W = 0 , K = 0; Int min; // inicializar los datos para ( int I = 0 ; I <nVertex; I ++ ) { el este .markArr [I] = 0 ; // initialize a shotPathTable otra v0 vértice es la distancia del este .shortPathTable [I] = G .adjMat [v0] [I]; // array initialize de trayectorias es 0 el este .pathMatirx [I] = 0 ; } // necesidad Representante a la ruta de reclamación entre v0 v0! ! la presente .markArr [ 0 ] = 1. ; // iniciar el bucle principal, cada ciclo de V0 para encontrar el camino más corto entre un vértice v, hasta que todos los vértices están buscando! ! ! para (V =. 1 ; V <nVertex; V ++ ) { min = 65535 ; // conocimiento actual de la distancia desde la v0 más cercano, inicializado a un valor adecuado mayor // Encuentra la más cercana vértice v0 en para (W = 0 ; W <nVertex; W ++ ) { // si y sólo si el punto es encontrar el camino más corto no es menor que la trayectoria inferior y min iF ((markArr [W] == 0 ) && shortPathTable [W] < min) { // Guardar el camino más corto hasta el vértice K K = W; // se sustituye por el camino más corto min min = shortPathTable [W]; } } //El momento encontrar el conjunto vértice más cercano a 1, lo que representa V0 a VK ha encontrado el camino más corto hacia el este .markArr [k] = 1 ; // revisar la ruta actual y la distancia más corta! ! // Si v0 a través de la distancia previamente determinada alcanza otra vk vértice, v0 es menor que la distancia de las otras líneas rectas en el vértice // actualización v0 shortPathTable en [] es la distancia más corta para (W = 0 ; W <nVertex; W ++ ) { IF ( markArr [W] == 0 && g.adjMat + min [K] [W] < shortPathTable [W]) { shortPathTable [W] = min + g.adjMat [K] [W]; pathMatirx [W] = K; } } } } } clase{Graph público Vertex [] VertexList; público int adjMat [] []; públicas int Nverts; público Graph (Vertex [] VertexList, int [] [] adjMat) { // inicialización, la matriz vértice del este .vertexList = VertexList; // la creación de un lado de la matriz de la presente .adjMat = adjMat; // vértice inicial de ordenar el este .nVerts = 0 ; } // vértice añadido a la matriz de vértice público void addVertex (String Lab) { VertexList [Nverts ++] = new new vértice (Lab); } // Añadir borde a borde de la matriz // peso 0: un peso de 0 está conectado // peso k: k se conecta a la derecha // infinito peso: no conectado al público vacío addEdge ( int inicio, int final, int peso) { adjMat [Inicio] [Fin] = peso; adjMat [Fin] [Inicio] = peso; } // mostrar todos los vértices públicos vacíos showVertexs () { para ( int I = 0 ; I <vertexList.length; I ++ ) { el Sistema . OUT .println (VertexList [I]); } } // }Imprimir vértices especifican público void printVertex ( int V) { el sistema. OUT .println (VertexList [V] .label); } } // estructura de clases vértice // vértice puede estar presente en la matriz, que se denota por el índice, // curso puede estar presente en la lista de clase Vertex { público etiqueta de cuerda; // etiqueta público Boolean wasVisited; // si indicios atravesado. público Vertex (etiqueta String) { el este .label = etiqueta; wasVisited = false ; }