Sie sind auf Seite 1von 16

Algoritmo de Dijkstra - Exemplos

O algoritmo de Prim constrói uma árvore geradora mínima (minimum spanning tree) para o
grafo, que é uma árvore que liga todos os nós no grafo e tem o menor custo total entre
todas as árvores que ligam todos os nós. No entanto, o comprimento de um caminho entre
quaisquer dois nós pode não ser o caminho mais curto entre esses dois nós no gráfico
original. Algoritmos como o Prim são úteis, por exemplo, se quiseres ligar fisicamente os nós
no grafo para fornecer-lhes eletricidade pelo menor custo total.
O algoritmo de Dijkstra constrói uma árvore de caminho mais curto a partir de algum nó de
origem. Uma árvore de caminho mais curto é uma árvore que liga todos os nós do gráfico
ao nó de origem e tem a propriedade de que o comprimento de qualquer caminho do nó de
origem para qualquer outro nó no gráfico é minimizado. Isso é útil, por exemplo, se
quisesses construir uma rede rodoviária que fosse o mais eficiente possível para que todos
pudessem chegar a algum importante ponto de chegada. No entanto, não é garantido que a
árvore de caminho mais curto seja uma árvore de abrangência mínima, e o custo de
construir tal árvore poderia ser muito maior do que o custo de um MST como o Prim.

Algoritmo:
1) Começar por inicializar a distância de todos os nós ao nó origem como sendo infinito
e a distância do nó origem a si próprio como sendo zero.
2) Em cada passo descobrir o nó u não processado à distância mínima (escolher
melhor).
3) Verificar se as arestas do nó u que foi adicionado permitem obter uma nova distância
mínima melhor a um nó v ainda não visitado (relaxar os nós).
4)

1
Exemplo 1
Vamos ver passo a passo para um grafo pequeno. Estamos a descobrir os caminhos
mínimos a partir do vértice s, ou seja, quais os caminhos mínimos de s para qualquer um
dos outros vértices. Dentro dos vértices estão as atuais distâncias mínimas. A cinzento
estão as arestas que deram origem ao menor caminho.

A distância do vértice de origem a ele próprio é 0. Aos outros, é infinitamente grande.

As distâncias do vértice de origem aos seus adjacentes são 5 e 10. (s, t) = 10


(s, y) = 5

Visitamos o que está mais “perto”, à distância 5 e tomamos nota desse valor.
5 fica então visitado.

Agora, a partir dos visitados (s e y) somamos as distâncias para os não visitados e


procuramos a soma menor:
(s, t) = 10
(s, y, t) = 5 + 3 = 8
(s, y, x) = 5 + 9 = 14
(s, y, z) = 5 + 2 = 7
A soma menor é a 7, que corresponde à ligação com z. Visitamos então z.

2
Agora, somamos as distâncias dos visitados aos não visitados e procuramos a soma
menor:
(s, t) = 10 = 10
(s, y, t) = 5 + 3 = 8
(s, y, x) = 5 + 7 = 12
(s, y, z) = 5 + 2 = 7

A soma menor é a 7, que corresponde à ligação com z. Visitamos então z.

(s, t) = 10
(s, y, t) = 5 + 3 = 8
(s, y, x) = 5 + 9 = 14
(s, y, z, x) = 5 + 2 + 6 = 13

A soma menor é 8, para t, logo visitamos t.

3
Mais uma vez, vemos as distâncias somadas a partir dos visitados para os não visitados:
(s, t, x) = 11
(s, y, t, x) = 9
(s, y, z, x) = 13
A soma menor é 9, para x, logo visitamos x, que também era o último por visitar.

Todos visitados? Acabámos!

4
Exemplo 2
Ásia no jogo “Risco”.

O grafo:

Queremos encontrar os caminhos mais curtos de Kamchatka (K) para qualquer um dos
outros pontos, que é esse tipo de resposta que este algoritmo nos dá.
Começando então por visitar K, o primeiro

5
Distâncias de K aos vizinhos:

(K, J) = 17
(K, I) = 12
(K, H) = 8 (menor)
(K, L) = 16

(K, H) é o caminho mais curto (8). Visitamos então H e colocamos lá o valor 8 para nos
facilitar os cálculos que vêm a seguir.

H tem 4 vizinhos não visitados: E, G, I e L.

6
Temos então 4 novos segmentos a partir do H:
(K, H, E) = 8+6 = 14
(K, H, G) = 8+11 = 19
(K, H, I) = 8+2 = 10 (menor)
Mas também temos, a partir do K já visitado:
(K, L) = 16
(K, I) = 12
(K, H, L) = 8+9 = 17
O caminho (K, H, I) é o caminho mais curto (de K a I), com comprimento 10.
Então visitamos I.

I tem dois vizinhos ainda não visitados: G e J.


Novos segmentos:
(K, H, I, G) = 10+3 = 13 (menor)
Mas também, a partir do visitado K:
(K, H, I, J) = 10+18 = 28
(K, J) = 17
(K, L) = 16
O caminho (K, H, I, G) é o mais curto de K a G com comprimento 13. Então visitamos G.

7
O vértice G tem 3 vizinhos não visitados: E, F e J.
(K, H, I, G, E) = 13+15 = 28
(K, H, I, G, F) = 13+4 = 17
(K, H, I, G, J) com comprimento 13+19 = 32
Mas também a partir dos visitados K e H:
(K, H, E) = 14
(K, J) = 17
(K, L) = 16
O caminho (K, H, E) é o mais curto com comprimento 14. Então visitamos E.

E tem os vizinhos não visitados C, B, D e F. Temos os caminhos:


(K, H, E, B) = 14 + 5 = 19
(K, H, E, C) = 14 + 1 = 15
(K, H, E, D) = 14 + 10 = 24
(K, H, E, F) = 14 + 22 = 36
E a partir de K:

8
(K, J) = 17
(K, L) = 16
Descobrimos um caminho mais curto pelo vértice C com comprimento 15.
Visitamos C.

C tem o vizinho não visitado B. Temos o caminho, a partir de C:


(K, H, E, C, B) = 15 + 7 = 22
E a partir de K:
(K, J) = 17
(K, L) = 16
Caminho mais curto é para L. Visitamos L.

L não tem vizinhos. Temos que tentar procurar outros não visitados:

(K, J) = 17

9
(K, I, G, F) = 12 + 3 + 4 = 19
(K, H, E, D) = 8 + 6 + 10 = 24
(K, H, E, C, B) = 15 + 7 = 22
(K, H, G, F) = 8 + 11 + 4 = 23
O caminho mais curto é para J que também não tem vizinhos não visitados.

Temos os caminhos, a partir dos visitados para não visitados:


(K, I, G, F) = 12 + 3 + 4 = 19
(K, H, E, D) = 8 + 6 + 10 = 24
(K, H, E, C, B) = 15 + 7 = 22
(K, H, G, F) = 8 + 11 + 4 = 23
Vamos então ao F.

F tem como vizinho não visitado D.


10
(K, H, I, G, F, D) = 17 + 14 = 31
Mas também temos
(K, H, E, D) = 8 + 6 + 10 = 24
(K, H, E, B) = 8 + 6 + 5 = 19
Visitamos B.

B, que tem dois vizinhos não visitados: A e D.

(K, H, E, B, A) de comprimento 19+20 = 39


(K, H, E, B, D) de comprimento 19+13 = 32
A seguir visitamos o vértice D.

D tem como único vizinho A. A não tem vizinhos não visitados. Acabou!!!

11
12
Exercícios com resolução

13
Resoluções:

14
15
16

Das könnte Ihnen auch gefallen