Você está na página 1de 6

ALGORITMO DE DIJKSTRA

por
Bruno Miguel Pacheco Saraiva de Carvalho
Departamento de Engenharia Informtica
Universidade de Coimbra
3030 Coimbra, Portugal
brunomig@student.dei.uc.pt


Resumo Descreve-se o funcionamento do algoritmo de Dijkstra atravs do
clculo do caminho mais curto entre duas cidades e do recurso aos grafos
para a sua representao. Este algoritmo resolve o problema de qualquer
clculo do caminho mnimo num grafo ponderado apenas com pesos
positivos.

Palavras chave caminho mais curto, algoritmo de Dijkstra, grafo.


1 INTRODUO

Das mais diversas utilizaes dos grafos (anlise de circuitos, anlise e planeamento
de projectos, gentica, lingustica, cincias sociais, robtica...), uma delas a optimizao
de percursos. Assim, uma rede de estradas que liga diversas cidades pode ser representada
atravs de um grafo. Atravs da conjugao do uso de um grafo e do Algoritmo de Dijkstra
possvel calcular o caminho mais curto para realizar determinado percurso. Deste modo,
pretende-se com este artigo descrever o funcionamento do referido algoritmo, permitindo
mesmo a sua implementao a nvel informtico, fazendo notar algumas vantagens e
limitaes deste algoritmo quando comparado com algoritmos semelhantes. feita a
descrio passo a passo, atravs do uso de um exemplo.


2 EXECUO DO ALGORITMO DE DIJKSTRA

Um grafo G um tuplo em que G = (V,A), onde V um conjunto no vazio de
vrtices e A um conjunto de pares de vrtices denominados de arcos e que representam
uma ligao entre dois vrtices, arcos esses que podem ter um determinado peso (grafo
ponderado), que ser o custo necessrio para percorrer o arco, pelo que uma rede de
estradas que liga diversas cidades pode ser representada atravs de um grafo ponderado
com pesos positivos. O grafo seguinte representa o conjunto de cidades V={A,B,C,D,E}
com as respectivas estradas e distncias que as ligam:










Pretende-se calcular, de entre os caminhos possveis, aquele que o caminho mais
curto entre a cidade A e as restantes cidades. Para resolver este problema usou-se o
Algoritmo de Dijkstra. O Algoritmo de Dijkstra (E.W. Dijkstra) um dos algoritmos que
calcula o caminho de custo mnimo entre vrtices de um grafo. Escolhido o vrtice A como
raiz da busca (cidade origem), este algoritmo calcula a distncia mnima deste vrtice para
todos os demais vrtices do grafo, ou seja, as restantes cidades.
Este algoritmo parte de uma estimativa inicial para a distncia mnima, que
considerada infinita (), e vai sucessivamente ajustando esta distncia. Ele considera que
uma cidade estar fechada quando j tiver sido obtido um caminho de distncia mnima
da cidade tomada como origem da busca at ela. Este procedimento pode ser armazenado
na seguinte tabela que ir sendo alterada medida que vo sendo percorridos todos os
caminhos possveis:
A

C

D

B

E

10

50

5

100

30

20

50

10






Inicialmente, todos os vrtices tm uma distncia infinita, excepto a cidade de
origem (A) que tem, logicamente, distncia zero. Posteriormente, seleccionada a cidade
que tem uma distncia menor em relao a todas as outras e que se encontra aberta que ,
no caso inicial, a cidade A. A cidade seleccionada fechada e so recalculadas, a partir
de A, todas as distncias s cidades ainda abertas, somando distncia da cidade
seleccionada as distncias dos arcos respectivos. Nos casos em que as novas distncias
obtidas so inferiores s que se encontram armazenadas nas tabelas, procede-se
substituio das mesmas pelas novas distncias e alterada tambm a cidade precedente.
Aps o primeiro passo, a tabela seria a seguinte:




De forma anloga, o segundo passo ser seleccionar a cidade ainda aberta com a
menor distncia na tabela (a cidade E com distncia 10), fech-la e, a partir de E,
recalcular as distncias, alterando aquelas que sejam menores que as da tabela (a distncia
de D alterada para 20 com precedente E), que ficaria da seguinte forma:


Cidades A B C D E
Distncia 0
Precedente - - - - -
Fechado N N N N N
Cidades A B C D E
Distncia 0 50 30 100 10
Precedente A A A A A
Fechado S N N N N
Cidades A B C D E
Distncia 0 50 30 20 10
Precedente A A A E A
Fechado S N N N S
50

A

C

D

B

E

10

50

5

100

30

20

10

A

C

D

B

E

10

50

5

100

30

20

50

