algoritmo de dijkstra. motivação encontrar o caminho mínimo, de única origem, entre essa origem...

28
Algoritmo de Dijkstra

Upload: ester-lagos-borja

Post on 07-Apr-2016

219 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Algoritmo de Dijkstra. 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

Algoritmo de Dijkstra

Page 2: Algoritmo de Dijkstra. 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

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.

Page 3: Algoritmo de Dijkstra. 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

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?

Page 4: Algoritmo de Dijkstra. 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

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.

Page 5: Algoritmo de Dijkstra. 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

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):

0

1

2

3

4

10

1

5

9 64

8

2 3

Page 6: Algoritmo de Dijkstra. 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

Pseudocódigo Dijkstra

Fonte: http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

Page 7: Algoritmo de Dijkstra. 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

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:

0

1

2

3

4

10

1

5

9 64

8

2 3

(0,0)

(1, ∞)

(2, ∞),

(3, ∞),

(4, ∞),

Q:

Page 8: Algoritmo de Dijkstra. 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

Voltando ao exemplo

Inicialização:

-----------------------------------------• dist[0] = 0;• dist[1:4] = ∞ ;• Q = { (0,0), (1, ∞), (2, ∞), (3, ∞), (4,

∞) }

0

1

2

3

4

10

1

5

9 64

8

2 3

0

∞∞

Page 9: Algoritmo de Dijkstra. 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

Voltando ao exemplo

Laço principal:

-----------------------------------------• Q = { 0, 1, 2, 3, 4 }

0

1

2

3

4

10

1

5

9 64

8

2 3

0

∞∞

Page 10: Algoritmo de Dijkstra. 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

Voltando ao exemplo

Laço principal:

-----------------------------------------• u = 0 ; v = 1;• Q = { 1, 2, 3, 4 }

0

1

2

3

4

10

1

5

9 64

8

2 3

0

∞∞

Page 11: Algoritmo de Dijkstra. 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

Voltando ao exemplo

Laço principal:

-----------------------------------------• u = 0 ; v = 1;• Q = { 1, 2, 3, 4 }

0

1

2

3

4

10

1

5

9 64

8

2 3

0

∞∞

0 + 10 < ∞ ? Sim!

Page 12: Algoritmo de Dijkstra. 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

Voltando ao exemplo

Laço principal:

-----------------------------------------• Q = { 1, 2, 3, 4 }

0

1

2

3

4

10

1

5

9 64

8

2 3

0

10

∞∞

Page 13: Algoritmo de Dijkstra. 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

Voltando ao exemplo

Laço principal:

-----------------------------------------• Q = { 1, 2, 3, 4 } , se mantem no lugar

0

1

2

3

4

10

1

5

9 64

8

2 3

0

10

∞∞

Page 14: Algoritmo de Dijkstra. 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

Voltando ao exemplo

Laço principal:

-----------------------------------------• u = 0 ; v = 2;• Q = { 1, 2, 3, 4 }

0

1

2

3

4

10

1

5

9 64

8

2 3

0

10

∞∞

0 + 5 < ∞ ? Sim!

Page 15: Algoritmo de Dijkstra. 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

Voltando ao exemplo

Laço principal:

-----------------------------------------• u = 0 ; v = 2;• Q = { 1, 2, 3, 4 }

0

1

2

3

4

10

1

5

9 64

8

2 3

0

10

∞5

Page 16: Algoritmo de Dijkstra. 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

Voltando ao exemplo

Laço principal:

-----------------------------------------• u = 0 ; • Q = { 2, 1, 3, 4 }

0

1

2

3

4

10

1

5

9 64

8

2 3

0

10

∞5

0 não tem mais vizinhos!

Page 17: Algoritmo de Dijkstra. 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

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].

Page 18: Algoritmo de Dijkstra. 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

Voltando ao exemplo

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)

} }

}

0

1

2

3

4

10

1

5

9 64

8

2 3

0

10

∞5

Page 19: Algoritmo de Dijkstra. 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

Voltando ao exemplo

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)

} }

}

0

1

2

3

4

10

1

5

9 64

8

2 3

0

7

135

14

Page 20: Algoritmo de Dijkstra. 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

Voltando ao exemplo

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)

} }

}

0

1

2

3

4

10

1

5

9 64

8

2 3

0

7

135

8

Page 21: Algoritmo de Dijkstra. 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

Voltando ao exemplo

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)

} }

}

0

1

2

3

4

10

1

5

9 64

8

2 3

0

7

125

8

Page 22: Algoritmo de Dijkstra. 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

Voltando ao exemplo

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)

} }

}

0

1

2

3

4

10

1

5

9 64

8

2 3

0

7

125

8

Page 23: Algoritmo de Dijkstra. 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

Voltando ao exemplo

-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

0

1

2

3

4

10

1

5

9 64

8

2 3

0

7

125

8

Page 24: Algoritmo de Dijkstra. 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

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

Page 25: Algoritmo de Dijkstra. 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

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|³)

Page 26: Algoritmo de Dijkstra. 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

Dijkstra em c++

Page 27: Algoritmo de Dijkstra. 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

Exemplos de problemas que utilizam Dijkstra:

• URI - 1148– https://www.urionlinejudge.com.br/judge/pt/problems/view/1148

• UVA - 929– http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=11&page=show_problem&problem=870

• UVA - 10806– http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=

show_problem&problem=1747

• UVA - 11813– http://uva.onlinejudge.org/index.php?

option=com_onlinejudge&Itemid=8&page=show_problem&problem=2913

Page 28: Algoritmo de Dijkstra. 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

FIM