camino más corto fuente única figura (el algoritmo de Dijkstra)

Cortas de origen único problema del camino

        Si la ruta de acceso al otro vértice (punto final) de un vértice en el gráfico (fuente) puede ser más de uno, cómo encontrar un camino tal que la suma de los pesos de cada borde a lo largo de este camino se minimiza.

Origen algoritmo de Dijkstra

        Dijkstra (Dijkstra) fue presentado en 1959 por el científico informático holandés Dick Stella, llamado algoritmo de Dijkstra. El resto es de un vértice a los vértices del algoritmo de ruta más corta para resolver el problema del camino más corto tiene derecho a la figura. el algoritmo de Dijkstra es las principales características del punto de partida, utilizando la estrategia de algoritmo voraz, cada nodo atravesado adyacente al vértice del punto de partida y no la más cercana visitado hasta extenderse hasta el punto final.

idea específica del algoritmo

array auxiliar

① utilizando una matriz de ruta [] a la trayectoria de la tienda: camino [a] = b representa el camino más corto vértice vértice A es B;
② la distancia más corta una matriz info [] para almacenar el vértice respectivo hasta el punto de origen, y esto también tiene un efecto marcado de la matriz, es decir, info [x] = 0, X denota un vértice que tiene en el camino.

proceso específico

① auxiliar array de inicialización, la determinación de puntos de fuente (orign)

Estructura ② en la figura distancia más corta para ser actualizado array auxiliar:
Ⅰ, a un punto que se puede llegar: info [x] = mapa [ orign] [x]; estos puntos y la fuente de pre-conjunto de puntos : path [X] = orign
ⅱ, para puntos inaccesibles: info [x] = ∞

③ Ubicación punto de información mínima en los pesos de matriz (excepto 0,0 indica adición) (min), quitar el peso mínimo minInfo, los puntos añadidos a la ruta, siempre info [min] = 0, y el vértice de acuerdo min, auxiliar no añadido array vértice se actualiza:
Si minInfo + mapa [min] [x ] <info [x], de modo que la información [x] = minInfo + mapa [min] [x], y reenvía el vértice de la trayectoria x punto superior se establece en min vértices
PD: este paso puede ser correctas tiendas minInfo un valor que corresponde al tamaño, es decir, el punto de origen hasta el punto de la longitud del camino más corto.

Repetir los pasos ④ ③, hasta que todos los vértices han llegado a la ruta más corta, es decir, la información de array [] son ​​todos los valores cero

ruta de salida

La información específica almacenada en la matriz de trayectoria de la ruta []: el camino más corto en frente del vértice trayectoria de la corriente
puede ser tomada usando las características de la pila en el que los datos de salida:

path[] = dijkstra(sMap, 1);
int end = 5;
//借助栈的特性
int stack[] = new int[sMap.num];
int top = 0;
end--;	//从零开始
while(end != -1) {
   	stack[top++] = end;
   	end = path[end];
}
System.out.print(stack[--top]+1);
while(top > 0) {
   	//位置比索引大一
   	System.out.print("---->"+(stack[--top]+1));
}

la implementación del código

/**
  * 得出最小路径表
  * @param map 用二维数组存储的图结构
  * @return 路径数组
  */
 public static int[] dijkstra(SimpleMap sMap,int first) {
  	//路径数组
  	int[] path = new int[sMap.num];
  	//标记与权值数组(权值为0,表示已加入路径)
  	int[] markAndInfo = new int[sMap.num];
  	//辅助数组初始化
  	for(int i=0; i<sMap.num; i++) {
   		path[i] = -1;
   		markAndInfo[i]= CreateAMap.MAX;
 	}
  	//定位初始位置(从零开始)
  	first = first-1;
  	for(int j=0; j<sMap.num; j++) {
   		if(j != first) {
    			path[j] = first;
   		}
   		markAndInfo[j]= sMap.map[first][j];
  	}
  	//已经加入到路径的顶点
  	int judge = 1;
  	while(judge < sMap.num) {
   		//从权值数组中找出最小的的值
   		int index = 0;
   		int min = CreateAMap.MAX;
   		for(int i=0; i<sMap.num; i++) {
    			//需判断当前点是否已经在路径中
    			if(markAndInfo[i] != 0 && markAndInfo[i] < min) {
     				index = i;
     				min = markAndInfo[i];
    			}
	   	}	
   		//更新权值数组以及路径数组
   		markAndInfo[index] = 0;
   		for (int i = 0; i < sMap.num; i++) {    
    				if(markAndInfo[i] !=0 && min+sMap.map[index][i] < markAndInfo[i]) {
     					markAndInfo[i] =  min+sMap.map[index][i];
     					path[i] = index;
    				}
   		}
   		judge++;
  	}
  	return path;
 }

Y resultados de pruebas fig:
Aquí Insertar imagen Descripción
fuente 1, el extremo 5:
Aquí Insertar imagen Descripción

Publicado 88 artículos originales · ganado elogios 2 · Vistas 1734

Supongo que te gusta

Origin blog.csdn.net/qq_41891805/article/details/105308790
Recomendado
Clasificación