Caminho mínimo: Dijkstra com fila de prioridade
Anime o algoritmo de Dijkstra com a fila de prioridade visível, compare com Bellman-Ford e veja por que pesos negativos mudam o método.
Anime o algoritmo de Dijkstra com a fila de prioridade visível, compare com Bellman-Ford e veja por que pesos negativos mudam o método.
Em um grafo com pesos, o caminho mínimo entre dois vértices é o que soma o menor peso. Se os pesos são distâncias, é o caminho mais curto; se são tempos ou custos, o mais barato.
O algoritmo mantém, para cada vértice, a melhor distância conhecida até a origem, começando com 0 na origem e infinito nos demais. A cada passo, ele retira da fila de prioridade o vértice com a menor distância provisória. Essa distância passa a ser definitiva, porque nenhum caminho futuro pode ser menor (os pesos não são negativos). Depois, ele tenta relaxar as arestas que saem desse vértice: se passar por ele melhora a distância de um vizinho, a distância e o predecessor desse vizinho são atualizados e o vizinho entra na fila.
A fila de prioridade é o que faz o algoritmo rápido. Na animação, ela aparece com os pares (vértice, distância provisória) em ordem de saída.
Com um peso negativo, um vértice já finalizado poderia ser melhorado depois por um caminho que passa por uma aresta negativa. Por isso o Dijkstra recusa grafos com peso negativo. O Bellman-Ford resolve o caso geral: relaxa todas as arestas n − 1 vezes. Se ainda houver relaxamento depois disso, existe um ciclo de peso negativo alcançável, e então a distância mínima não existe (dá para ficar descendo sem limite).
No grafo de exemplo, qual é o caminho mínimo de A até F, e qual é a distância?
Siga o campo de predecessores até A; a distância é a soma dos pesos do caminho.
Troque o grafo pelo predefinido de pesos negativos e rode Dijkstra de A. O resultado está certo? Por quê?
Dijkstra só aceita pesos não negativos: a mensagem diz o motivo. Rode Bellman-Ford para comparar.
Aumente o peso de uma aresta do caminho mínimo até um valor alto. O caminho muda? Em que momento da animação a mudança aparece?
Use duplo clique na aresta para mudar o peso e compare a narração do relaxamento.
Por que Dijkstra nunca precisa voltar a um vértice que já saiu da fila?
Quando um vértice sai da fila, sua distância já é a menor possível, porque todos os pesos são não negativos.
Cada conceito leva à lista de aulas que o usam, por disciplina.
Trilha de estudo: Grafos · Mapa de conceitos