Aula por Lúcio Cardoso
Imagine que temos um grafo com vértices e arestas, cada uma delas contendo um peso (um valor positivo arbitrário). Além disso, é dado um vértice qualquer do grafo. O problema do Menor Caminho consiste em calcular, para cada vértice , a menor distância de para , isto é, a menor soma possível de pesos de arestas que formem um caminho de para .
Como um exemplo, se definirmos a origem como o vértice do grafo acima, teremos que:
- O menor caminho para o vértice é .
- O menor caminho para o vértice é .
- O menor caminho para o vértice é .
- O menor caminho para o vértice é .
- O menor caminho para o vértice é .
Algoritmo de Dijkstra
O algoritmo de Dijkstra é usado para resolver o problema citado acima. Ele consiste das seguintes etapas:
- Inicialmente, marque todos os vértices do grafo como não visitados. Além disso, defina a distância atual para (origem) como e para todos os outros vértices como .
- Encontre, dentre os vértices não visitados, aquele com menor distância atual. Chame-o de e marque-o como visitado. Assim, a distância atual de é, de fato, a sua menor distância para e não será visitado novamente.
- Para todo vizinho de de , cheque se , onde é a distância atual de , é o menor caminho de e é o peso da aresta que liga e . Se sim, atualize a distância atual de para .
- Repita as etapas e até que todos os vértices do grafo estejam marcados.
Por que o Algoritmo de Dijkstra funciona?
Suponha que em um momento qualquer do algoritmo, o vértice é o vértice não marcado mais próximo de , ou seja, aquele cujo menor caminho para é mínimo. Perceba que o menor caminho de para é composto pelo menor caminho de para algum vértice seguido de uma aresta de para . Como as arestas tem pesos positivos, o menor caminho de é certamente menor que o menor caminho de . Logo, como é definido como o vértice não marcado de menor caminho mínimo, teremos que o vértice certamente já foi marcado. Porém, assim que for marcado, a etapa do algoritmo será realizada em seus vizinhos, e em particular, a distância atual de será atualizada para , que é exatamente o menor caminho de !
Queremos agora provar que o vértice escolhido na etapa é exatamente o vértice . Suponha que o vértice não marcado de menor distância atual é um vértice . Então, teremos que
.
Como mostrado acima,
.
Mas
(por definição)
uma contradição, já que foi definido como o vértice não marcado de menor caminho mínimo. Logo, será o vértice escolhido na etapa do algoritmo, e além disso, sua distância atual será igual à sua menor distância para , o que conclui a prova.
Para implementar o algoritmo de Dijkstra, representaremos o nosso grafo como uma Lista de Adjacência. Além disso, vamos usar uma Fila de Prioridade que irá guardar pares da forma , ou seja, a fila será ordenada de maneira crescente pela distância atual de cada vértice. Isso será de grande utilidade para realizarmos a etapa de maneira eficiente.
Observação
O algoritmo apresentado acima funciona em grafos com arestas de pesos não-negativos e não funciona caso alguma delas tenha peso negativo.
Confira o código abaixo: