Algoritmo de Dijkstra
Existem vários algoritmos para se calcular o caminho mínimo de um vértice a outro em um grafo. Mas, com certeza, o mais famoso e mais utilizado por programadores, é o de Dijkstra.
Após escolher um vértice como raiz e outro como destino final, o algoritmo testa cada uma das arestas do grafo, somando seus pesos. No final, a menor soma é o menor caminho entre a raiz e o destino. O algoritmo pode ser usado sobre grafos orientados (dígrafos), ou não, e admite que todas as arestas possuem pesos não negativos (nulo é possível). Esta restrição é perfeitamente aceitável, por exemplo, no contexto de redes de transportes, onde as arestas representam normalmente distâncias ou tempos médios de percurso; poderão existir, no entanto, aplicações onde as arestas apresentam pesos negativos, nas quais o algoritmo não funcionará corretamente.
![]() |
Esdger Dijkstra, o criador do algortimo O cientista da computação Esdger Wybe Dijkstra (1930-2002) é natural de Roterdã na Holanda, e ficou conhecido mundialmente por suas contribuições na área de algoritmos e programas, linguagens de computação, sistemas operacionais e processamento distribuído. Além de desenvolver o algoritmo de caminho mínimo mais famoso entre os programadores, algumas de suas principais contribuições foram o sistema operacional THE (SO construído em camadas e multitarefa) e a construção de semáforos (variáveis protegidas que tem a função de controlar o acesso a recursos compartilhados em um ambiente multitarefa). |
"Ciência da Computação está tão relacionada aos computadores quanto a Astronomia aos telescópios, Biologia aos microscópios, ou Química aos tubos de ensaio. A Ciência não estuda ferramentas. Ela estuda como nós as utilizamos, e o que descobrimos com elas." Esdger Wybe Dijkstra |
|
Nosso grupo implementou na aplicação "Grafo GDI" um algoritmo baseado no de Dijkstra, onde o caminho mínimo é calculado ignorando a direção das arestas. Enquanto o Algoritmo de Dijkstra calcula o caminho mínimo em grafos orientados ou não, nosso algoritmo calcula o caminho mínimo apenas em grafos não-orientados. A seguir, explicaremos passo-a-passo como funciona o algoritmo de Dijkstra.
Funcionamento do Algoritmo
Tomando como exemplo o grafo mostrado abaixo, começamos definindo qual será o vértice raiz. Neste caso, escolheremos o vértice s. A partir de agora o vértice s pode ser considerado como analisado, sua distância desde o vértice raiz é zero, pois ele próprio é o raiz, e não há anteriores a ele.
![]() |
|
Depois, são analisados os vértices adjacentes, neste caso, u e x. E logo descobrimos que u está a distância 10 da raiz, e que x está a 5 dela.
![]() |
|
O próximo passo é determinar as distâncias para outros vértices, a partir do que está a menor distância do vértice raiz (no caso x).
![]() |
|
Assim, descobrimos 03 (três) arestas partindo de x para outros vértices. Atribuímos à tabela os valores dos mesmos. Perceba que a cada passo que o algoritmo dá, o valor dos vértices desconhecidos muda.
![]() |
|
Seguindo sempre a mesma linha de raciocínio, pegamos agora o próximo vértice que, dentro do grupo dos não-analisados, tem a menor distância do vértice raiz, sendo agora o vértice y.
![]() |
|
Descobrimos assim, uma aresta partindo de y para v, com peso 6, que faz com que a distância de v para a origem diminua de 14 para 13. Há também uma aresta apontando para a origem, mas como seu peso não irá produzir nenhuma mudança na tabela, a desconsideramos.
![]() |
|
Olhando para os vértices que ainda não foram analisados, vemos que o que tem a menor distância para o vértice raiz é u, sendo este o próximo a ser analisado.
![]() |
|
Analisando o vértice u, podemos constatar que há uma aresta apontando para o vértice v de peso 1. Perceba que agora, na tabela, a distância de v para a raiz diminui novamente, assim como seu antecessor.
![]() |
|
Resta agora analisarmos o último vértice, v
![]() |
|
Vemos apenas uma aresta apontando para y, que por não alterar em nada nossa tabela, pode ser desconsiderada.
![]() |
|
Como todos os vértices foram analisados, nossa tabela está pronta, e nela está descrito com precisão o caminho mínimo para qualquer vértice do grafo, a partir do vértice raiz s.