Algoritmo de Dijkstra

Matemática Computacional

02

Aviso Importante

Este é um material de suporte não oficial, desenvolvido por alunos com o auxílio de inteligência artificial. Não representa a posição oficial da instituição ou dos professores.
Não questione ou incomode os professores sobre este conteúdo. O material é baseado em anotações feitas durante as aulas e consultas complementares feitas pelos próprios alunos.
Este material pode conter imprecisões. Em caso de dúvida, consulte sempre o material oficial fornecido pelo professor e as referências listadas ao final.
Sugestões e Correções
Encontrou um erro ou tem uma sugestão de melhoria? Envie sua contribuição pelo grupo do WhatsApp da turma. Toda colaboração é bem-vinda para melhorar o material para todos.
03
ÍNDICE

Conteúdo

04
INTRODUÇÃO

Encontrando o Caminho Mais Curto

Imagine que você precisa viajar de Dublin a Cork. Existem muitas rotas possíveis — algumas mais rápidas, algumas mais curtas, algumas mais econômicas em combustível. Este é um problema de busca de caminhos: dada uma rede de locais conectados por estradas, encontre a "melhor" rota de um ponto a outro. "Melhor" pode significar menor tempo, menor distância, maior largura de banda ou menor custo — todos esses são problemas de otimização.

Podemos modelar essas redes como grafos ponderados: locais se tornam nós (também chamados de vértices), estradas se tornam arestas, e cada aresta tem um peso — um número representando seu custo (distância, tempo, etc.). Um algoritmo é simplesmente uma série de instruções passo a passo para resolver um problema. O Algoritmo de Dijkstra (pronuncia-se "Dike-stra", em homenagem ao cientista da computação holandês Edsger Dijkstra) é um dos algoritmos mais famosos para encontrar o caminho mais curto em um grafo ponderado.

O objetivo é simples: encontrar uma sequência de nós conectando um nó de origem a um nó de destino que tenha o menor peso combinado das arestas. A abordagem de Dijkstra funciona explorando a partir do nó de origem, sempre escolhendo o vizinho não visitado mais próximo primeiro, e gradualmente construindo uma tabela de menores distâncias conhecidas. Quando ele alcança o destino, garante que o caminho é ótimo.

05
DIAGRAMA

Por Que Precisamos de um Algoritmo?

A abordagem de força bruta não escala

Força Bruta

Tente todos os caminhos possíveis de A até H, calcule o custo total de cada um e escolha o mais curto.

7 nodesCentenas de caminhos
100 nodesMilhões de caminhos
1,000 nodesMais caminhos do que átomos no universo
Algoritmo de Dijkstra

Visite nós de forma inteligente — sempre escolha o nó não visitado mais próximo. Cada nó é visitado no máximo uma vez.

7 nodes7 passos
100 nodes~100 passos
1,000 nodes~1.000 passos
06
DIAGRAMA

Grafo Ponderado

O grafo que usaremos para rastrear o algoritmo de Dijkstra

21133652ABCDEFH

Cada número em uma aresta representa o custo de viajar entre dois nós

07
DIAGRAMA

O Algoritmo

Quatro passos para encontrar o caminho mais curto

1Comece no nó de origem. Defina sua distância como 0. Todas as outras distâncias =
2Observe todos os vizinhos não visitados. Calcule: distância atual + peso da aresta
3Se a nova distância for menor, atualize a tabela de distâncias
4Marque o nó atual como visitado. Vá para o nó não visitado com a menor distância. Repita a partir do passo 2
08
DIAGRAMA

Passo 0 — Começar no Nó A

Inicializar distâncias e começar

We begin at node A with distance 0. All other nodes start at ∞ (infinity). From A, we can reach B (cost 2) and C (cost 1). We add both to our queue.
2 1 1 3 3 6 5 2 A0 B2 C1 D E F H
09
DIAGRAMA

Passo 1 — Visitar o Nó C (custo 1)

C tem a menor distância na fila

