O algoritmo de Dijkstra encontra caminhos mínimos a partir de um nó inicial em um grafo ponderado, desde que todo peso de aresta seja não negativo. Se você só se importa com um destino, pode parar assim que esse destino for fechado.
A ideia central é gulosa: sempre continuar a partir do nó ainda não fechado com a menor distância conhecida. Isso só funciona sob a condição de pesos não negativos.
O que o algoritmo de Dijkstra resolve
Use o algoritmo de Dijkstra quando você tem um grafo com custos nas arestas e quer a rota mais barata. O custo pode representar distância, tempo de viagem, energia ou alguma outra quantidade que você queira minimizar.
Ele funciona em grafos direcionados ou não direcionados. A condição principal é explícita: todo peso de aresta deve ser pelo menos .
Como o algoritmo funciona
Cada nó mantém uma distância provisória a partir do nó inicial. No começo, o nó inicial tem distância e todos os outros nós têm distância .
Depois, repita este ciclo:
- Escolha o nó ainda não fechado com a menor distância provisória.
- Verifique cada vizinho por meio desse nó.
- Se a nova rota for mais barata, atualize a distância do vizinho.
- Marque o nó atual como fechado.
O passo 3 é chamado de relaxamento. Um nó fechado está concluído: sua menor distância é final, desde que o grafo não tenha arestas com peso negativo.
Algoritmo de Dijkstra passo a passo
Aqui está o procedimento completo de forma compacta:
- Escolha um nó inicial.
- Defina sua distância como e todas as outras distâncias como .
- Selecione o nó ainda não fechado com a menor distância provisória.
- Relaxe suas arestas de saída.
- Marque esse nó como fechado.
- Repita até que todos os nós alcançáveis estejam fechados, ou pare quando o nó de destino for fechado.
Se você também armazenar qual nó anterior causou cada atualização, poderá recuperar o caminho real, e não apenas a distância final.
Exemplo resolvido de caminho mínimo
Suponha que o grafo tenha estes pesos nas arestas:
Queremos o caminho mínimo de até .
Comece com:
Feche primeiro e relaxe suas arestas:
A menor distância ainda não fechada agora está em , então feche em seguida.
Passando por :
- Por , o caminho até custa , o que melhora , então atualize .
- Por , o caminho até custa , então defina .
Agora tem a menor distância ainda não fechada, então feche .
Passando por , o caminho até custa:
Isso melhora , então atualize de para .
Agora é o nó ainda não fechado com a menor distância. Feche-o e pare.
O caminho mínimo é:
com custo total:
Este exemplo mostra o padrão principal: uma rota que no início parecia pior, , depois ficou melhor por meio de . O algoritmo de Dijkstra permite isso enquanto ainda não foi fechado. Depois que um nó é fechado, sua distância não muda mais.
Por que pesos não negativos importam
Suponha que o nó ainda não fechado mais barato no momento tenha distância . Qualquer novo caminho até esse nó encontrado depois teria de vir de outro nó ainda não fechado cuja distância provisória é pelo menos , e então somar uma aresta de peso pelo menos .
Portanto, essa rota posterior não pode ser melhor que . É por isso que fechar a menor distância provisória é seguro quando todos os pesos são não negativos.
Se existir uma aresta negativa, esse argumento falha. Um caminho que agora parece caro pode ficar mais barato depois, o que significa que fechar um nó cedo demais pode dar a resposta errada.
Erros comuns com o algoritmo de Dijkstra
Usá-lo com uma aresta negativa
Mesmo uma única aresta negativa pode quebrar a lógica gulosa. Se pesos negativos forem possíveis, use outro método de caminho mínimo.
Tratar "visto" como "concluído"
Um nó já pode ter uma distância provisória e ainda assim não estar concluído. Só um nó fechado tem uma menor distância final.
Esquecer a tabela de nós anteriores
As distâncias dizem o custo. Se você também quiser a rota em si, armazene qual nó foi o último a melhorar cada distância.
Onde o algoritmo de Dijkstra é usado
O algoritmo de Dijkstra é usado quando um problema pode ser modelado como movimento em um grafo com custos não negativos:
- Planejamento de rotas em mapas
- Roteamento de redes
- Movimento de robôs em grades ponderadas
- Pathfinding em jogos quando os custos de movimento variam
Ele também é um exemplo clássico de algoritmo guloso cuja correção depende de uma condição precisa.
Tente um problema parecido
Desenhe um grafo com cinco nós e pesos de aresta positivos, depois execute o algoritmo de Dijkstra à mão com uma tabela de distâncias. Se quiser um bom próximo passo, tente sua própria versão em um novo grafo e verifique exatamente quando cada nó se torna seguro para ser fechado.
Precisa de ajuda com um problema?
Envie sua pergunta e receba uma solução verificada, passo a passo, em segundos.
Abrir GPAI Solver →