Pular para o conteúdo
Matemágica

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.

Nível 2 · Intermediário Aula Origem: nova

Caminho mínimo: Dijkstra

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.

Ideia do Dijkstra

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.

Por que pesos negativos quebram o método

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).

Como ler o resultado

Desafios

  1. No grafo de exemplo, qual é o caminho mínimo de A até F, e qual é a distância?

    Dica

    Siga o campo de predecessores até A; a distância é a soma dos pesos do caminho.

  2. Troque o grafo pelo predefinido de pesos negativos e rode Dijkstra de A. O resultado está certo? Por quê?

    Dica

    Dijkstra só aceita pesos não negativos: a mensagem diz o motivo. Rode Bellman-Ford para comparar.

  3. 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?

    Dica

    Use duplo clique na aresta para mudar o peso e compare a narração do relaxamento.

  4. Por que Dijkstra nunca precisa voltar a um vértice que já saiu da fila?

    Dica

    Quando um vértice sai da fila, sua distância já é a menor possível, porque todos os pesos são não negativos.

Continue daqui

Conceitos

Cada conceito leva à lista de aulas que o usam, por disciplina.