Beruflich Dokumente
Kultur Dokumente
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.
Visitamos o que está mais “perto”, à distância 5 e tomamos nota desse valor.
5 fica então visitado.
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
(s, t) = 10
(s, y, t) = 5 + 3 = 8
(s, y, x) = 5 + 9 = 14
(s, y, z, x) = 5 + 2 + 6 = 13
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.
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.
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.
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.
8
(K, J) = 17
(K, L) = 16
Descobrimos um caminho mais curto pelo vértice C com comprimento 15.
Visitamos C.
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.
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