Você está na página 1de 45

Algoritmos em Grafos

Aula 12: Caminho Mínimo (Dijkstra)


Professor Pablo Soares
2022.1
Sumário
1. Busca em Largura(últimas aula);
a. Distância mínima em número de arestas;
b. Árvore Primeiro na Extensão.
2. Caminho Mínimo.
a. Motivação;
i. Modelagem;
b. Algoritmo de Dijkstra.
i. Estruturas utilizadas;
ii. Tempo de Execução.

2
Caminho Mínimo(Motivação)
Situação Comum

3
Caminho Mínimo(Motivação)
Situação Comum

4
Caminho Mínimo(Modelagem)
1. Mapa rodoviário;
a. G = (V, E) → grafo ponderado;
i. V → Conjunto de cidades;
ii. E → Segmentos de estradas entre cidades.
● w(u, v) → Distância entre a cidade u e v(peso da aresta).
2. Seja “C” um caminho em G e P() uma função de peso;
a. P(C) = ∑w(u, v), ∀(u, v) ∈ C
min{P(c): u ↝ v}, se existir caminho de u até v
δ(u, v) =
∞ , caso contrário 5
Algoritmo de Dijkstra Dijkstra(G, s)
1. para cada vértice u ← V[G]
2. dist[u] ←∞
● Pseudocódigo 3. π[u] ← NULL
4. fimpara
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio
9. u ←RemoveDaFila(Q)
10. para cada vértice v ∊ L.adj(u)
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u
14. InsereNaFila(Q, v)
15. fimse
16. fimpara
17. fimenquanto
Fim. 6
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio dist:
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
11. se dist[v] > dist[u] + w(u, v) π:
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u
14. InsereNaFila(Q, v)
15. fimse
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u 7
v
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio dist: ∞ ∞ ∞ ∞ ∞ ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N N N N N N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u
14. InsereNaFila(Q, v)
15. fimse
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u 8
v
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio dist: 0 ∞ ∞ ∞ ∞ ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N N N N N N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u
14. InsereNaFila(Q, v)
15. fimse
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u 9
v
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( ) Criando a Fila de Prioridade
A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio dist: 0 ∞ ∞ ∞ ∞ ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
11. se dist[v] > dist[u] + w(u, v) π: N N N N N N
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q:
14. InsereNaFila(Q, v)
15. fimse
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u 10
v
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
A B C D E F
7. InsereNaFila(Q, s) Adiciona o vértice raiz na Fila
8. enquanto Q ≠ vazio dist: 0 ∞ ∞ ∞ ∞ ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N N N N N N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: A
14. InsereNaFila(Q, v)
15. fimse 0
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u 11
v
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio A fila está Vazia? dist: 0 ∞ ∞ ∞ ∞ ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N N N N N N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: A
14. InsereNaFila(Q, v)
15. fimse 0
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u 12
v
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( ) Fila de Prioridade
(Heap-min) A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio dist: 0 ∞ ∞ ∞ ∞ ∞
9. u ←RemoveDaFila(Q) Remove vértice de menor valor de dist
A B C D E F
10. para cada vértice v ∊ L.adj(u)
11. se dist[v] > dist[u] + w(u, v) π: N N N N N N
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q:
14. InsereNaFila(Q, v)
15. fimse
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←A 13
v
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio dist: 0 ∞ ∞ ∞ ∞ ∞
9. u ←RemoveDaFila(Q)
Lista de adjacência de A B C D E F
10. “u” para cada vértice v ∊ L.adj(u)
π: N N N N N N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q:
14. InsereNaFila(Q, v)
15. fimse
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←A 14
v
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
dist[B] > dist[A] + w(A,B) A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio ∞>0+4? dist: 0 ∞ ∞ ∞ ∞ ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N N N N N N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q:
14. InsereNaFila(Q, v)
15. fimse
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←A 15
v←B
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
dist[B] ← dist[A] + w(A,B) A B C D E F
7. InsereNaFila(Q, s) dist[B] ← 0 + 4
8. enquanto Q ≠ vazio π[B] ← A dist: 0 4 ∞ ∞ ∞ ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N A N N N N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q:
14. InsereNaFila(Q, v)
15. fimse
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←A 16
v←B
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
A B C D E F
7. InsereNaFila(Q, s) Insere B na Fila
8. enquanto Q ≠ vazio dist: 0 4 ∞ ∞ ∞ ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N A N N N N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: B
14. InsereNaFila(Q, v)
15. fimse 4
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←A 17
v←B
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
dist[C] > dist[A] + w(A,C) A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio ∞>0+2? dist: 0 4 ∞ ∞ ∞ ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N A N N N N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: B
14. InsereNaFila(Q, v)
15. fimse 4
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←A 18
v←C
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( ) dist[C] ← dist[A] + w(A,C)
A B C D E F
7. InsereNaFila(Q, s) dist[C] ← 0 + 2
π[C] ← A dist: 0 4 2 ∞ ∞ ∞
8. enquanto Q ≠ vazio Insere C na Fila
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N A A N N N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: B C
14. InsereNaFila(Q, v)
15. fimse 4 2
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←A 19
v←C
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio A fila está Vazia? dist: 0 4 2 ∞ ∞ ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N A A N N N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: B C
14. InsereNaFila(Q, v)
15. fimse 4 2
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←A 20
v←C
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( ) Fila de Prioridade
(Heap-min) A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio dist: 0 4 2 ∞ ∞ ∞
9. u ←RemoveDaFila(Q) Remove vértice de menor valor de dist
A B C D E F
10. para cada vértice v ∊ L.adj(u)
11. se dist[v] > dist[u] + w(u, v) π: N A A N N N
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: B
14. InsereNaFila(Q, v)
15. fimse 4
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←C 21
v←
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio dist: 0 4 2 ∞ ∞ ∞
9. u ←RemoveDaFila(Q)
Lista de adjacência de A B C D E F
10. “u” para cada vértice v ∊ L.adj(u)
π: N A A N N N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: B
14. InsereNaFila(Q, v)
15. fimse 4
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←C 22
v←
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
dist[A] > dist[C] + w(C,A) A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio 0>2+2? dist: 0 4 2 ∞ ∞ ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N A A N N N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: B
14. InsereNaFila(Q, v)
15. fimse 4
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←C 23
v←A
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
dist[B] > dist[C] + w(C,B) A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio 4>2+1? dist: 0 4 2 ∞ ∞ ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N A A N N N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: B
14. InsereNaFila(Q, v)
15. fimse 4
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←C 24
v←B
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( ) dist[B] ← dist[C] + w(C,B)
A B C D E F
7. InsereNaFila(Q, s) dist[B] ← 2 + 1
π[B] ← C dist: 0 3 2 ∞ ∞ ∞
8. enquanto Q ≠ vazio Atualiza B na Fila
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A N N N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: B
14. InsereNaFila(Q, v)
15. fimse 3
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←C 25
v←B
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
dist[D] > dist[C] + w(C,D) A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio ∞>2+8? dist: 0 3 2 ∞ ∞ ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A N N N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: B
14. InsereNaFila(Q, v)
15. fimse 3
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←C 26
v←D
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( ) dist[D] ← dist[C] + w(C,D)
A B C D E F
7. InsereNaFila(Q, s) dist[D] ← 2 + 8
π[D] ← C dist: 0 3 2 10 ∞ ∞
8. enquanto Q ≠ vazio Adiciona D na Fila
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A C N N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: B D
14. InsereNaFila(Q, v)
15. fimse 3 10
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←C 27
v←D
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
dist[E] > dist[C] + w(C,E) A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio ∞ > 2 + 10 ? dist: 0 3 2 10 ∞ ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A C N N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: B D
14. InsereNaFila(Q, v)
15. fimse 3 10
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←C 28
v←E
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( ) dist[E] ← dist[C] + w(C,E)
A B C D E F
7. InsereNaFila(Q, s) dist[E] ← 2 + 10
π[E] ← C dist: 0 3 2 10 12 ∞
8. enquanto Q ≠ vazio Adiciona E na Fila
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A C C N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: B D E
14. InsereNaFila(Q, v)
15. fimse 3 10 12
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←C 29
v←E
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( ) Fila de Prioridade
(Heap-min) A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio dist: 0 3 2 10 12 ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A C C N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: D E
14. InsereNaFila(Q, v)
15. fimse 10 12
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←B 30
v←E
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio dist: 0 3 2 10 12 ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A C C N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: D E
14. InsereNaFila(Q, v)
15. fimse 10 12
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←B 31
v←E
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
dist[D] > dist[B] + w(B,D) A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio 10 > 3 + 5 ? dist: 0 3 2 10 12 ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A C C N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: D E
14. InsereNaFila(Q, v)
15. fimse 10 12
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←B 32
v←D
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( ) dist[D] ← dist[B] + w(B,D)
A B C D E F
7. InsereNaFila(Q, s) dist[D] ← 3 + 5
π[D] ← B dist: 0 3 2 8 12 ∞
8. enquanto Q ≠ vazio Atualiza D na Fila
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A B C N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: D E
14. InsereNaFila(Q, v)
15. fimse 8 12
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←B 33
v←D
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( ) Fila de Prioridade
(Heap-min) A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio dist: 0 3 2 8 12 ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A B C N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: E
14. InsereNaFila(Q, v)
15. fimse 12
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←D 34
v←D
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
dist[E] > dist[D] + w(D,E) A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio 12 > 8 + 2 ? dist: 0 3 2 8 12 ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A B C N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: E
14. InsereNaFila(Q, v)
15. fimse 12
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←D 35
v←E
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( ) dist[E] ← dist[D] + w(D,E)
A B C D E F
7. InsereNaFila(Q, s) dist[E] ← 8 + 2
π[E] ← D dist: 0 3 2 8 10 ∞
8. enquanto Q ≠ vazio Atualiza E na Fila
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A B D N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: E
14. InsereNaFila(Q, v)
15. fimse 10
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←D 36
v←E
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
dist[F] > dist[D] + w(D,F) A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio ∞>8+6? dist: 0 3 2 8 10 ∞
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A B D N
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: E
14. InsereNaFila(Q, v)
15. fimse 10
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←D 37
v←F
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( ) dist[F] ← dist[D] + w(D,F)
A B C D E F
7. InsereNaFila(Q, s) dist[F] ← 8 + 6
π[F] ← D dist: 0 3 2 8 10 14
8. enquanto Q ≠ vazio Adiciona F na Fila
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A B D D
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: E F
14. InsereNaFila(Q, v)
15. fimse 10 14
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←D 38
v←F
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( ) Fila de Prioridade
(Heap-min) A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio dist: 0 3 2 8 10 14
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A B D D
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: F
14. InsereNaFila(Q, v)
15. fimse 14
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←E 39
v←F
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( )
dist[F] > dist[E] + w(E,F) A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio 14 > 10 + 2 ? dist: 0 3 2 8 10 14
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A B D D
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: F
14. InsereNaFila(Q, v)
15. fimse 14
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←E 40
v←F
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0
6. Q←FilaDePrioridade( ) dist[F] ← dist[E] + w(E,F)
A B C D E F
7. InsereNaFila(Q, s) dist[F] ← 10 + 2
π[F] ← E dist: 0 3 2 8 10 12
8. enquanto Q ≠ vazio Atualiza F na Fila
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A B D E
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q: F
14. InsereNaFila(Q, v)
15. fimse 12
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←E 41
v←F
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0 Fila de Prioridade
6. Q←FilaDePrioridade( ) (Heap-min)
A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio dist: 0 3 2 8 10 12
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A B D E
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q:
14. InsereNaFila(Q, v)
15. fimse
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←F 42
v←F
Dijkstra(G, s) B 5 D 6
4
1. para cada vértice u ← V[G]
2. dist[u] ←∞ 1 8 F
A 2
3. π[u] ← NULL
4. fimpara 10 2
2 C E
5. dist[s] ← 0 Fila Vazia
6. Q←FilaDePrioridade( ) Fim da Execução
A B C D E F
7. InsereNaFila(Q, s)
8. enquanto Q ≠ vazio dist: 0 3 2 8 10 12
9. u ←RemoveDaFila(Q)
A B C D E F
10. para cada vértice v ∊ L.adj(u)
π: N C A B D E
11. se dist[v] > dist[u] + w(u, v)
12. dist[v] ← dist[u] + w(u, v)
13. π[v] ←u Q:
14. InsereNaFila(Q, v)
15. fimse
16. fimpara Variáveis do código:
17. fimenquanto s←A
Fim. u←F 43
v←F
Exercício de Fixação
Encontre a menor distância do vértice 8 para todos os outros vértices do
grafo.

44
Algoritmos em Grafos
Aula 12: Caminho Mínimo (Dijkstra)
Professor Pablo Soares
2022.1

Você também pode gostar