Você está na página 1de 35

Grafos – Caminhos mínimos com uma origem

Aula 14

Fábio Henrique Viduani Martinez

Faculdade de Computação
Universidade Federal de Mato Grosso do Sul

Análise de Algoritmos

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 1 / 35


Conteúdo da aula

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

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 2 / 35


Motivação

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 .

I um caminho de peso mínimo, ou simplesmente caminho mínimo,


do vértice u a v é definido como qualquer caminho p com peso
w(p) = dist(u, v)
Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 4 / 35
Motivação

Definição do problema

I no caso do exemplo Campo Grande–para–São Paulo, podemos


modelar o mapa rodoviário como um grafo: vértices representam
intersecções, arestas representam segmentos de estradas entre
intersecções e os pesos das arestas representam distâncias
I o objetivo é encontrar um caminho mínimo de alguma intersecção
dada de Campo Grande (por exemplo, rua 13 de maio com
avenida Afonso Pena) a uma intersecção dada de São Paulo (por
exemplo, avenida Paulista com rua da Consolação)

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 5 / 35


Motivação

Definição do problema

I pesos nas arestas podem ser interpretados de outras maneiras,


como por exemplo tempo, custo, penalidade, perda ou qualquer
outra quantidade que se acumula ao longo de um caminho e que
alguém deseja minimizar
I o algoritmo BFS é um algoritmo para encontrar um menor
caminho que trabalha com grafos sem pesos, ou seja, grafos em
que cada aresta pode ser considerada como tendo peso unitário

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 6 / 35


Motivação

Definição do problema

Problema do caminho mínimo com uma origem


Dado um grafo G = (V, E) orientado e com pesos nas arestas
w : E → Q, encontrar um caminho mínimo de um dado vértice origem
s ∈ V para todos os outros vértices v ∈ V

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 7 / 35


Subestrutura ótima

Propriedades do problema

I um caminho mínimo entre dois vértices contém outros caminhos


mínimos internamente
I programação dinâmica e método guloso podem ser aplicados!
I o algoritmo de Dijkstra é um algoritmo guloso, enquanto o
algoritmo de Floyd–Warshall é um algoritmo de programação
dinâmica (soluciona o problema de encontrar caminhos mínimos
entre todos os pares de vértices de um grafo dado)

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 8 / 35


Subestrutura ótima

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

Dado um grafo G = (V, E) orientado e com pesos nas arestas


w : E → Q, seja p = v1 v2 · · · vk um caminho mínimo do vértice v1 ao
vértice vk e, para qualquer i e j tal que 1 6 i 6 j 6 k, seja
pi j = vi vi+1 · · · v j o subcaminho de p do vértice vi ao vértice v j . Então,
pi j é um caminho mínimo de vi a v j .

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 9 / 35


Arestas com peso negativo

Importante!

I em algumas instâncias do problema do caminho mínimo com


uma origem, podem existir arestas de peso negativo
I se o grafo G = (V, E) não contém circuitos de peso negativo
alcançáveis a partir de s, então o peso de um caminho mínimo
dist(s, v) é bem definido para todo v ∈ V, mesmo se tal caminho
tem valor negativo
I entretanto, se existe um circuito de peso negativo alcançável a
partir de s então os pesos dos caminhos mínimos não estão bem
definidos
I nenhum caminho de s a um vértice no circuito negativo pode ser
um caminho mínimo
I se existe um circuito de peso negativo em algum caminho de s a
v, definimos dist(s, v) = −∞

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 10 / 35


Arestas com peso negativo

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

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 11 / 35


Arestas com peso negativo

Importante!

I o algoritmo de Dijkstra assume que todos os pesos das arestas


no grafo de entrada são não negativos
I o algoritmo de Bellman-Ford permite arestas com pesos negativos
no grafo de entrada e produz uma resposta correta se nenhum
circuito de peso negativo é alcançável a partir do vértice origem

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 12 / 35


Circuitos

Importante!

I um caminho mínimo pode conter circuitos?


