algoritmos em grafos: caminho m...
TRANSCRIPT
Caminho Mínimo
Algoritmos em Grafos: Caminho Mínimo
Letícia Rodrigues Bueno
UFABC
Caminho Mínimo
Problema 2: Menor caminho entre duas cidades
• Dado um mapa de cidades, contendo as distâncias entrecidades, qual o menor caminho entre quaisquer cidades Ae B?
Caminho Mínimo
Problema 2: Menor caminho entre duas cidades
• Dado um mapa de cidades, contendo as distâncias entrecidades, qual o menor caminho entre quaisquer cidades Ae 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 CaminhoMínimo.
Caminho Mínimo
Abordagem
• Problema do caminho mínimo é semelhante a problemado número de Erdõs;
Caminho Mínimo
Abordagem
• Problema do caminho mínimo é semelhante a problemado número de Erdõs;
• Podemos utilizar uma idéia semelhante ao BFS ;• Levar em consideração:
• O problema tem subestrutura ótima.
Caminho Mínimo
Caminho mínimo de fonte única: algoritmo de Dijkstra
s
t x
zy
10
1
5
2
2 3
9
4 6
7
Caminho Mínimo
Caminho mínimo de fonte única: algoritmo de Dijkstra
0
∞
s
t x
zy
∞
∞ ∞
10
1
5
2
2 3
9
4 6
7
Caminho Mínimo
Caminho mínimo de fonte única: algoritmo de Dijkstra
0
∞
s
t x
zy
∞
∞ ∞
10
1
5
2
2 3
9
4 6
7
Caminho Mínimo
Caminho mínimo de fonte única: algoritmo de Dijkstra
0
s
t x
zy
∞
∞
10
1
5
2
2 3
9
4 6
7
5
10
Caminho Mínimo
Caminho mínimo de fonte única: algoritmo de Dijkstra
0
s
t x
zy
10
1
5
2
2 3
9
4 6
7
5
8
7
14
Caminho Mínimo
Caminho mínimo de fonte única: algoritmo de Dijkstra
0
s
t x
zy
10
1
5
2
2 3
9
4 6
7
5
8
7
13
Caminho Mínimo
Caminho mínimo de fonte única: algoritmo de Dijkstra
0
s
t x
zy
10
1
5
2
2 3
9
4 6
7
5
8
7
9
Caminho Mínimo
Caminho mínimo de fonte única: algoritmo de Dijkstra
0
s
t x
zy
10
1
5
2
2 3
9
4 6
7
5
8
7
9
Caminho Mínimo
Caminho mínimo de fonte única: algoritmo de Dijkstra
1 relaxa(u, v):2 se v.d > u.d + p(u, v) então3 v.d = u.d + p(u, v)4 v.p = u
5
u v2 7
5
u v2 9
Relaxa(u,v)
(a)
5
u v2 6
5
u v2 6
Relaxa(u,v)
(b)
Caminho Mínimo
Caminho mínimo de fonte única: algoritmo de Dijkstra
1 dijkstra(G, s):2 para u em V(G) faça3 u.d = ∞4 u.p = None5 s.d = 06 A = Heap(V(G)) \\ com base em d7 S = [ ]8 enquanto tamanho(A) > 1 faça9 u = retira_min(A)
10 S = S + u11 para v em adj(u) faça12 relaxa(u, v)13 refaz_heap(A)
Caminho Mínimo
Caminho mínimo de fonte única: algoritmo de Dijkstra
1 dijkstra(G, s):2 para u em V(G) faça3 u.d = ∞4 u.p = None5 s.d = 06 A = Heap(V(G)) \\ com base em d7 S = [ ]8 enquanto tamanho(A) > 1 faça9 u = retira_min(A)
10 S = S + u11 para v em adj(u) faça12 relaxa(u, v)13 refaz_heap(A)
Análise da complexidade:
Caminho Mínimo
Caminho mínimo de fonte única: algoritmo de Dijkstra
1 dijkstra(G, s):2 para u em V(G) faça3 u.d = ∞4 u.p = None5 s.d = 06 A = Heap(V(G)) \\ com base em d7 S = [ ]8 enquanto tamanho(A) > 1 faça9 u = retira_min(A)
10 S = S + u11 para v em adj(u) faça12 relaxa(u, v)13 refaz_heap(A)
Análise da complexidade:
• Construção do heap(linha 6): O(n)
Caminho Mínimo
Caminho mínimo de fonte única: algoritmo de Dijkstra
1 dijkstra(G, s):2 para u em V(G) faça3 u.d = ∞4 u.p = None5 s.d = 06 A = Heap(V(G)) \\ com base em d7 S = [ ]8 enquanto tamanho(A) > 1 faça9 u = retira_min(A)
10 S = S + u11 para v em adj(u) faça12 relaxa(u, v)13 refaz_heap(A)
Análise da complexidade:
• Construção do heap(linha 6): O(n)
• retira_min (linha 9)tem complexidade(log n) e é executadon vezes: O(n log n)
Caminho Mínimo
Caminho mínimo de fonte única: algoritmo de Dijkstra
1 dijkstra(G, s):2 para u em V(G) faça3 u.d = ∞4 u.p = None5 s.d = 06 A = Heap(V(G)) \\ com base em d7 S = [ ]8 enquanto tamanho(A) > 1 faça9 u = retira_min(A)
10 S = S + u11 para v em adj(u) faça12 relaxa(u, v)13 refaz_heap(A)
Análise da complexidade:
• Construção do heap(linha 6): O(n)
• retira_min (linha 9)tem complexidade(log n) e é executadon vezes: O(n log n)
• refaz_heap (linha 13)tem complexidade(log n) e é executadom vezes: O(m log n)
Caminho Mínimo
Caminho mínimo de fonte única: algoritmo de Dijkstra
1 dijkstra(G, s):2 para u em V(G) faça3 u.d = ∞4 u.p = None5 s.d = 06 A = Heap(V(G)) \\ com base em d7 S = [ ]8 enquanto tamanho(A) > 1 faça9 u = retira_min(A)
10 S = S + u11 para v em adj(u) faça12 relaxa(u, v)13 refaz_heap(A)
Análise da complexidade:
• Construção do heap(linha 6): O(n)
• retira_min (linha 9)tem complexidade(log n) e é executadon vezes: O(n log n)
• refaz_heap (linha 13)tem complexidade(log n) e é executadom vezes: O(m log n)
• Complexidade total:O((n + m) log n)
Caminho Mínimo
Problemas do Caminho Mínimo
• Caminho mínimo de fonte única;
• Caminho mínimo de destino único;
• Caminho mínimo entre quaisquer vértices u e v ;• Caminho mínimo de todos os vértices para todos os
vértices:• Algoritmo de Floyd-Warshall O(n3).
Caminho Mínimo
Limitações do algoritmo de Dijkstra
• Não funciona para grafos com ciclos com pesos negativos;
Caminho Mínimo
Limitações do algoritmo de Dijkstra
• Não funciona para grafos com ciclos com pesos negativos;
• Alternativa: Algoritmo de Bellman-Ford de complexidadeO(n · m).
Caminho Mínimo
Exercícios
2. Faça a análise da complexidade (tempo e espaço) doalgoritmo de Dijkstra quando a representação do grafo épor matriz de adjacências.
Caminho Mínimo
Exercícios
2. Faça a análise da complexidade (tempo e espaço) doalgoritmo de Dijkstra quando a representação do grafo épor matriz de adjacências.
3. Faça a análise da complexidade do algoritmo de Dijkstraquando a fila de prioridades é uma lista (ordenada enão-ordenada).
Caminho Mínimo
Exercícios
2. Faça a análise da complexidade (tempo e espaço) doalgoritmo de Dijkstra quando a representação do grafo épor matriz de adjacências.
3. Faça a análise da complexidade do algoritmo de Dijkstraquando a fila de prioridades é uma lista (ordenada enão-ordenada).
4. Dê exemplo de um grafo com pesos negativos em que oalgoritmo de Dijkstra não retorna a resposta correta.
Caminho Mínimo
Bibliografia Utilizada
CORMEN, T. H.; LEISERSON, C. E.; RIVEST, R. L. e STEIN, C.Introduction to Algorithms, 3a edição, MIT Press, 2009.