O documento descreve algoritmos para encontrar caminhos de menor custo em grafos, como o algoritmo de Dijkstra e o algoritmo de Bellman-Ford. O documento inclui exemplos passo a passo da aplicação dos algoritmos em um grafo exemplo e lista as etapas de implementação dos algoritmos em C++.
Graph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-Ford
1. Teoria dos Grafos - Exerc´ıcios do Cap´ıtulo 3
Algoritmo de Dijkstra e Bellmann-Ford
Michel Alves dos Santos ∗
Abril de 2011
∗Bacharelando em Ciˆencia da Computa¸c˜ao, Universidade Federal do Estado de Alagoas(UFAL). E-mails: mi-
chel.mas@gmail.com, michelalavessantos@hotmail.com. Disciplina: Teoria dos Grafos. Docente Respons´avel: Leo-
nardo Viana Pereira.
1
2. Conte´udo
Lista de Figuras 2
Lista de Tabelas 2
1 Algoritmo de Dijkstra. 3
2 Algoritmo de Bellmann-Ford. 4
3 Algoritmos de Dijkstra e Bellmann-Ford. 4
4 Sa´ıda Produzida Pela Aplica¸c˜ao. 4
Lista de Figuras
1 Grafo utilizado para averiguar a efetividade da implementa¸c˜ao do Algoritmo de
Dijkstra. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 Arborescˆencia de distˆancias obtida atrav´es da aplica¸c˜ao do Algoritmo de Dijkstra.
Esta arborescˆencia pode ser constru´ıda com base nos valores armazenados na tabela
de distˆancias. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3 Grafo utilizado para averiguar a efetividade da implementa¸c˜ao do Algoritmo de
Bellmann-Ford. Ao final do processo obtivemos a mesma arborescˆencia de distˆancias. 4
Lista de Tabelas
1 Constru¸c˜ao da tabela de distˆancias entre v´ertices. . . . . . . . . . . . . . . . . . . . 3
2 Depois da avalia¸c˜ao de todos os v´ertices finalizamos a constru¸c˜ao da tabela com
todas as distˆancias a partir da origem. Com base nesta tabela tamb´em podemos
construir a arborescˆencia de distˆancias. . . . . . . . . . . . . . . . . . . . . . . . . . 4
2
3. 1 Algoritmo de Dijkstra.
Para verifica¸c˜ao dos resultados utilizando o algoritmo de Dijkstra, usamos primeiramente o
grafo observado abaixo. Informalmente, sem nenhuma criteriosidade ou formalidade matem´atica
Figura 1: Grafo utilizado para averiguar a efetividade da implementa¸c˜ao do Algoritmo de Dijkstra.
podemos descrever o Algoritmo de Dijkstra da seguinte maneira: procuramos o v´ertice mais pr´o-
ximo de A, depois, sucessivamente, procuramos entre os v´ertices n˜ao visitados aquele que tem a
menor distˆancia desde A, diretamente ou passando por algum v´ertice j´a visitado, anotando sem-
pre o percurso escolhido. Estamos considerando que nunca teremos distˆancias negativas, pois isso
atrapalharia o algoritmo, j´a que o mesmo n˜ao sabe lidar com distˆancias negativas(ele pode entrar
em looping). Come¸camos por construir uma tabela de distˆancias entre os v´ertices. Para os v´ertices
n˜ao ligados consideraremos a distˆancia como infinita. Para efeitos de implementa¸c˜ao a distˆancia
A B C D
A 0 12 2 ∞
B ∞ 0 ∞ ∞
C ∞ 5 0 2
D ∞ 1 ∞ 0
Tabela 1: Constru¸c˜ao da tabela de distˆancias entre v´ertices.
infinita foi representada pelo m´aximo n´umerico que poderia ser indexado pelo computador hospe-
deiro da aplica¸c˜ao/programa. Em C++ (linguagem utilizada para implementar o algoritmo) esse
m´aximo n´umerico ´e obtido atrav´es da biblioteca limits com o uso da classe numeric limits. Um
exemplo de uso dessas instru¸c˜oes ´e dado logo abaixo:
// Abaixo um exemplo de obten¸c~ao de limite n´umerico. Oten¸c~ao do maior inteiro
// com sinal que pode ser indexado, bem como o maior ponto flutuante de precis~ao
// dupla que pode ser representado na m´aquina hospedeira da aplica¸c~ao.
int maximo_int = numeric_limits<int>::max(); /*M´aximo inteiro*/
double maximo_dbl = numeric_limits<double>::max(); /*M´aximo ponto flutuante*/
Figura 2: Arborescˆencia de distˆancias obtida atrav´es da aplica¸c˜ao do Algoritmo de Dijkstra. Esta
arborescˆencia pode ser constru´ıda com base nos valores armazenados na tabela de distˆancias.
3
4. A B C D
Distˆancia 0 5 2 4
Anterior - D A C
Tabela 2: Depois da avalia¸c˜ao de todos os v´ertices finalizamos a constru¸c˜ao da tabela com todas as
distˆancias a partir da origem. Com base nesta tabela tamb´em podemos construir a arborescˆencia
de distˆancias.
2 Algoritmo de Bellmann-Ford.
Para verifica¸c˜ao dos resultados utilizando o algoritmo de Bellmann-Ford, usamos o mesmo
grafo com o qual averiguamos a capacidade do algoritmo de Dijkstra.
Figura 3: Grafo utilizado para averiguar a efetividade da implementa¸c˜ao do Algoritmo de
Bellmann-Ford. Ao final do processo obtivemos a mesma arborescˆencia de distˆancias.
Abaixo verificamos os passos utilizados para c´alculo das rotas a partir das informa¸c˜oes de
distˆancias entre os v´ertices.
(A, B) : dAB(∞) > dAA(0) + vAB(12) → dAB = 12 anterior(B) = A
(A, C) : dAC(∞) > dAA(0) + vAC(2) → dAC = 2 anterior(C) = A
(C, B) : dAB(12) > dAC(2) + vCB(5) → dAB = 7 anterior(B) = C
(C, D) : dAD(∞) > dAC(2) + vCD(2) → dAD = 4 anterior(D) = C
(D, B) : dAB(7) > dAD(4) + vDB(1) → dAB = 5 anterior(B) = D
Em uma segunda itera¸c˜ao n˜ao haver´a mudan¸cas nos valores das distˆancias c´alculadas atrav´es do
Algoritmo de Bellmann-Ford.
3 Algoritmos de Dijkstra e Bellmann-Ford.
Os algoritmos de Dijkstra e Bellmann-Ford foram implementados atrav´es da linguagem C++.
Os fontes com as respectivas classes e objetos de teste podem ser encontrados em anexo. As
funcionalidades das partes integrantes dos fontes podem ser facilmente entendidas, j´a que todas as
instru¸c˜oes foram exaustivamente documentadas. Para uma melhor compreens˜ao dos mecanismos
utilizados recomendamos a leitura dos livros Algorithms de Robert Sedgewick, The Algorithm
Design Manual de Steven S. Skiena, C++: The Complete Reference de Herbert Schildt, C++
by Dissection de Ira Pohl, The C++ Programming Language de Bjarne Stroustrup e finalmente
Effective C++ de Scott Meyers.
4 Sa´ıda Produzida Pela Aplica¸c˜ao.
A seguir ser´a exibida a sa´ıda produzida pela aplica¸c˜ao com base no exemplo dado anteriormente
(ver figura 1). Verifique a evolu¸c˜ao da tabela de distˆancias para a sa´ıda do algoritmo de Dijkstra
e o n´umero de itera¸c˜oes necess´arias, para que nesse exemplo, possamos chegar a um estado final.
4