10

Repete-se o algoritmo at que todas as cidades tenham sido fechadas. As tabelas
aps as sucessivas operaes so as seguintes:



- D fechada;
- Distncia e Precedente de B so alterados.







- C fechada;
- Distncia e Precedente de B so alterados.



- B fechada.

Quando todas as cidades tiverem sido fechadas, os valores obtidos so a distncia
mnima dos caminhos que partem da cidade A para as restantes. O caminho percorrido
nesse trajecto obtido a partir dos valores colocados no campo Precedente. Por exemplo,
considere-se o caminho que vai de A at B, cuja distncia mnima 35. A cidade precedente
Cidades A B C D E
Distncia 0 40 30 20 10
Precedente A D A E A
Fechado S N N S S
Cidades A B C D E
Distncia 0 35 30 20 10
Precedente A C A E A
Fechado S S S S S
Cidades A B C D E
Distncia 0 35 30 20 10
Precedente A C A E A
Fechado S N S S S
A

C

D

B

E

10

50

5

100

30

20

50

10

A

C

D

B

E

10

50

5

100

30

20

50

10

A

C

D

B

E

10

50

5

100

30

20

50

10

de B C. Sendo assim, o caminho A ? ?? ? C ? B. Por sua vez, o precedente de C A.
Portanto, o caminho final A ? C ? B, com uma distncia mnima de 35.
muito importante referir que o Algoritmo de Dijkstra s pode ser utilizado em
grafos ponderados e unicamente com pesos positivos e permite calcular as distncias entre
uma cidade especfica e todas as outras, ao contrrio do Algoritmo de Floyd que calcula as
distncias entre todas as cidades.
De forma computacional, o Algoritmo de Dijkstra pode ser traduzido da seguinte
forma:
Seja G(V,A) um grafo orientado e a um vrtice de G:
1. Atribui-se valor zero estimativa do custo mnimo do vrtice a (a raiz da busca) e
infinito s demais estimativas;
2. Atribui-se um valor qualquer aos precedentes (o precedente de um vrtice t o
vrtice que precede t no caminho de custo mnimo de a para t);
3. Enquanto houver vrtice aberto:
o seja k um vrtice ainda aberto cuja estimativa seja a menor dentre todos os
vrtices abertos;
o fecha-se o vrtice k
o Para todo vrtice j ainda aberto que seja sucessor de k faz-se:
soma-se a estimativa do vrtice k com o custo do arco que une k a j;
caso esta soma seja melhor que a estimativa anterior para o vrtice j,
substitui-se e anota-se k como precedente de j.
A implementao computacional deste algoritmo tem uma complexidade O(n),
enquanto, por exemplo, o Algoritmo de Floyd tem uma complexidade superior de O(n), o
que uma grande desvantagem quando o nmero de vrtices e arcos (ou sejam, cidades e
estradas) vai aumentando, portanto, o computador levar menos tempo a realizar os
clculos necessrios se for usado o Algoritmo de Dijkstra.
Como os grafos no existem como estrutura de dados pr-definida nas linguagens
de programao, a sua implementao pode ser feita atravs de uma matriz de adjacncia
ou de uma lista de adjacncia:


A B C D E
A 50 30 100 10
B 50 5
C 30 5 50
D 100 50 10
E 10 10
Matriz de adjacncia Lista de adjacncia


3 CONCLUSES

Pretendeu-se que este artigo explicasse, de forma sucinta, objectiva e simples, o
funcionamento do Algoritmo de Dijkstra com a utilizao dos grafos ponderados de pesos
positivos. Optou-se por uma descrio sequencial dos passos a seguir na execuo do
referido algoritmo, tendo antes sido definidos alguns conceitos necessrios a uma correcta
compreenso do mesmo. Apesar de se limitar a grafos com pesos positivos e calcular
apenas a distncia entre uma cidade e todas as outras, este algoritmo bastante mais rpido
na sua execuo que outros algoritmos existentes, pelo que o seu uso adequado em grande
parte das situaes de clculo do caminho mais curto.


REFERNCIAS

1. Acetatos da cadeira de Comunicao e Profisso, 2002/2003.
2. Acetatos da cadeira de Programao e Algoritmos 3, 2001/2002.
3. Mark Allen Weiss Data Structures & Problem Solving Using JAVA, Addison-
Wesley Pub. Co., 1998.
4. David M. Arnow and Gerald Weiss JAVA - An Object Oriented Approach,
Addison-Wesley Pub. Co., 1998.
A

B
C

D

E

E 10

B 50

C 30

D 100

A 50 C 5
A 30

B 5

D 50

A 100

C 50

E 10

A 10

D 10