A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Algoritmo de Dijkstra.

Apresentações semelhantes


Apresentação em tema: "Algoritmo de Dijkstra."— Transcrição da apresentação:

1 Algoritmo de Dijkstra

2 Motivação Encontrar o caminho mínimo, de única origem, entre essa origem e os demais vértices, num grafo dirigido ou não dirigido com arestas de peso não negativo.

3 Exemplo alguém precisa se deslocar de uma cidade para outra. Para isso, ela dispõe de várias estradas, que passam por diversas cidades. Qual delas oferece uma trajetória de menor caminho?

4 Restrições Todas as arestas do grafo devem ter custos não negativos;
O algoritmo que serve para resolver o mesmo problema em um grafo com pesos negativos é o algoritmo de Bellman-Ford.

5 Exemplo Uma distribuidora de jornais está se instalando na cidade 0(zero) e gostaria de saber qual a menor distância até cada uma das cidades próximas (1,2,3,4): 1 1 3 10 9 2 3 6 4 2 4 5 8

6 Pseudocódigo Dijkstra
Fonte:

7 Fila de prioridade Q Fila de prioridade é uma estrutura de dado que mantém uma coleção de elementos, cada um com uma prioridade associada; Utilizaremos uma fila de prioridade Q que inicialmente conterá todos os vértices de G; A prioridade de um vértice v é dada por dist[v],então para o nosso grafo: 1 1 3 Q: (0,0) 10 (1, ∞) 9 2 3 6 4 (2, ∞), (3, ∞), 2 4 5 (4, ∞), 8

8 Voltando ao exemplo 1 3 2 4 Inicialização: ∞ ∞
dist[0] = 0; dist[1:4] = ∞ ; Q = { (0,0), (1, ∞), (2, ∞), (3, ∞), (4, ∞) } 1 1 3 10 9 2 3 6 4 2 4 5 8

9 Voltando ao exemplo 1 3 2 4 Laço principal: ∞ ∞
Q = { 0, 1, 2, 3, 4 } 1 1 3 10 9 2 3 6 4 2 4 5 8

10 Voltando ao exemplo 1 3 2 4 Laço principal: ∞ ∞
u = 0 ; v = 1; Q = { 1, 2, 3, 4 } 1 1 3 10 9 2 3 6 4 2 4 5 8

11 Voltando ao exemplo 1 3 2 4 Laço principal: ∞ ∞
< ∞ ? Sim! u = 0 ; v = 1; Q = { 1, 2, 3, 4 } 1 1 3 10 9 2 3 6 4 2 4 5 8

12 Voltando ao exemplo 1 3 2 4 Laço principal: ∞
10 Q = { 1, 2, 3, 4 } 1 1 3 10 9 2 3 6 4 2 4 5 8

13 Voltando ao exemplo 1 3 2 4 Laço principal: ∞
10 Q = { 1, 2, 3, 4 } , se mantem no lugar 1 1 3 10 9 2 3 6 4 2 4 5 8

14 Voltando ao exemplo 1 3 2 4 Laço principal: ∞
10 u = 0 ; v = 2; Q = { 1, 2, 3, 4 } 1 1 3 10 9 2 3 6 4 2 4 5 8 0 + 5 < ∞ ? Sim!

15 Voltando ao exemplo 1 3 2 4 Laço principal: ∞
10 u = 0 ; v = 2; Q = { 1, 2, 3, 4 } 1 1 3 10 9 2 3 6 4 2 4 5 8 5

16 Voltando ao exemplo 1 3 2 4 Laço principal: ∞
10 u = 0 ; Q = { 2, 1, 3, 4 } 1 1 3 10 9 2 3 6 4 2 4 5 0 não tem mais vizinhos! 8 5