I circuitos de peso negativo não são permitidos, como vimos
anteriormente
I e, também, circuitos de peso positivo não podem estar contidos
em um caminho mínimo, já que o circuito pode ser removido do
caminho de forma segura
I e circuitos de peso zero? também não, porque podemos remover
tal circuito, do mesmo modo
I portanto, sem perda de generalidade, podemos assumir que
quando encontramos caminhos mínimos, eles não possuem
circuitos

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 13 / 35


Representação dos caminhos mínimos

Implementação

I dado um grafo G = (V, E), mantemos um predecessor v.π para


cada vértice v ∈ V, que é um outro vértice ou nil
I como no BFS, estamos interessados no subgrafo predecessor
Gπ = (Vπ , Eπ ) induzido pelos valores de π:

Vπ = {v ∈ V : v.π , nil} ∪ {s}

e n o
Eπ = (v.π, v) ∈ E : v ∈ Vπ − s

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 14 / 35


Representação dos caminhos mínimos

Implementação

I os valores de π têm a propriedade que, ao final, Gπ é uma “árvore


de caminhos mínimos” com raiz s
I uma árvore de caminhos mínimos com raiz s é um subgrafo
orientado G0 = (V 0 , E0 ), onde V 0 ⊆ V e E0 ⊆ E, tal que
1. V 0 é o conjunto de vértices alcançáveis a partir de s em G;
2. G0 é uma árvore com raiz s; e
3. para todo v0 ∈ V 0 , o único caminho de s a v em G0 é um caminho
mínimo de s a v em G

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 15 / 35


Relaxamento

Definição

I para cada vértice v ∈ V, mantemos um atributo v.d que é um


limitante superior sobre o peso de um caminho mínimo de s a v
I v.d é chamado de estimativa do peso de um caminho mínimo de s
av

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 16 / 35


Relaxamento

Inicialização

Inicializamos as estimativas dos pesos dos caminhos mínimos e os


predecessores pelo algoritmo abaixo, de tempo Θ(V)

InitializeSingleSource(G, s)
01. para cada vértice v ∈ G.V
02. v.d = ∞
03. v.π = nil
04. s.d = 0

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 17 / 35


Relaxamento

Propriedades

I o processo de relaxamento de um aresta uv consiste em verificar


se podemos melhorar um caminho mínimo até o vértice v,
encontrado a partir do vértice u e, se for o caso, atualizar v.d e v.π
I o passo de relaxamento pode diminuir o valor da estimativa do
peso do caminho mínimo v.d e atualizar o atributo predecessor
v.π de v

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 18 / 35


Relaxamento

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

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 19 / 35


Algoritmo de Bellman-Ford

Ideia geral

I arestas podem ter peso negativo


I dado um grafo orientado G = (V, E) com origem s e função peso
w : E → Q, o algoritmo devolve um valor lógico indicando se existe
um circuito de peso negativo que é alcançável a partir de s
I se existe um tal circuito, o algoritmo indica que não existe uma
solução
I caso contrário, o algoritmo produz os caminhos mínimos e seus
pesos

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 20 / 35


Algoritmo de Bellman-Ford

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

Tempo de execução: O(VE)

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 21 / 35


Algoritmo de Bellman-Ford

Exemplo de execução

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 22 / 35


Caminhos mínimos com uma origem em dags

Ideia geral

I pelo relaxamento das arestas de um dag G = (V, E) com pesos de


acordo com a ordenação topológica de seus vértices, podemos
computar os caminhos mínimos a partir de uma origem em tempo
Θ(V + E)
I caminhos mínimos são sempre bem definidos em um dag, já que
mesmo se existem arestas com pesos negativos nesse dag, não
existem circuitos (negativos)

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 23 / 35


Caminhos mínimos com uma origem em dags

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)

Tempo de execução: Θ(V + E)

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 24 / 35


Caminhos mínimos com uma origem em dags

Exemplo de execução

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 25 / 35


Algoritmo de Dijkstra

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

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 26 / 35


Algoritmo de Dijkstra

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)

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 27 / 35


Algoritmo de Dijkstra

Análise do algoritmo

I depende de como a lista de min-prioridades é implementada:


I como um vetor: O(V 2 + E) = O(V 2 )
I como um min-heap binário: O((V + E) lg V) = O(E lg V)
I existem implementações mais eficientes, como por exemplo, como
um heap de Fibonacci, com tempo O(V lg V + E)

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 28 / 35


