Anda di halaman 1dari 61

Caminho Mínimo com Única Fonte

Breno Oliveira
Guilherme Baviera
Motivação - Caminho mínimo
● O caminho mínimo entre os vértices v e w de um grafo G ponderado é aquele cuja
soma dos pesos das arestas tem o menor valor possível dentre todos os caminhos
existentes entre v e w.

Variantes:

● Única fonte: Menor caminho a partir de um vértice para qualquer outro vértice.
● Único destino: Menor caminho entre cada um dos vértices do grafo e um nó de
destino dado.
● Origem-destino: menor caminho entre vértices específicos.
● Todos os pares: menor caminho entre todos os pares de vértices.
Caminho mínimo de Única Fonte

Principais algoritmos (fonte única):

- Dijkstra
- Bellman-Ford (arestas negativas)
- DAG (ordenação topológica)
Questão
Que condições possuem o problema de caminho mínimo que nos permitem resolvê-lo
em partes, a ainda garantir a solução ótima?
Subestrutura ótima de um caminho mínimo

Os algoritmos de caminho mínimo se baseiam na propriedade de que um caminho


mínimo entre dois vértices contém outros caminhos mínimos em seu interior. Ou seja:

Subcaminhos de caminhos mínimos são caminhos mínimos


Subestrutura ótima de um caminho mínimo
Seja P um caminho mínimo de u para v que passa pelos vértices x e y

P(ux) P(xy) P(yv)


u x y v

Podemos afirmar que P(xy) é um caminho mínimo de x para y


Subestrutura ótima de um caminho mínimo

Ou seja, sem modificar a complexidade do algoritmo podemos identificar


‘partes’ de caminhos mínimos durante a execução do mesmo.

P(ux) P(xy) P(yv)


u x y v

P
Questão
Explique o Algoritmo de Dijkstra e em quais tipos de grafos ele pode ser aplicado.
Ilustre seu funcionamento através de um exemplo.
Algoritmo de Dijkstra

● Edsger Dijkstra (1930-2002)


● Holanda
● Concebido em 1956
● Publicado em 1959
Algoritmo de Dijkstra - Características
● Arestas ponderadas
● Arestas com pesos não negativos
● Guloso
● Relaxamento de arestas
● Complexidade:
○ O(n²) - Implementação simples
○ O([m+n]log n) - Heap Binário
○ O(nlogn+m) - Heap de Fibonacci
Algoritmo de Dijkstra
Dijkstra(G,w,s)
S: Conjunto de vértices cujos pesos finais de 1 Initialize-Single-Source(G,s)
caminhos mínimos desde a origem (s) já 2 S←∅
foram determinados 3 Q = V[G]
4 while Q != ∅
Q: Fila de prioridades mínima de vértices, 5 do u ← Extract min(Q)
tendo como chaves seus valores de d 6 S ← S ∪ {u}
(estimativa de melhor caminho) 7 for each (u, v) ∈ Adj[u]
8 do Relax(u, v,w)
Relaxamento
● Estimativa
● No Alg. de Dijkstra é feito
exatamente uma vez por
aresta.

● d[v] - Estimativa de
caminho mais curto (limite
superior) do vértice inicial
até v.
● w[u,v] - Peso da aresta
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
1 Initialize-Single-Source(G,s)
2 S←∅
3 Q = V[G]
4 while Q != ∅
5 do u ← Extract min(Q)
d[v] - Estimativa de caminho mais curto (limite 6 S ← S ∪ {u}
superior) do vértice inicial até v. 7 for each (u, v) ∈ Adj[u]
8 do Relax(u, v,w)
Complexidade - O(V)
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[Ø,∞] [Ø,∞] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[Ø,∞] [Ø,∞]
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[Ø,∞] [Ø,∞] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[Ø,∞] [Ø,∞]

Q v0 v1 v2 v3 v4 v5 S
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[Ø,∞] [Ø,∞] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[Ø,∞] [Ø,∞]

Q v0 v1 v2 v3 v4 v5 S
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[Ø,∞] [Ø,∞] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[Ø,∞] [Ø,∞]

Q v0 v1 v2 v3 v4 v5 S
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[Ø,∞] [Ø,∞] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[Ø,∞] [Ø,∞]

Q v0 v1 v2 v3 v4 v5 S v0
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[Ø,∞] [Ø,∞] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[Ø,∞] [Ø,∞]

Q v0 v1 v2 v3 v4 v5 S v0
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v0,10] [Ø,∞] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[Ø,∞] [Ø,∞]

Q v0 v1 v2 v3 v4 v5 S v0
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v0,10] [Ø,∞] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [Ø,∞]

Q v0 v1 v2 v3 v4 v5 S v0
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v0,10] [Ø,∞] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [Ø,∞]

Q v0 v1 v2 v3 v4 v5 S v0
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v0,10] [Ø,∞] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [Ø,∞]