17 Funcionamento Enquanto Q.size() != 0{ u = extrai_min( Q ); Para cada vizinho “v “ de “u”{ Se dist[u] + length(u, v) < dist[v] { dist[v] ← dist[u] + length(u, v) Q.decrease_priority(v, alt) } A técnica de relaxamento para um arco (u, v) consiste em testar se é possível melhorar o caminho mais curto para v passando por u, e em caso afirmativo, atualizar dist[v].

18 Voltando ao exemplo 1 3 2 4 ∞ 5 ∞ u = extrai_min( Q = {2, 1, 3, 4} );
10 Enquanto Q.size() != 0{ u = extrai_min( Q = {2, 1, 3, 4} ); Para cada vizinho “v “ de “u”{ Se dist[u] + length(u, v) < dist[v] { dist[v] ← dist[u] + length(u, v) Q.decrease_priority(v, alt) } 1 1 3 10 9 2 3 6 4 2 4 5 8 5

19 Voltando ao exemplo 1 3 2 4 5 u = extrai_min( Q = {1, 4, 3} );
7 14 Enquanto Q.size() != 0{ u = extrai_min( Q = {1, 4, 3} ); Para cada vizinho “v “ de “u”{ Se dist[u] + length(u, v) < dist[v] { dist[v] ← dist[u] + length(u, v) Q.decrease_priority(v, alt) } 1 1 3 10 9 2 3 6 4 2 4 5 8 5 13

20 Voltando ao exemplo 1 3 2 4 5 u = extrai_min( Q = {3, 4} );
7 8 Enquanto Q.size() != 0{ u = extrai_min( Q = {3, 4} ); Para cada vizinho “v “ de “u”{ Se dist[u] + length(u, v) < dist[v] { dist[v] ← dist[u] + length(u, v) Q.decrease_priority(v, alt) } 1 1 3 10 9 2 3 6 4 2 4 5 8 5 13

21 Voltando ao exemplo 1 3 2 4 5 u = extrai_min( Q = {4} );
7 8 Enquanto Q.size() != 0{ u = extrai_min( Q = {4} ); Para cada vizinho “v “ de “u”{ Se dist[u] + length(u, v) < dist[v] { dist[v] ← dist[u] + length(u, v) Q.decrease_priority(v, alt) } 1 1 3 10 9 2 3 6 4 2 4 5 8 5 12

22 Voltando ao exemplo 1 3 2 4 5 u = extrai_min( Q = {} );
7 8 Enquanto Q.size() != 0{ u = extrai_min( Q = {} ); Para cada vizinho “v “ de “u”{ Se dist[u] + length(u, v) < dist[v] { dist[v] ← dist[u] + length(u, v) Q.decrease_priority(v, alt) } 1 1 3 10 9 2 3 6 4 2 4 5 8 5 12

23 Voltando ao exemplo 7 8 -Agora sabemos os trajetos de custo mínimo partindo de 0 até qualquer outro vértice! d[0] = 0  distancia de 0 até 0 d[1] = 7  distância de 0 até 1 d[2] = 5  distância de 0 até 2 d[3] = 8  distância de 0 até 3 d[4] = 12  distância de 0 até 4 1 1 3 10 9 2 3 6 4 2 4 5 8 5 12

24 Complexidade Para qualquer implementação do conjunto Q, o tempo de execução é: O(|E|.Tdk + |V|.Tem) Onde Tdk = complexidade das operações decrease_key e Tem = complexidade das operações extract_minimum

25 Complexidade Caso Q seja um simples vetor, temos: O(m + n²) = O(n²)
Caso Q seja um min heap, temos: O((m+n)log n) Caso Q seja uma fibonacci heap, temos: O( m + n log n ) Lembre-se que o algoritmo de Floyd warshal descobre o caminho mínimo em O(|V|³)

26 Dijkstra em c++

27 Exemplos de problemas que utilizam Dijkstra:
URI UVA - 929 UVA UVA

28 FIM


Carregar ppt "Algoritmo de Dijkstra."

Apresentações semelhantes


Anúncios Google