Anda di halaman 1dari 19

Caminhos mínimos de fonte única

Maurício Vieira
Pedro Pio
Leonardo Almeida
Motivação
• Dado um mapa de cidades, contendo as distâncias entre cidades, qual o menor
caminho entre quaisquer cidades A e B?

Este problema pode ser modelado através de um grafo:


• Cidade: vértices;
• Estradas entre cidades: arestas ponderadas com peso que indicam distância
entre cidades.

Esse problema é conhecido como Problema do Caminho Mínimo.


Caminho Mínimo
Em geral, algoritmos de caminho mínimo se baseiam na seguinte propriedade: um
caminho mínimo entre dois vértices contém outros caminhos mínimos. Isso nos leva
a uma subestrutura ótima e ao método guloso.

Algoritmos gulosos tipicamente produzem soluções subótimas. No caso do “problema


de caminhos mínimos com uma fonte”, o algoritmo guloso obtém a solução ótima.
A chave para mostrar que o algoritmo produz uma solução ótima é o fato que quando
u é inserido em S, d[u] = δ(s,u)
Ciclos de peso negativo
Ciclos
Caminhos mínimos podem conter ciclos?

● Peso negativo, acabamos de descartar


● Peso positivo, podemos obter um caminho mínimo eliminando o ciclo

Isto é se p’ = (v0, v1, …, vk) é um caminho e c = (vi, vi+1, …, vj) é um ciclo de


peso positivo nesse caminho (de modo que vi = vj e w(c) > 0), então o caminho
p’ = (v0, v1, …vi, vi+1, …, vj, …, vk) tem peso w(p’) = w(p) - w(c) < w(p) e,
portanto, p não pode ser um caminho mínimo de v0 a vk.

● Peso nulo, não existe razão para usar o ciclo


Caminhos mínimos de fonte única em grafos
acíclicos dirigidos (gad)

O(V+E)
O(V)

O(1)

Tempo total de execução é O(V+E), que é linear em relação ao tamanho de uma representação de lista de
adjacências do grafo.
Relaxamento
Relaxamento
Caminhos mínimos de fonte única em grafos
acíclicos dirigidos (gad)
fonte
Caminhos mínimos de fonte única em grafos
acíclicos dirigidos (gad)
Algoritmo de Dijkstra

O(n)

O(n) * O(n) = O(n²)

O(m)
O(1)

Podemos concluir que o algoritmo leva tempo O(n²+m) = O(n²) usando um vetor
como fila de prioridade.
Algoritmo de Dijkstra
Algoritmo de Dijkstra
Algoritmo de Dijkstra
Aresta com peso negativo
Variantes
● Problema de caminhos mínimos com um só destino: Encontrar um caminho
mínimo até um determinado vértice de destino t a partir de cada vértice v.
● Problema do caminho mínimo para um par: Encontrar um caminho mínimo de u
a v para vértices u e v dados.
● Problema de caminhos mínimos para todos os pares: Encontrar um caminho
mínimo de u a v para todo par de vértices u e v.
Casos de Uso
● Redes de Computadores
● Tráfego Urbano
● Sistema Rodoviário e Ferroviário
● Google Maps
Considerações Finais
Se o grafo é suficientemente esparso (em particular E = o(V 2 /log V)), podemos melhorar o algoritmo
implementando a fila de prioridades mínimas com um heap de mínimo binário. Portanto, o tempo de execução
total é O((V + E) log V), que é O(E log V) se todos os vértices podem ser alcançados da fonte.

Na verdade, podemos conseguir um tempo de execução O(V log V + E) implementando a fila de prioridades
mínimas com um heap de Fibonacci. O custo amortizado de cada uma das |V| operações EXTRACT-KEY é
O(log V), e cada chamada DECREASE-KEY, cujo número máximo é |E|, demora apenas o tempo
amortizado O(1).
Referência Bibliográfica
● Cormen, T.H., Leiserson, C.E., Rivest, R.L., Stein, C. (2012). Algoritmos: teoria e prática. 3a ed.,
Elsevier: Rio de Janeiro, 944 p., ISBN 9788535236996.

● Material do professor Eduardo Camponogara - Departamento de Automação e Sistemas - Universidade


Federal de Santa Catarina
http://www.dainf.ct.utfpr.edu.br/~kaestner/MatematicaDiscreta/Conteudo/Algoritmos/l14-shortest-
path.pdf

● https://motherboard.vice.com/pt_br/article/z4zaj9/o-simples-e-elegante-algoritmo-que-torna-o-google
-maps-possivel

● http://www.dcc.fc.up.pt/~pribeiro/aulas/daa1415/slides/8_distancias_06122014.pdf

● Ferramenta usada para desenhar grafos: https://visualgo.net/pt/sssp

Anda mungkin juga menyukai