Node C has the smallest distance (1), so we visit it next. From C, we can reach D (1+3=4) and F (1+6=7). B is already queued with distance 2, which is still valid.
2 1 1 3 3 6 5 2 A0 B2 C1 D4 E F7 H
10
DIAGRAMA

Passo 2 — Visitar o Nó B (custo 2)

B tem a menor distância entre os nós não visitados

Node B (distance 2) is next. From B, we reach D (2+1=3) — this is shorter than D's current distance of 4! We update D to 3. We also reach E (2+3=5).
2 1 1 3 3 6 5 2 A0 B2 C1 D4→3 E5 F7 H
11
DIAGRAMA

Passo 3 — Visitar o Nó D (custo 3)

Os vizinhos de D já foram visitados — sem atualizações

Node D (distance 3) is next. Both of D's neighbours (B and C) are already visited. No distance updates — we simply mark D as visited and move on.
2 1 1 3 3 6 5 2 A0 B2 C1 D3 E5 F7 H
12
DIAGRAMA

Passos 4 e 5 — Visitar E (custo 5), depois F (custo 7)

Chegando mais perto de H

Node E (distance 5) is visited next. From E we check F: 5+5=10, but F already has distance 7, so no update. Then we visit F (distance 7). From F we reach H (7+2=9)!
2 1 1 3 3 6 5 2 A0 B2 C1 D3 E5 F7 H9
13
DIAGRAMA

Resultado — Caminho Mais Curto Encontrado!

A → C → F → H com custo total 9

The algorithm is complete! The shortest path from A to H is A → C → F → H with total cost 9 (1 + 6 + 2). Notice this goes through C and F, not through B — even though B is closer to A, the path through B leads to a longer total route.
2 1 1 3 3 6 5 2 A0 C1 F7 H9 B2 D3 E5
14
DIAGRAMA

Exemplo Resolvido 2 — Um Grafo Maior

Encontrando o caminho mais curto de S a T em um grafo de 7 nós

New graph, same algorithm. This graph has 7 nodes and 11 edges — more complex than our first example. The edges from S reach three neighbours: A (cost 7), B (cost 2), and C (cost 3). Watch the algorithm explore outward from S.
72334411835S0ABCDET
15
DIAGRAMA

Exemplo Resolvido 2 — Passo a Passo Animado

Veja Dijkstra encontrar o caminho de S a T

Watch the animation: The algorithm explores outward from S, visiting nodes in order of their distance. Notice how it discovers the path S → B → E → T (cost 6) — even though A and D are explored, they don't lead to a shorter path to T.
7 2 3 3 4 4 1 1 8 3 5 S A B C D E T 0 7 5 2 3 6 3 6 Shortest path: S → B → E → T (cost 6)
16
DIAGRAMA

Exemplo Resolvido 2 — Passo a Passo em Colunas

Colunas passo a passo de S a T

Start at S
(cost 0)
SA: 0+7 = 7 NEW
SB: 0+2 = 2 NEW
SC: 0+3 = 3 NEW
→ Select B (2) 2
Visit B
(cost 2)
BD: 2+4 = 6 NEW
BE: 2+1 = 3 NEW
A: 7 2+3 = 5
→ Select C (3) 3
Visit C
(cost 3)
CB: 3+1 = 4 > 2 (no update)
CE: 3+8 = 11 > 3 (no update)
→ Select E (3) 3
Visit E
(cost 3)
ET: 3+3 = 6 NEW
→ Select A (5) 5
Visit A
(cost 5)
AD: 5+4 = 9 > 6 (no update)
→ Select D (6) 6
Visit D
(cost 6)
DT: 6+5 = 11 > 6 (no update)
→ Select T (6) 6
Shortest path: S → B → E → T, total cost = 6 (2 + 1 + 3)
17
DIAGRAMA

Exemplo Resolvido 3 — Encontrando Todos os Caminhos Mais Curtos

Às vezes a jornada importa mais do que o destino

