8 min

Dijkstra

Algoritmo que calcula a menor distância entre um vértice de origem e todos os outros em grafos com pesos positivos.

MédiaO((V + E) log V) / O(V)GrafoCaminho MínimoGreedyPriority Queue

Visualizador Interativo

GrafoOrigem: 0Passo 1 / 40
Processando
Finalizado
Na fila
Relaxando
Fila: 0:0
Distâncias
0=0
1=
2=
3=
4=
5=
6=
Velocidade:1000ms
Historico de Passos
#0Inicializando: dist[0] = 0, demais = infinito

Como Funciona

Dijkstra resolve um problema que aparece em todo lugar: qual o caminho mais curto entre dois pontos? GPS, roteamento de pacotes, jogos — todos usam alguma variante dele. A sacada é simples: se você sempre processar o vértice mais próximo da origem primeiro, a distância dele nunca vai mudar. Por quê? Porque qualquer outro caminho passaria por vértices mais distantes, e com pesos positivos, isso só aumentaria o custo. É um algoritmo guloso que funciona. A escolha local (processar o mais próximo) é globalmente ótima.

A mágica está na fila de prioridade. Sem ela, você teria que varrer todos os vértices para achar o mínimo — O(V²) em vez de O(log V).

Passo a Passo

  1. Marca distância da origem como 0, todas as outras como infinito
  2. Coloca a origem na fila de prioridade
  3. Retira o vértice com menor distância da fila
  4. Para cada vizinho, calcula dist[atual] + peso da aresta
  5. Se for menor que a distância conhecida do vizinho, atualiza e adiciona à fila
  6. Repete até a fila esvaziar

Analise de Complexidade

⏱️Tempo
O((V + E) log V)

Cada vértice entra e sai da fila uma vez (V operações de log V). Cada aresta pode causar uma atualização na fila (E operações de log V).

Ver prova

Com binary heap, inserção e extração custam O(log V). Temos no máximo V extrações e E atualizações.

💾Espaco
O(V)

Arrays de distâncias e predecessores, mais a fila que pode ter no máximo V elementos.

🎯Melhor Caso
O((V + E) log V)

A complexidade não muda com a estrutura do grafo.

⚠️Pior Caso
O((V + E) log V)

Mesmo no pior caso, cada aresta é processada uma vez.

Comparacao com Outros Algoritmos

AlgoritmoTempoEspacoMelhor Para
Dijkstra(atual)O((V+E) log V)O(V)Grafos com pesos positivos
Bellman-FordO(V × E)O(V)Grafos com pesos negativos
Floyd-WarshallO(V³)O(V²)Distância entre todos os pares
BFSO(V + E)O(V)Grafos sem peso (arestas com custo 1)

Dicas e Erros Comuns

  • Usar com pesos negativos (o algoritmo assume que caminhos só ficam mais longos)
  • Implementar sem heap (funciona, mas fica lento em grafos grandes)
  • Não tratar vértices duplicados na fila
  • Confundir "menor distância" com "menos arestas"

Perguntas de Entrevista

Pratique respondendo a perguntas comuns de entrevistas tecnicas. Clique em uma pergunta para iniciar uma sessao de pratica com IA.

Implementacao

python
1import heapqImports
2from collections import defaultdictImports
3
4
5def dijkstra(graph, start):Definição
6 distances = {node: float('inf') for node in graph}Inicialização
7 distances[start] = 0Inicialização
8
9 pq = [(0, start)]Fila de Prioridade
10 visited = set()
11
12 while pq:Loop Principal
13 current_dist, current = heapq.heappop(pq)Extrair Mínimo
14
15 if current in visited:Pular Visitado
16 continuePular Visitado
17 visited.add(current)
18
19 for neighbor, weight in graph[current]:Relaxamento
20 distance = current_dist + weightAtualizar Distância
21
22 if distance < distances[neighbor]:Relaxamento
23 distances[neighbor] = distanceAtualizar Distância
24 heapq.heappush(pq, (distance, neighbor))Fila de Prioridade
25
26 return distancesRetorno
27