Boa noita a todos.
Tenho implementado o algoritmo de Dijsktra em java para me calcular o menor caminho entre 2 cidades:
public ArrayList<Estrada> algoritmoDijkstra(String cidA,String cidB,ArrayList<Cidade> listC,
ArrayList<Estrada> listE){
Cidade CInicial = GetCidadeNome(listC, cidA);//vai a lista de cidades buscar um objecto cidade com e
Cidade CFinal = GetCidadeNome(listC, cidB);//a string dada por parametro
int s_inicial = getPosCidade(listC,CInicial); //usamos esta funcao para dada uma cidade retornar
int s_final = getPosCidade(listC,CFinal); // o inteiro respectivo no ArrayList<Cidade>
int[] vectEtiquetas = new int[getV()];//Verifica se o vertice ja esta "checado"
int[] vectCustos = new int[getV()];//custo acumulado
int[] percursoMinimo = new int[getV()]; //vai ter o percurso minimo de uma cidade a outra
int w, w0 = 0;//w0 -> posicao do vector onde esta o percurso minimo.
boolean stop;
//-----------------------------------------------------
for (w = 0; w < getV(); w++){//inicializa todas a vareaveis
vectEtiquetas[w] = -1;
vectCustos[w] = custo(s_inicial, w);//coloca no vector qual o custo de ir de s_inicial para w
percursoMinimo[w] = s_inicial;
}
vectEtiquetas[s_inicial] = s_inicial;//posicao onde comeco a procura
vectCustos[s_inicial] = 0;//custo inicial e 0
stop = false;
while (!stop){
int minimoCusto = INFINITO;
for (w = 0; w < getV(); w++) {
if (vectEtiquetas[w] == -1 && (vectCustos[w] < minimoCusto)){//Determina o minimo de todos os vertices k inda nao foram "checados"
w0 = w; //diz a posicao onde esta o minimo //
minimoCusto = vectCustos[w0];
}
}
if ((minimoCusto == INFINITO) || (s_final == w0)) // Cheguei a sulução!!!
stop = true;
else{
vectEtiquetas[w0] = percursoMinimo[w0];
for (w = 0; w < getV(); w++){
if (vectCustos[w] > (vectCustos[w0] + custo(w0, w))){ //minimiza o custo
vectCustos[w] = vectCustos[w0] + custo(w0, w);
percursoMinimo[w] = w0;
}
}
}
}
System.out.println("Para ir de "+cidA+" ate "+cidB+" tenho que passar em:");
int anterior = s_final;
//apresenta o percurso do fim para o inicio
ArrayList<Cidade> listAux = new ArrayList<Cidade>();//representara as cidades por onde passo
listAux.add(CFinal);
while(anterior != s_inicial){
anterior = percursoMinimo[anterior];
listAux.add(listC.get(anterior));
}
mostrarListaCidadesPercorridas(listAux);
ArrayList<Estrada> LE_ondePasso = constroiPercurso(listAux, listE); //Devolve estradas por onde passo
return LE_ondePasso;
}
Este codigo esta a funcionar a 100%. Como sabem o Dijsktra encrontra o menor caminho dados 2 pontos de uma matriz. Neste momento gostava de saber se existe alguma maneira de, com as devidas alterações, conseguir em vez do caminho minimo, o caminho maximo.
Grato pela atenção,
David Ferrão