New goal: This time we find the shortest path from P to every node — not just one target. This is useful when you need to reach multiple destinations, like a delivery van planning its route.
14263512P0QRSTU
18
DIAGRAMA

Exemplo Resolvido 3 — Execução Completa de Dijkstra

Encontrando os caminhos mais curtos de P para todos os nós

All shortest paths found! Notice that every shortest path goes through Q and R — they're the 'gateway' nodes. This pattern is common in real networks: some nodes are more important than others for efficient routing.
1 4 2 6 3 5 1 2 P Q R S T U 0 1 4 3 7 6 8 7
DestinationShortest DistancePath
Q1P → Q
R3P → Q → R
S6P → Q → R → S
T8P → Q → R → T
U7P → Q → R → S → U
19
DIAGRAMA

Exemplo Resolvido 3 — Passo a Passo em Colunas

Colunas passo a passo de P para todos os nós

Start at P
(cost 0)
PQ: 0+1 = 1 NEW
PR: 0+4 = 4 NEW
→ Select Q (1) 1
Visit Q
(cost 1)
R: 4 1+2 = 3
QS: 1+6 = 7 NEW
→ Select R (3) 3
Visit R
(cost 3)
S: 7 3+3 = 6
RT: 3+5 = 8 NEW
→ Select S (6) 6
Visit S
(cost 6)
SU: 6+1 = 7 NEW
→ Select U (7) 7
Visit U
(cost 7)
(no unvisited neighbours)
→ Select T (8) 8
All shortest paths found from P: Q=1, R=3, S=6, U=7, T=8
20
DIAGRAMA

Passo a Passo Detalhado

Executando Dijkstra de A a H — seguindo o algoritmo

Start at A
(cost 0)
AB: 0+2 = 2 NEW
AC: 0+1 = 1 NEW
→ Select C (1) 1
Visit C
(cost 1)
AB: 2 (unchanged)
CD: 1+3 = 4 NEW
CF: 1+6 = 7 NEW
→ Select B (2) 2
Visit B
(cost 2)
4 2+1 = 3
BE: 2+3 = 5 NEW
CF: 7 (unchanged)
→ Select D (3) 3
Visit D
(cost 3)
BE: 5 (unchanged)
CF: 7 (unchanged)
(no new paths)
→ Select E (5) 5
Visit E
(cost 5)
CF: 7 (unchanged, 5+5=10 > 7)
→ Select F (7) 7
Visit F
(cost 7)
FH: 7+2 = 9 NEW
→ Select H (9) 9
Shortest path: A → C → F → H, total cost = 9 (1 + 6 + 2)
21
DIAGRAMA

Dijkstra vs A* — Comparação em Grade

Mesmo mapa, mesmo custo — mas veja quantos nós cada algoritmo visita

O que observar: Ambos os algoritmos encontram um caminho com o mesmo custo. O sombreamento roxo/azul mostra quais nós cada algoritmo explorou. Note como Dijkstra (direita) inunda toda a grade, enquanto A* (esquerda) segue direto para o objetivo — ele usa uma heurística (distância estimada até o alvo) para guiar sua busca.
Side-by-side comparison of Dijkstra and A* on a grid map

A* visitou 90 nós. Dijkstra visitou 555 — mais de 6 vezes mais. Vídeo de Kevin Wang.

A* visitou 90 nós. Dijkstra visitou 555 — mais de 6 vezes mais. Vídeo de Kevin Wang.

22
DIAGRAMA

Dijkstra vs A* — Comparação no Mundo Real

Veja Dijkstra explorar cada rua de Roma antes de encontrar o caminho

Impacto no mundo real: Este é Dijkstra executando em dados reais de ruas de Roma, Itália (OpenStreetMap). Observe o brilho ciano se expandir em todas as direções a partir da origem — Dijkstra explora cada rua, beco e beco sem saída igualmente. Levou 21 minutos para encontrar o caminho. A* encontrou exatamente o mesmo caminho em apenas 2 minutos priorizando estradas que levam ao destino. É por isso que os sistemas GPS modernos usam A* ou algoritmos heurísticos similares, não Dijkstra puro.
Dijkstra vs A* pathfinding comparison on the streets of Rome

