Você está na página 1de 20

Dijkstra

Rodrigo Paes
rodrigo@ic.ufal.br
Edsger Wybe Dijkstra (Roterd, 11 de maio de 1930
Nuenen, 6 de agosto de 2002;
foi um cientista da computao holands conhecido por
suas contribuies nas reas de desenvolvimento de
algoritmos e programas, de linguagens de
programao
recebeu o Prmio Turing de 1972

A pronncia aproximada em portugus para Edsger


Dijkstra tsrrar dikstra
Problema
Qual o menor caminho a partir de um n s para qualquer outro n?

Ex: s=2

3 3
1
2 7
2 5
6 0
6 1

5
Problema
A partir da origem, verifica os vizinhos para decidir para onde ir.


3 3
1
2 0 7
2 5
6
0
6 1

5

Problema
O menor caminho at 1, antes era infinito. Logo, 2 passa a ser o novo menor
caminho.
Agendamos 1 para ser explorado, mas agendamos priorizando sempre o
menor caminho

2 3 3 FILA DE PRIORIDADE
1
2 0 7
5 dist 2
2
6
0 n 1
6 1

5

Problema
7 < ? Sim, logo 7 passa a ser o novo menor caminho para 3.
Agendamos 3, mas ele vai ser colocado depois de 2, pq a distncia da
origem maior

7
2 3 3 FILA DE PRIORIDADE
1
2 0 7
5 dist 2 7
2
6
0 n 1 3
6 1

5

Problema
6 < ? Sim, logo 6 passa a ser o novo menor caminho para 0.
Agendamos 0, mas perceba que ele vir antes do agendamento de 3

7
2 3 3 FILA DE PRIORIDADE
1
2 0 7
5 dist 2 6 7
2
6 6
0 n 1 0 3
6 1

5

Problema
Agora, faremos uma escolha gulosa, iremos expandir a resta de menor
distncia: n 1
Uma vez feita a escolha, marcamos o n como visitado (evitando loops)

7
2 3 3 FILA DE PRIORIDADE
1
2 0 7
5 dist 6 7
2
6 6
0 n 0 3
6 1

5 current_node: 1

Problema
2+3 < 7 ? Sim, logo descobrimos um caminho melhor para o n 3
Agenda a vista de 3, com prioridade 5 (vai pra frente da fila)

5
2 3 3 FILA DE PRIORIDADE
1
2 0 7
5 dist 5 6 7
2
6 6
0 n 3 0 3
6 1

5 current_node: 1

Problema
2+6 < ? Sim.
Agenda a vista de 3, com prioridade 5 (vai pra frente da fila)

5
2 3 3 FILA DE PRIORIDADE
1
2 0 7
5 dist 5 6 7 8
2
6 6
0 n 3 0 3 5
6 1

5 current_node: 1
8
Problema
Escolha gulosa de acordo com a fila, iremos para o n 3!

5
2 3 3 FILA DE PRIORIDADE
1
2 0 7
5 dist 5 6 7 8
2
6 6
0 n 3 0 3 5
6 1

5 current_node: 1
8
Problema
10 < 8? No, ento no faz nada.

5
2 3 3 FILA DE PRIORIDADE
1
2 0 7
5 dist 6 7 8
2
6 6
0 n 0 3 5
6 1

5 current_node: 3
8
Problema
Prximo da fila: 0

5
2 3 3 FILA DE PRIORIDADE
1
2 0 7
5 dist 6 7 8
2
6 6
0 n 0 3 5
6 1

5 current_node: 3
8
Problema
6+1 < 8, sim! Atualiza e agenda!

5
2 3 3 FILA DE PRIORIDADE
1
2 0 7
5 dist 7 8
2
6 6
0 n 3 5
6 1

5 current_node: 0
8
Problema
6+1 < 8, sim! Atualiza e agenda!

5
2 3 3 FILA DE PRIORIDADE
1
2 0 7
5 dist 7 7 8
2
6 6
0
6 1 n 3 5 5

5 current_node: 0
7
Problema
Prximo: 3, porm 3 j foi visitado (est marcado de cinza)
Logo ignora

5
2 3 3 FILA DE PRIORIDADE
1
2 0 7
5 dist 7 7 8
2
6 6
0
6 1 n 3 5 5

5 current_node: 0
7
Problema
Prximo: 5
Sem arestas pega o prximo da fila

5
2 3 3 FILA DE PRIORIDADE
1
2 0 7
5 dist 8
2
6 6
0
6 1 n 5

5 current_node: 5
7
Problema
O prximo o prprio 5, logo, j foi visitado.
Ignora

5
2 3 3 FILA DE PRIORIDADE
1
2 0 7
5 dist
2
6 6
0
6 1 n

5 current_node: 5
7
Problema
Fila vazia. Acabou!
Agora sabemos o menor custo do n 2 para qualquer outro.

5
2 3 3 FILA DE PRIORIDADE
1
2 0 7
5 dist
2
6 6
0
6 1 n

5 current_node: 5
7
Meu cdigo em
C++ (muitas
variaes so
possveis)

typedef pair<int, int> ii;


typedef vector<ii> vii;
typedef vector<int> vi;

Você também pode gostar