Q v0 v1 v2 v3 v4 v5 S v0
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v0,10] [Ø,∞] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [Ø,∞]

Q v0 v1 v2 v3 v4 v5 S v0 v2
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v0,10] [Ø,∞] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [Ø,∞]

Q v0 v1 v2 v3 v4 v5 S v0 v2
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [Ø,∞] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [Ø,∞]

Q v0 v1 v2 v3 v4 v5 S v0 v2
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v2,13] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [Ø,∞]

Q v0 v1 v2 v3 v4 v5 S v0 v2
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v2,13] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v2,13] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v2,13] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v2,13] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v2,13] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [Ø,∞] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v2,13] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [v4,13] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v2,13] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [v4,13] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v2,13] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [v4,13] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v2,13] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [v4,13] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4 v1
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v2,13] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [v4,13] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4 v1
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v1,9] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [v4,13] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4 v1
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v1,9] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [v4,13] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4 v1
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v1,9] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [v4,13] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4 v1
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v1,9] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [v4,13] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4 v1 v3
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v1,9] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [v4,13] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4 v1 v3
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v1,9] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [v4,13] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4 v1 v3
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v1,9] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [v4,13] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4 v1 v3
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v1,9] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [v4,13] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4 v1 v3
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v1,9] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [v4,13] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4 v1 v3 v5
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v1,9] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [v4,13] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4 v1 v3 v5
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v1,9] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [v4,13] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4 v1 v3 v5
Algoritmo de Dijkstra - Execução
Dijkstra(G,w,s)
[v2,8] [v1,9] 1 Initialize-Single-Source(G,s)
1
v1 v3 2 S←∅
4
3 Q = V[G]
10
4 while Q != ∅
3 8 4 5 do u ← Extract min(Q)
v0 v5
6 S ← S ∪ {u}
[Ø,0] [v4,13] 7 for each (u, v) ∈ Adj[u]
5 6 8 do Relax(u, v,w)
v2 v4
2
[v0,5] [v2,7]

Q v0 v1 v2 v3 v4 v5 S v0 v2 v4 v1 v3 v5
Algoritmo de Dijkstra - Semelhanças
AGM:
[v2,8] [v1,9] Prim escolheria a aresta (v3-v5), para a AGM.
1 Dijkstra é opcional, pois:
v1 v3

10 4
p<v0-v2-v1-v3-v5> = p<v0-v2-v4-v5>

3 8 4
v0 v5
Busca em Largura:
[Ø,0] [v4,13] Na BFS temos que (v0-v1): ‘Distância’ 1
5 6
No caminho mínimo temos que a menor
v2 v4
2 distância entre v0 e v1 é:
[v0,5] [v2,7]
(v0-v2-v1)
Questão
E se tivermos arestas com peso negativos?
Pode?

Desde que G =(V,E) não


contenha ciclos de peso
negativo!

O ciclo <c,d,c> não é negativo,


pois tem o peso de 6 + (-3) > 0.
Então o caminho mínimo de s
até c é: <s,c> = 5

Já o ciclo <e,f> é negativo, pois


tem o peso 3 + (-6) < 0. Então, o
caminho mínimo de s até e é -∞,
pois sempre que passarmos pelo
ciclo, o caminho mínimo
diminui ainda mais.
E o Bellman-Ford?
Bellman-Ford permite arestas de peso negativo no grafo e produz uma resposta correta caso não
haja nenhum ciclo de peso negativo.

Entretanto, havendo ciclo de pesos negativos, o algoritmo o detecta e retorna False.

¯\_(ツ)_/¯
Questão
Em quais situações cotidianas o grupo acha que utilizamos algoritmos de caminho
mínimo com única fonte?
Rotas de caminhos mínimos nos setores
de transportes, priorizando a eficiência
e economia de recursos.
Aplicativos de roteamento de trajetos
urbanos.
O ‘peso’ das arestas podem ser
compostos por distância, fluxo do
trânsito, etc.
Rotas de caminhos
mínimos para pacotes em
redes de computadores.
Pesos podem estar
relacionados com taxa de
transmissão, por exemplo.
Obrigado!
"Ciência da computação tem tanto a ver com o computador como a Astronomia com o
telescópio, a Biologia com o microscópio, ou a Química com os tubos de ensaio. A Ciência
não estuda ferramentas, mas o que fazemos e o que descobrimos com elas." (Dijkstra)
Bibliografia
Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2009). Introduction to
algorithms. MIT press. [Capítulo 24 - Problema do Caminho Mínimo]

Goldbarg, M., Goldbarg, E. (2012). Grafos: conceitos, algoritmos e aplicações. 1a ed.,


Elsevier: Rio de Janeiro, 622 p., ISBN 9788535257168. [Capítulo 4]

http://www.saepro.ufv.br/wp-content/uploads/2010.2.pdf

Anda mungkin juga menyukai