Dijkstra levou 21:04 para encontrar o caminho. A* encontrou o mesmo caminho em apenas 02:03. Vídeo de Anthony Madorsky.

Dijkstra levou 21:04 para encontrar o caminho. A* encontrou o mesmo caminho em apenas 02:03. Vídeo de Anthony Madorsky.

23
DIAGRAMA

Dijkstra vs A* — Entendendo a Diferença

Dois algoritmos, um objetivo — mas estratégias muito diferentes

Dijkstra’s Algorithm
  • Explores nodes in ALL directions equally
  • Guaranteed to find the shortest path
  • No knowledge of where the target is
  • Like a ripple spreading in a pond
  • Visits many unnecessary nodes
A* Algorithm
  • Explores towards the target first
  • Also guaranteed shortest path (with admissible heuristic)
  • Uses a heuristic — estimated distance to target
  • Like following a compass towards your destination
  • Visits far fewer nodes
The Key Difference: The Heuristic

A* adds one extra piece of information: an estimate of how far each node is from the target. Instead of picking the node with the smallest distance from start (like Dijkstra), A* picks the node with the smallest distance from start + estimated distance to target. This simple addition dramatically reduces the number of nodes explored.

FeatureDijkstraA*
Uses heuristic?NoYes
Finds shortest path?AlwaysYes (with admissible heuristic)
SpeedSlower (explores everything)Faster (focused search)
Memory usageHigherLower
Best forAll shortest paths from one sourceSingle source to single target
Used inNetwork routing, database queriesGPS navigation, video games
24
DIAGRAMA

Aplicações no Mundo Real

Onde algoritmos de caminho mais curto impulsionam nosso dia a dia

Navegação GPS

Every time you ask Google Maps or Apple Maps for directions, a variant of Dijkstra’s algorithm runs on millions of road segments. The edges are roads, weights are travel times (updated in real-time with traffic data), and the algorithm finds the fastest route. Modern GPS uses A* with geographical distance as the heuristic.

Roteamento de Internet

When you send a message on WhatsApp, it travels through multiple routers to reach its destination. Protocols like OSPF (Open Shortest Path First) use Dijkstra’s algorithm to find the fastest path through the network. Each router is a node, each connection is an edge weighted by latency or bandwidth.

Videogames

Em jogos como Age of Empires, Civilization ou qualquer jogo de estratégia, unidades precisam navegar ao redor de obstáculos para alcançar seu destino. A* é o algoritmo padrão de busca de caminhos no desenvolvimento de jogos. Ele é executado milhares de vezes por segundo para mover personagens, inimigos e NPCs pelo mapa.

Redes Sociais

LinkedIn’s ‘degrees of connection’ and Facebook’s ‘People You May Know’ use graph algorithms to find short paths between users. The ‘six degrees of separation’ concept is essentially a shortest path problem on a social graph with billions of nodes.

25
CÓDIGO

Algoritmo de Dijkstra em Java

Usando uma fila de prioridade para encontrar o caminho mais curto

DijkstraAlgorithm.java
import java.util.*;

public class DijkstraAlgorithm {
    
