FIG caminho mais curto única fonte (o algoritmo Dijkstra)

Single-source menor problema de caminho

        Se o caminho para o outro vértice (ponto final) de um vértice do gráfico (fonte) pode ser mais do que um, como encontrar um caminho de tal modo que a soma dos pesos de cada uma das arestas ao longo deste caminho é minimizado.

algoritmo de Origem de Dijkstra

        Dijkstra (Dijkstra) foi apresentado em 1959 pelo cientista da computação holandês Dick Stella, assim chamado Dijkstra algoritmo. O resto é de um vértice para os vértices do algoritmo de caminho mais curto para resolver o problema do caminho mais curto tem o direito de figura. o algoritmo de Dijkstra é as principais características do ponto de partida, usando a estratégia algoritmo guloso, cada nó atravessado adjacente ao ápice do ponto de partida e não o mais próximo visitada até estendida até o ponto final.

idéia específica do algoritmo

matriz auxiliar

① usando um conjunto de caminhos [] a caminho de armazenamento: caminho [a] = b representa o vértice caminho mais curto vértice é um B;
② a distância mais curta uma matriz info [] para armazenar o respectivo vértice no ponto de origem, e esta também tem um efeito marcado da matriz, isto é, informação de [X] = 0, X significa um vértice que tem no caminho.

processo específico

① auxiliar inicialização de matriz, que determinam os pontos de origem (orign)

Estrutura ② na FIG distância mais curta a ser actualizado de cortina auxiliar:
Ⅰ, a um ponto em que pode ser alcançado: Informação [x] = mapa [ orign] [x]; estes pontos e a fonte de pré-conjunto de pontos : caminho [X] = orign
ⅱ, para pontos inacessíveis: info [x] = ∞

③ Localização ponto de informação mínima nos pesos da matriz (excepto 0,0 indica adição) (min), remover o peso mínimo minInfo, os pontos adicionados ao caminho, a informação fornecida [min] = 0, e o vértice de acordo mínimo, auxiliar não matriz vértice adicionado é actualizado:
Se minInfo + mapa [min] [X ] <Informação [x], de modo que a informação [x] = + minInfo mapa [min] [x], e para a frente do vértice do caminho x ponto superior é definida como vértices min
Ps: este passo pode ser armazena minInfo certas um valor correspondente ao tamanho, isto é, o ponto de origem até ao ponto do comprimento do percurso mais curto.

Repetir passos ④ ③, até que todos os vértices vieram para o caminho mais curto, isto é, a informação matriz [] são todos os valores zero

caminho de saída

informações específicas armazenadas na matriz de caminho de percurso []: o caminho mais curto à frente do vértice trajecto da corrente
pode ser feita utilizando as características da pilha em que os dados de saída:

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));
}

implementação de 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;
 }

E os resultados do teste: A FIG
Aqui Insert Picture Descrição
fonte 1, a extremidade 5:
Aqui Insert Picture Descrição

Publicado 88 artigos originais · ganhou elogios 2 · Vistas 1734

Acho que você gosta

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