Jump to content

Dijkstra - Implementação em lista de listas;


Recommended Posts

Posted

Boas;

Implementei o algoritmo de Dijstra e fiz há mão e... devo estar a pensar mal.

Imaginem um grafo com as cidades "Porto", "Braga", "Guarda" e "Fafe".

Ligações:

Porto: c/Braga por 10 e c/Guarda por 10;

Braga: c/Porto por 10 e c/Fafe por 5;

Fafe: c/Braga por 5;

Guarda: c/Porto por 10;

Qual é o custo mínimo de Guarda a Fafe? A mim dá-me 5 no papel e no algoritmo, mas escrevendo o grafo são 25.  ?

Onde é q estou a pensar mal?

Thx!

Posted

O código ñ podia postar pq isto é para um trabalho e cópias dão direito a q o trabalho fique anulado.

Já vi o q estava a fazer mal.

Na actualização dos custos dos vértices adjacentes, eu estava smp a fazer:

if(((verticeorigem->onus) + (primeira->custo)) < (vertice_testado->onus))

{

vertice_testado->onus = (verticeorigem->onus) + (primeira->custo);

vertice_testado->pai = verticeorigem;

}

}

Mesmo nos adjacentes dos adjacentes. Claro que nesses, o código será:

if(((vertice_minimo->onus) + (primeira->custo)) < (vertice_testado->onus))

{

vertice_testado->onus = (vertice_minimo->onus) + (primeira->custo);

vertice_testado->pai = vertice_minimo;

}

Uma nova dúvida q eu até sei resolver mas quero saber se é de facto a melhor forma:

No final do algoritmo, ele retorna-me o grafo com os onus actualizados, isto é, eu quero ir de Guarda a Fafe e ele actualiza o grafo com a origem Guarda. O grafo é retornado com os valores em cada cidade q correspondem ao mínimo para ir da Guarda lá. Depois tenho uma função q procura a cidade destino, no caso Fafe, no grafo e peço:

cidade_encontrada -> onus;

A minha dúvida é saber como construir o caminho. Cada vértice tem o seu pai, imposto pelo algoritmo. Eu pelo pai consigo saber o anterior, logo, estava a pensar fazer qq coisa como:

(Pseudo-codigo)

Ir de "cidade_origem" a "cidade_destino" tem um custo de "cidade_encontrada -> onus", e passa por:

- Função q lista cidades por onde passa:

print "cidade_origem"

noactual = cidade_origem->pai;

while(noactual->pai!=NULL)

{

print noactual->nome

noactual = noactual->pai->pai

}

"pai" é um apontador para a cidade pai da anterior.

Thx.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.