    // Find shortest distances from start to all nodes
    public static int[] dijkstra(int[][] graph, int start) {
        int n = graph.length;
        int[] distances = new int[n];
        boolean[] visited = new boolean[n];
        
        // Initialise all distances to "infinity"
        Arrays.fill(distances, Integer.MAX_VALUE);
        distances[start] = 0;
        
        // Priority queue: {distance, node}
        PriorityQueue<int[]> queue = 
            new PriorityQueue<>(Comparator.comparingInt(a -> a[0]));
        queue.offer(new int[]{0, start});
        
        while (!queue.isEmpty()) {
            int[] current = queue.poll();
            int dist = current[0], node = current[1];
            
            if (visited[node]) continue;
            visited[node] = true;
            
            // Check all neighbours
            for (int next = 0; next < n; next++) {
                if (graph[node][next] > 0 && !visited[next]) {
                    int newDist = dist + graph[node][next];
                    if (newDist < distances[next]) {
                        distances[next] = newDist;
                        queue.offer(new int[]{newDist, next});
                    }
                }
            }
        }
        return distances;
    }
}
Main.java
public class Main {
    public static void main(String[] args) {
        // Adjacency matrix — 0 means no direct connection
        //          A  B  C  D  E  F  H
        int[][] graph = {
            {0, 2, 1, 0, 0, 0, 0},  // A
            {2, 0, 0, 1, 3, 0, 0},  // B
            {1, 0, 0, 3, 0, 6, 0},  // C
            {0, 1, 3, 0, 0, 0, 0},  // D
            {0, 3, 0, 0, 0, 5, 0},  // E
            {0, 0, 6, 0, 5, 0, 2},  // F
            {0, 0, 0, 0, 0, 2, 0}   // H
        };
        String[] nodes = {"A","B","C","D","E","F","H"};
        
        int[] distances = DijkstraAlgorithm.dijkstra(graph, 0);
        
        // Print shortest distances from A
        for (int i = 0; i < nodes.length; i++) {
            System.out.println("A → " + nodes[i] + " = " + distances[i]);
        }
        // Output: A → H = 9
    }
}
26
RESUMO

Referência Rápida

ConceitoNotaçãoSignificado
Nó (Vértice)A, B, C...Um ponto/local no grafo
ArestaA—BUma conexão entre dois nós
Pesow(A,B) = 3O custo de percorrer uma aresta
Grafo PonderadoG(V, E)Um grafo onde cada aresta tem um peso
Matriz de AdjacênciaM[i][j]Uma tabela armazenando os pesos das arestas entre todos os pares de nós
Tabela de Distânciasd[v]Rastreia a menor distância conhecida para cada nó
Caminho Mais CurtoA → C → F → HA sequência de nós com menor peso total
Fila de Prioridademin-heapSeleciona o nó não visitado com a menor distância
27
EXERCÍCIOS

Exercícios Práticos

Teste seu entendimento do Algoritmo de Dijkstra

01
Easy — Encontre o caminho mais curto de A a C neste grafo:

315ABC

Qual é o custo total?
Compare o caminho direto A→C com o caminho passando por B
02
Easy — Escreva a matriz de adjacência para o grafo acima (A, B, C com arestas A–B(3), B–C(1), A–C(5)).
Cada célula M[i][j] contém o peso da aresta entre i e j, ou 0 se não houver conexão direta
03
Medium — Execute Dijkstra de S a T neste grafo:

4231618SABCT

Mostre a tabela de distâncias após cada passo e identifique o caminho mais curto.
Comece em S. Suas primeiras distâncias são A=4 e B=2. Qual você visita primeiro?
04
Medium — Explain why Dijkstra’s Algorithm always selects the unvisited node with the smallest distance next. What would go wrong if we picked a random unvisited node instead?
Pense nos pesos não negativos das arestas e no que isso garante sobre o nó selecionado
05
Medium-Hard — Usando o grafo da aula:

21133652ABCDEFH

Encontre o caminho mais curto de A a E. Mostre seu raciocínio em cada passo.
O caminho mais curto até E pode não passar por C — verifique ambas as direções
06
Hard — Uma empresa de entregas precisa encontrar a rota mais curta entre seu depósito (W) e 4 lojas. Distâncias: W–S1(10), W–S2(5), S1–S2(3), S1–S3(1), S2–S3(8), S2–S4(2), S3–S4(4).

a) Execute Dijkstra a partir de W para encontrar a menor distância até cada loja.
b) Qual é o caminho mais curto de W a S3?
c) Se a estrada W–S2 estiver fechada para obras, qual é o novo caminho mais curto de W a S3?
Para a parte (c), remova a aresta W–S2 e execute o algoritmo novamente
07
Code — Given the Java adjacency matrix below, what will Dijkstra’s Algorithm return as the shortest distance from node 0 to node 4?

