Escolar Documentos
Profissional Documentos
Cultura Documentos
Aula 14
Faculdade de Computação
Universidade Federal de Mato Grosso do Sul
Análise de Algoritmos
1 Motivação
2 Subestrutura ótima
3 Arestas com peso negativo
4 Circuitos
5 Representação dos caminhos mínimos
6 Relaxamento
7 Algoritmo de Bellman-Ford
8 Caminhos mínimos com uma origem em dags
9 Algoritmo de Dijkstra
10 Exercícios
Aplicações
I um motorista deseja encontrar o caminho mais curto de Campo
Grande a São Paulo
I dado um mapa rodoviário do Brasil, contendo a distância entre
cada par de intersecções adjacentes, como determinar a rota
mais curta?
I uma forma possível é enumerar todas as possíveis rotas de
Campo Grande a São Paulo, somar as distâncias em cada rota e
selecionar a mais curta
I entretanto, é fácil ver que existem milhares de rotas possíveis,
mesmo se não permitimos rotas que contêm circuitos, e muitas
delas não valem a pena ser consideradas
I por exemplo, a rota de Campo Grande a São Paulo passando por
Manaus é obviamente uma escolha ruim
I nesta aula veremos como solucionar problemas como esse
eficientemente
Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 3 / 35
Motivação
Definição do problema
I seja G = (V, E) um grafo orientado e com pesos nas arestas
w: E → Q
I o peso de um caminho p = v0 v1 · · · vk é a soma dos pesos de suas
arestas:
X k
w(p) = w(vi−1 vi )
i=1
I definimos o peso de um caminho mínimo de u a v como
( p
dist(u, v) = min {w(p) : u v} , se existe um caminho p de u a v ,
∞, caso contrário .
Definição do problema
Definição do problema
Definição do problema
Propriedades do problema
Importante!
Importante!
a b
−4
3 −1
h i
4 2
3
s c 6 d g
5 11 8
0 5 −
−8 3
−3
2
7 j
e 3 f
− −
−6
Importante!
Importante!
Implementação
e n o
Eπ = (v.π, v) ∈ E : v ∈ Vπ − s
Implementação
Definição
Inicialização
InitializeSingleSource(G, s)
01. para cada vértice v ∈ G.V
02. v.d = ∞
03. v.π = nil
04. s.d = 0
Propriedades
Algoritmo de relaxamento
Relax(u, v, w)
01. se v.d > u.d + w(uv)
02. v.d = u.d + w(uv)
03. v.π = u
Ideia geral
Algoritmo
Bellman-Ford(G, w, s)
01. InitializeSingleSource(G, s)
02. para i = 1 to |G.V| − 1
03. para cada aresta uv ∈ G.E
04. Relax(u, v, w)
05. para cada aresta uv ∈ G.E
06. se v.d > u.d + w(uv)
07. devolva false
08. devolva true
Exemplo de execução
Ideia geral
Algoritmo
DAGShortestPaths(G, w, s)
01. TopologicalSort(G)
02. InitializeSingleSource(G, s)
03. para cada vértice u, tomado da ordenação topológica
04. para cada vértice v ∈ Adj[u]
05. Relax(u, v, w)
Exemplo de execução
Ideia geral
I todas as arestas têm peso não negativo: w(uv) > 0 para toda
aresta uv ∈ E
I mantém um conjunto S de vértices cujos pesos dos caminhos
mínimos a partir da origem s até os vértices em S já foram
determinados
I o algoritmo seleciona repetidamente o vértice u ∈ V \ S com a
menor estimativa de peso de caminho mínimo, adiciona u a S e
relaxa todas as arestas saindo de u
I usa uma lista de min-prioridades Q
Algoritmo
Dijkstra(G, w, s)
01. InitializeSingleSource(G, s)
02. S=∅
03. Q = G.V
04. enquanto Q , ∅
05. u = ExtractMin(Q)
06. S = S+u
07. para cada vértice v ∈ Adj[u]
08. Relax(u, v, w)
Análise do algoritmo
Exemplo de execução
Exercícios
Exercícios
Exercícios
t x
6
3
4
s 0 2 1 2 7
3
5
6
y z
Exercícios
24.3-2 Forneça um exemplo simples de um grafo orientado com arestas com pesos
negativos para o qual o algoritmo de Dijkstra produz resposta incorretas.
24.3-3 Suponha que trocamos a linha 4 do algoritmo de Dijkstra para
Exercícios
24.3-7 Seja G = (V, E) um grafo orientado com pesos nas arestas w : E → {1, . . . , W} para
algum inteiro positivo W. Considere que, para qualquer par de vértices u, v, os
pesos dos caminhos mínimos de s a u e de s a v são diferentes. Suponha agora
que definimos um grafo orientado G0 = (V ∪ V 0 , E0 ) sem pesos nas arestas,
trocando cada aresta uv ∈ G.E por uma série de w(uv) arestas de peso 1.
Quantos vértices tem o grafo G0 ? Suponha que executamos o algoritmo BFS
com entrada G0 . Mostre que a ordem em que os vértices de V são coloridos
com preto na busca em largura de G0 é a mesma ordem em que os vértices de
V são extraídos da lista de min-prioridades na linha 5 do algoritmo de Dijkstra
com entrada G.
24.3-8 Seja G = (V, E) um grafo orientado com pesos nas arestas w : E → {0, 1, . . . , W}
para algum inteiro positivo W. Modifique o algoritmo de Dijkstra para computar
caminhos mínimos de um dado vértice origem s em tempo O(WV + E).
24.3-10 Suponha que temos um grafo orientado G = (V, E) com pesos nas arestas, tal
que as arestas de saem do vértice origem s podem ter pesos negativos, mas
todas as outras arestas têm pesos não negativos e não existem circuitos de
peso negativo em G. Argumente que o algoritmo de Dijkstra encontra
corretamente caminhos mínimos a partir de s nesse grafo.
Exercícios