Algoritmo de Dijkstra

Exemplo de execução

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 29 / 35


Exercícios

Exercícios

24.1-1 Execute o algoritmo de Bellman-Ford sobre o grafo fornecido na figura do slide


22 da aula 13, usando o vértice z como origem. Em cada passo, relaxe as
arestas na mesma ordem da figura e mostre os valores de d e π depois de cada
passo. Depois, troque o peso da aresta zx para 4 e execute o algoritmo
novamente, usando s como origem.
24.1-3 Dado um grafo orientado G = (V, E) com pesos nas arestas e livre de circuitos de
peso negativo, seja m o valor máximo, sobre todos os pares de vértices u, v ∈ V,
do menor número de arestas em um caminho mínimo de u a v. Aqui, o caminho
é mínimo devido ao seu peso, não devido a seu número de arestas. Sugira uma
mudança simples no algoritmo de Bellman-Ford que permita que ele termine em
m + 1 passos, mesmo se m não é conhecido de antemão.
24.1-4 Modifique o algoritmo de Bellman-Ford tal que ele atribua −∞ para v.d para
todos os vértices v para os quais existe um circuito de peso negativo em algum
caminho do vértice origem s a v.

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 30 / 35


Exercícios

Exercícios

24.2-1 Execute o algoritmo DAGShortestPaths sobre o grafo orientado do slide 25 da


aula 13 usando o vértice r como origem.
24.2-2 Suponha que trocamos a linha 3 do algoritmo DAGShortestPaths para

03. para os primeiros |V| − 1 vértices, tomados da ordenação topológica


Mostre que o algoritmo ainda permanece correto com essa modificação.
24.2-4 Descreva um algoritmo eficiente para contar o número total de caminhos em um
grafo orientado acíclico. Analise seu algoritmo.

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 31 / 35


Exercícios

Exercícios

24.3-1 Execute o algoritmo de Dijkstra sobre o grafo orientado da figura 1, primeiro


usando s como origem e depois usando z como origem. Mostre os valores de d
e π e os vértices no conjunto S depois de cada iteração.

t x
6
3
4
s 0 2 1 2 7
3
5

6
y z

Figura: Grafo do exercício 24.3-1.

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 32 / 35


Exercícios

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

04. enquanto |Q| > 1


Essa mudança faz com que a estrutura de repetição enquanto execute |V| − 1
vezes ao invés de |V| vezes. O algoritmo proposto está correto?
24.3-6 Seja G = (V, E) um grafo orientado tal que cada aresta (u, v) ∈ E tem um valor
associado r(u, v), um número real no intervalo 0 6 r(u, v) 6 1 que representa a
confiabilidade do canal de comunicação do vértice u para o vértice v.
Interpretamos r(u, v) como a probabilidade do canal de u a v não falhar e
assumimos que essas probabilidades são independentes. Forneça um algoritmo
eficiente que encontra o caminho mais confiável entre dois vértices dados.

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 33 / 35


Exercícios

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.

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 34 / 35


Exercícios

Exercícios

24-2 Caixas encaixadas


Uma caixa d-dimensional com dimensões (x1 , x2 , . . . , xd ) cabe em outra caixa
com dimensões (y1 , y2 , . . . , yd ) se existe uma permutação π em {1, 2, . . . , d} tal que
xπ1 < y1 , xπ2 < y2 , . . . , xπd < yd .

(a) Argumente que a relação “caber em” é transitiva.


(b) Descreva um método eficiente para determinar se uma caixa
d-dimensional cabe em outra.
(c) Suponha que seja dado um conjunto de n caixas d-dimensionais
{B1 , B2 , . . . , Bn }. Forneça um algoritmo eficiente para encontrar a
maior sequência hBi1 , Bi2 , . . . , Bik i de caixas tal que Bi j cabe em Bi j+1
para j = 1, 2, . . . , k − 1. Expresse o tempo de execução do seu
algoritmo em termos de n e d.

Viduani Martinez (FACOM) Grafos – Caminhos mínimos com uma origem AA 35 / 35

Você também pode gostar