int[][] graph = { {0, 6, 0, 1, 0}, {6, 0, 5, 2, 2}, {0, 5, 0, 0, 5}, {1, 2, 0, 0, 1}, {0, 2, 5, 1, 0} };
O nó 3 é muito bem conectado — verifique caminhos passando por ele
08
Challenge — Dijkstra NÃO funciona com pesos negativos nas arestas. Considere: A→C(2), A→B(5), B→C(−10).

a) Qual distância Dijkstra reporta como a mais curta de A a C?
b) Qual é a distância mais curta REAL?
c) Por que Dijkstra falha?
d) Cite um algoritmo que lida com pesos negativos.
Uma vez que Dijkstra visita um nó, ele nunca o reconsidera — mesmo que uma aresta negativa depois forneça um caminho mais curto
09
Medium — Encontre o caminho mais curto do nó 1 ao nó 5 neste grafo:

311528112345

Mostre seu raciocínio passo a passo.
O nó 3 é barato de alcançar — explore seus vizinhos com cuidado
10
Medium-Hard — Execute Dijkstra de A a F:

42315162ABCDEF

Mostre cada passo do algoritmo e identifique o caminho mais curto.
Existem múltiplas rotas até F — a mais curta pode te surpreender
11
Hard — Encontre o caminho mais curto de S a T neste grafo de 7 nós:

2547213413SABCDET

Arestas: S–A(2), S–B(5), A–C(4), A–E(7), B–D(2), B–E(1), C–T(3), D–T(4), E–C(1), E–D(3). Mostre seu raciocínio completo.
Não se deixe tentar pelo caminho direto por A — verifique por B e E
12
Challenge — Uma rede tem 8 roteadores. Encontre o caminho mais curto de R1 a R8:

36253142251R1R2R3R4R5R6R7R8

Arestas: R1–R2(3), R1–R3(6), R2–R4(2), R2–R5(5), R3–R5(3), R3–R6(1), R4–R7(4), R5–R7(2), R5–R6(2), R6–R8(5), R7–R8(1). Mostre a tabela de distâncias completa em cada passo.
Existem muitas rotas possíveis — seja metódico com sua tabela de distâncias
28
RESPOSTAS

Respostas

01
A → B → C, custo = 4
O caminho mais curto é A → B → C com custo 4 (3 + 1 = 4). O caminho direto A → C custa 5, que é mais caro.
02
Matriz de adjacência 3×3
ABC
A035
B301
C510
03
S → B → A → C → T, custo = 7
Começar em S
(cost 0)
SA: 0+4 = 4 NEW
SB: 0+2 = 2 NEW
→ Select B (2) 2
Visitar B
(cost 2)
A: 4 2+1 = 3
BC: 2+6 = 8 NEW
→ Select A (3) 3
Visitar A
(cost 3)
C: 8 3+3 = 6
AT: 3+8 = 11 NEW
→ Select C (6) 6
Visitar C
(cost 6)
T: 11 6+1 = 7
→ Select T (7) 7
Caminho mais curto: S → B → A → C → T, total cost = 7 (2 + 1 + 3 + 1)
04
A estratégia gulosa é segura porque pesos não negativos significam que a menor distância não pode ser melhorada depois.
A estratégia gulosa de Dijkstra funciona porque todos os pesos das arestas são não negativos. Quando escolhemos o nó não visitado com a menor distância, sabemos que sua distância é final — nenhum caminho futuro através de outros nós não visitados poderia ser mais curto (já que somar pesos não negativos só aumenta o total). Se escolhêssemos aleatoriamente, poderíamos marcar um nó como "concluído" antes de descobrir um caminho mais curto para ele através de outro nó.
05
A → B → E, custo = 5
Começar em A
(cost 0)
AB: 0+2 = 2 NEW
AC: 0+1 = 1 NEW
→ Select C (1) 1
Visit C
(cost 1)
CD: 1+3 = 4 NEW
CF: 1+6 = 7 NEW
AB: 2 (inalterado)
→ Select B (2) 2
Visit B
(cost 2)
D: 4 2+1 = 3
BE: 2+3 = 5 NEW
→ Select D (3) 3
Visit D
(cost 3)
(sem novos caminhos)
→ Select E (5) 5
Caminho mais curto: A → B → E, total cost = 5 (2 + 3)
06
a) S1=8, S2=5, S3=9, S4=7 | b) W→S2→S1→S3 (custo 9) | c) W→S1→S3 (custo 11)

