Your SlideShare is downloading. ×
Graph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-Ford
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Graph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-Ford

100
views

Published on

Some solved exercises of Graph Theory. The reference book used was: "Grafos - Introdução e Prática".

Some solved exercises of Graph Theory. The reference book used was: "Grafos - Introdução e Prática".

Published in: Education

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
100
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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
  • 5. Matriz de Adjac^encias: [e11,0] [e12,1] [e13,1] [e14,0] [e21,1] [e22,0] [e23,1] [e24,1] [e31,1] [e32,1] [e33,0] [e34,1] [e41,0] [e42,1] [e43,1] [e44,0] Lista de V´ertices: [A,0] [B,0] [C,0] [D,0] Graus dos V´ertices: [A,0] : 2 [B,0] : 3 [C,0] : 3 [D,0] : 2 Matriz de Dist^ancias: 0 12 2 2147483647 2147483647 0 2147483647 2147483647 2147483647 5 0 2 2147483647 1 2147483647 0 Tabela de Dist^ancias: [A] [B] [C] [D] [Dist^ancias][1.79769e+308] [1.79769e+308] [1.79769e+308] [1.79769e+308] [Anterior] [ ] [ ] [ ] [ ] Executando o Algoritmo de Dijkstra: Tabela de Dist^ancias: [A] [B] [C] [D] [Dist^ancias][0] [12] [2] [1.79769e+308] [Anterior] [ ] [A] [A] [ ] Tabela de Dist^ancias: [A] [B] [C] [D] [Dist^ancias][0] [7] [2] [1.79769e+308] [Anterior] [ ] [C] [A] [ ] Tabela de Dist^ancias: [A] [B] [C] [D] [Dist^ancias][0] [7] [2] [1.79769e+308] [Anterior] [ ] [C] [A] [ ] Tabela de Dist^ancias: [A] [B] [C] [D] [Dist^ancias][0] [7] [2] [4] [Anterior] [ ] [C] [A] [C] Tabela de Dist^ancias: [A] [B] [C] [D] [Dist^ancias][0] [7] [2] [4] [Anterior] [ ] [C] [A] [C] Tabela de Dist^ancias: [A] [B] [C] [D] 5
  • 6. [Dist^ancias][0] [5] [2] [4] [Anterior] [ ] [D] [A] [C] Tabela de Dist^ancias: [A] [B] [C] [D] [Dist^ancias][0] [5] [2] [4] [Anterior] [ ] [D] [A] [C] Tabela de Dist^ancias: [A] [B] [C] [D] [Dist^ancias][0] [5] [2] [4] [Anterior] [ ] [D] [A] [C] Tabela de Dist^ancias: [A] [B] [C] [D] [Dist^ancias][0] [5] [2] [4] [Anterior] [ ] [D] [A] [C] Tabela de Dist^ancias: [A] [B] [C] [D] [Dist^ancias][0] [5] [2] [4] [Anterior] [ ] [D] [A] [C] Tabela de Dist^ancias: [A] [B] [C] [D] [Dist^ancias][0] [5] [2] [4] [Anterior] [ ] [D] [A] [C] Tabela de Dist^ancias: [A] [B] [C] [D] [Dist^ancias][0] [5] [2] [4] [Anterior] [ ] [D] [A] [C] 6

×