Parte a) Dijkstra a partir de W:

StepCurrentWS1S2S3S4
0W0105
1S2085137
2S4085117
3S108597
4S308597

Menores distâncias: S1=8, S2=5, S3=9, S4=7

Parte b) Caminho mais curto de W a S3:

W → S2 → S1 → S3, cost = 5 + 3 + 1 = 9

Parte c) W–S2 fechada:

Sem a aresta W–S2, o único caminho até S1 é direto (custo 10). Depois S1→S3 = 1. Então W → S1 → S3, custo = 10 + 1 = 11.

07
Caminho mais curto: 0 → 3 → 4, custo = 2
StepCurrent01234
00061
130312
2403712

Caminho mais curto: 0 → 3 → 4, custo = 2 (1 + 1). A matriz mostra que do nó 0 ao nó 3 o peso é 1, e do nó 3 ao nó 4 o peso é 1.

08
a) Dijkstra visita C primeiro (distância 2, menor que B com 5), marca-o como visitado. Depois visita B (distância 5), descobre B→C = 5+(−10) = −5, mas C já está finalizado com 2. Dijkstra reporta A→C = 2.

b) O caminho mais curto real é A→B→C = 5 + (−10) = −5.

c) Dijkstra falha porque finaliza C com distância 2 antes de descobrir o caminho mais barato por B. Uma vez que um nó é marcado como visitado, ele nunca é reconsiderado — a suposição gulosa ("a menor distância é final") quebra quando existem pesos negativos, porque somar um peso negativo pode tornar um caminho mais longo mais curto.

d) O algoritmo de Bellman-Ford lida com pesos negativos relaxando TODAS as arestas V−1 vezes, garantindo que todos os caminhos mais curtos sejam encontrados.
a) Dijkstra reporta A→C = 4. Ele visita B primeiro (distância 1), depois C (distância 4). Ele nunca reconsidera C via B.

b) Menor real: A→B→C = 1 + (−5) = −4.

c) Dijkstra marca C como visitado com distância 4 antes de descobrir o caminho por B. Uma vez visitados, nós nunca são reconsiderados — esta é a suposição fundamental que quebra com pesos negativos.

d) O algoritmo de Bellman-Ford lida com pesos negativos relaxando todas as arestas V−1 vezes, garantindo que todos os caminhos mais curtos sejam encontrados.
09
1 → 3 → 4 → 5, custo = 4
Animated Solution
311528112345d=0d=2d=1d=3d=4
Step-by-Step Calculation
Start at 1
(cost 0)
2: 0+3 = 3 NEW
3: 0+1 = 1 NEW
→ Select 3 (1) 1
Visit 3
(cost 1)
2: 31+1 = 2
4: 1+2 = 3 NEW
5: 1+8 = 9 NEW
→ Select 2 (2) 2
Visit 2
(cost 2)
4: 3 (2+5=7>3) (no change)
→ Select 4 (3) 3
Visit 4
(cost 3)
5: 93+1 = 4
→ Select 5 (4) 4
Shortest path: 1 → 3 → 4 → 5, total cost = 4 (1 + 2 + 1)
10
A → C → B → D → E → F, custo = 9
Animated Solution
42315162ABCDEFd=0d=3d=2d=6d=7d=9
Step-by-Step Calculation
Start at A
(cost 0)
B: 0+4 = 4 NEW
C: 0+2 = 2 NEW
→ Select C (2) 2
Visit C
(cost 2)
B: 42+1 = 3
E: 2+5 = 7 NEW
→ Select B (3) 3
Visit B
(cost 3)
D: 3+3 = 6 NEW
→ Select D (6) 6
Visit D
(cost 6)
E: 7 (6+1=7) (no change)
F: 6+6 = 12 NEW
→ Select E (7) 7
Visit E
(cost 7)
F: 127+2 = 9
→ Select F (9) 9
Shortest path: A → C → B → D → E → F, total cost = 9 (2 + 1 + 3 + 1 + 2)
11
S → A → C → T, custo = 9
Animated Solution
2547213413SABCDETd=0d=2d=5d=6d=7d=6d=9
Step-by-Step Calculation
Start at S
(cost 0)
A: 0+2 = 2 NEW
B: 0+5 = 5 NEW
→ Select A (2) 2
Visit A
(cost 2)
C: 2+4 = 6 NEW
E: 2+7 = 9 NEW
→ Select B (5) 5
Visit B
(cost 5)
D: 5+2 = 7 NEW
E: 95+1 = 6
→ Select C (6) 6
Visit C
(cost 6)
T: 6+3 = 9 NEW
→ Select E (6) 6
Visit E
(cost 6)
C: 6 (6+1=7>6) (no change)
D: 7 (6+3=9>7) (no change)
→ Select D (7) 7
Visit D
(cost 7)
T: 9 (7+4=11>9) (no change)
→ Select T (9) 9
Shortest path: S → A → C → T, total cost = 9 (2 + 4 + 3)
12
R1 → R2 → R4 → R7 → R8, custo = 10
Animated Solution
36253142251R1R2R3R4R5R6R7R8d=0d=3d=6d=5d=8d=7d=9d=10
Step-by-Step Calculation
Start at R1
(cost 0)
R2: 0+3 = 3 NEW
R3: 0+6 = 6 NEW
→ Select R2 (3) 3
Visit R2
(cost 3)
R4: 3+2 = 5 NEW
R5: 3+5 = 8 NEW
→ Select R4 (5) 5
Visit R4
(cost 5)
R7: 5+4 = 9 NEW
→ Select R3 (6) 6
Visit R3
(cost 6)
R5: 8 (6+3=9>8) (no change)
R6: 6+1 = 7 NEW
→ Select R6 (7) 7
Visit R6
(cost 7)
R5: 8 (7+2=9>8) (no change)
R8: 7+5 = 12 NEW
→ Select R5 (8) 8
Visit R5
(cost 8)
R7: 9 (8+2=10>9) (no change)
→ Select R7 (9) 9
Visit R7
(cost 9)
R8: 129+1 = 10
→ Select R8 (10) 10
Shortest path: R1 → R2 → R4 → R7 → R8, total cost = 10 (3 + 2 + 4 + 1)
29
REFERÊNCIAS

Referências

Fontes utilizadas na elaboração deste material

01
A* (A Star) Search Algorithm — Computerphile
Dr. Mike Pound explica A* usando Dijkstra como base, com exemplos de grafos desenhados à mão
Acessado em: 24 março 2026
02
Pathfinding algorithm comparison: Dijkstra's vs. A*
Comparação visual de Dijkstra e A* em dados reais do OpenStreetMap (Roma e NYC)
Acessado em: 24 março 2026
03
Compare A* with Dijkstra algorithm
Comparação lado a lado de busca de caminhos em grade mostrando nós visitados e custo
Acessado em: 24 março 2026
04
Dijkstra's Shortest Path Algorithm — Brilliant.org
Explicação interativa do algoritmo de Dijkstra com visualizações passo a passo
Acessado em: 24 março 2026
05
DSA Dijkstra's Algorithm — W3Schools
Tutorial com exemplos de código em múltiplas linguagens e visualizador interativo de grafos
Acessado em: 24 março 2026