Este documento apresenta as respostas para as questões 1, 2 e 5 de um exercício sobre Teoria dos Grafos. Na questão 1, o algoritmo de Dijkstra é aplicado a um grafo trocando o sinal de um arco. Na questão 2, os algoritmos de Dijkstra e Bellman-Ford são aplicados a dois grafos, comparando os resultados. Na questão 5, o algoritmo de Dijkstra é usado para encontrar as menores distâncias de um vértice a outros vértices.
1. Teoria dos Grafos - Exercícios do Capítulo 3
Questões 1, 2 e 5
Michel Alves dos Santos ∗
Abril de 2011
∗Bacharelando em Ciência da Computação, Universidade Federal do Estado de Alagoas(UFAL). E-mails: mi-
chel.mas@gmail.com, michelalavessantos@hotmail.com. Disciplina: Teoria dos Grafos. Docente Responsável: Leo-
nardo Viana Pereira.
1
2. Conteúdo
Lista de Figuras 3
Lista de Tabelas 3
1 Questão 1. Execute o algoritmo de Dijkstra com o exemplo do item 3.2, tro-
cando antes o sinal do custo do arco (E,B). 4
2 Questão 2. Considere os dois grafos utilizados nos algoritmos de Dijkstra e
Bellman-Ford. 5
2.1 Aplique o algoritmo de Dijkstra, acompanhando a formalização, aos dois grafos, use
os vértices A, no primeiro, e 1, no segundo, como origem. . . . . . . . . . . . . . . 5
2.1.1 Para o primeiro grafo teremos: . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.2 Para o segundo grafo teremos: . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Aplique o algoritmo de Bellmann-Ford aos dois grafos (mesma observação). . . . . 9
2.2.1 Para o primeiro grafo teremos: . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.2 Para o segundo grafo teremos: . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3 No segundo grafo, mude o valor do arco(3,5) para -2 e aplique os dois algoritmos.
Observe os resultados obtidos e interprete. . . . . . . . . . . . . . . . . . . . . . . . 10
2.3.1 Dijkstra: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3.2 Bellmann-Ford: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3 Questão 5. Utilizando o grafo a seguir, aplique o algoritmo de Dijkstra para
achar a menor distância do vértice A aos outros vértices e construa a arbores-
cência de distâncias a partir de A. 12
2
3. Lista de Figuras
1 Primeira Questão. Distâncias em quilômetros entre as cidades de uma certa região. 4
2 Arborescência de distâncias a partir do vértice A. . . . . . . . . . . . . . . . . . . . 5
3 Grafos fornecidos para a questão de número 2. . . . . . . . . . . . . . . . . . . . . 5
4 Arborescência de distâncias a partir do vértice A. . . . . . . . . . . . . . . . . . . . 7
5 Arborescência de distâncias a partir do vértice (1). . . . . . . . . . . . . . . . . . . 9
6 Grafo com o valor do arco (3,5) invertido. . . . . . . . . . . . . . . . . . . . . . . . 10
7 Grafo fornecido para a questão de número 5. . . . . . . . . . . . . . . . . . . . . . 12
8 Arborescência de distâncias a partir do vértice A. . . . . . . . . . . . . . . . . . . . 13
Lista de Tabelas
1 1o
Passo. Iniciando a tabela de distâncias e relações de anteriodidade. O rótulo
“Distância” indica a distância de qualquer vértice até o vértice A. O rótulo “Ante-
rior” indica o vértice anterior pelo qual o caminho está sendo contruído. . . . . . . 4
2 2o
Passo. Fechando o vértice C pois não existe menor distância. . . . . . . . . . . . 4
3 3o
Passo. Fechando o vértice D pois não existe menor distância. . . . . . . . . . . . 4
4 4o
Passo. Fechando o vértice E pois não existe menor distância. . . . . . . . . . . . 4
5 5o
Passo. Fechando o vértice F pois não existe menor distância. . . . . . . . . . . . 4
6 Passo Final. Fechando o vértice B* pois não existe menor distância. Todos os
vértices foram avaliados, com isso construímos a tabela com as distâncias. . . . . . 5
7 1o
Passo. Construindo a tabela de distâncias. . . . . . . . . . . . . . . . . . . . . . 5
8 2o
Passo. Inicializando a tabela de distâncias. . . . . . . . . . . . . . . . . . . . . . 6
9 3o
Passo. Passando pelo vértice C. . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
10 4o
Passo. Passando pelo vértice D. . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
11 5o
Passo. Passando pelo vértice E. . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
12 6o
Passo. Passando pelo vértice B. . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
13 Passo Final. Obtenção de todas as distâncias a partir do vértice A. . . . . . . . . . 7
14 1o
Passo. Construindo a tabela de distâncias. . . . . . . . . . . . . . . . . . . . . . 8
15 2o
Passo. Inicializando a tabela de distâncias. . . . . . . . . . . . . . . . . . . . . . 8
16 3o
Passo. Passando pelo vértice (2). . . . . . . . . . . . . . . . . . . . . . . . . . . 8
17 4o
Passo. Passando pelo vértice (3). . . . . . . . . . . . . . . . . . . . . . . . . . . 8
18 5o
Passo. Passando pelo vértice (4). . . . . . . . . . . . . . . . . . . . . . . . . . . 9
19 6o
Passo. Passando pelo vértice (5). . . . . . . . . . . . . . . . . . . . . . . . . . . 9
20 Passo Final. Obtenção de todas as distâncias a partir do vértice (1). . . . . . . . . 9
21 1o
Passo. Iniciando tabela com distâncias a partir do vértice (1). Usando o valor
1000 para representar infinito. Fechando o vértice (1), pois é nosso vértice de partida. 10
22 2o
Passo. Obtendo as rotas para os vértices (2) e (5) apartir do vértice (1). . . . . 11
23 3o
Passo. Obtendo as rotas para os vértices (3) e (4) apartir do vértice (2). . . . . 11
24 4o
Passo. Obtendo as rotas para os vértices (4) e (5) apartir do vértice (3). . . . . 11
25 5o
Passo. Obtendo rota para o vértice (1) apartir do vértice (4). Observe que o
vértice (1) já se encontra fechado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
26 6o
Passo. Obtendo rota para o vértice (1) e (4) apartir do vértice (5). . . . . . . . 11
27 Tabela com todas as distâncias a partir do vértice (1). Houve uma redução nas
distâncias devido ao caminho com valor negativo. . . . . . . . . . . . . . . . . . . . 11
28 1o
Passo. Iniciando a tabela de distâncias e relações de anteriodidade. O rótulo
“Distância” indica a distância de qualquer vértice até o vértice A. O rótulo “Ante-
rior” indica o vértice anterior pelo qual o caminho está sendo contruído. . . . . . . 12
29 Último Passo. Construção da tabela com as distâncias a partir do vértice A. . . . . 12
3
4. 1 Questão 1. Execute o algoritmo de Dijkstra com o exem-
plo do item 3.2, trocando antes o sinal do custo do arco
(E,B).
Figura 1: Primeira Questão. Distâncias em quilômetros entre as cidades de uma certa região.
A* B C D E F
Distância 0 ∞ ∞ ∞ ∞ ∞
Anterior - - - - - -
Tabela 1: 1o
Passo. Iniciando a tabela de distâncias e relações de anteriodidade. O rótulo
“Distância” indica a distância de qualquer vértice até o vértice A. O rótulo “Anterior” indica o
vértice anterior pelo qual o caminho está sendo contruído.
A* B C* D E F
Distância 0 12 4 ∞ ∞ ∞
Anterior - A A - - -
Tabela 2: 2o
Passo. Fechando o vértice C pois não existe menor distância.
A* B C* D* E F
Distância 0 12 4 6 ∞ 12
Anterior - A A C - D
Tabela 3: 3o
Passo. Fechando o vértice D pois não existe menor distância.
A* B C* D* E* F
Distância 0 12 4 6 6 12
Anterior - A A C C E
Tabela 4: 4o
Passo. Fechando o vértice E pois não existe menor distância.
A* B C* D* E* F*
Distância 0 12 4 6 6 12
Anterior - A A C C E
Tabela 5: 5o
Passo. Fechando o vértice F pois não existe menor distância.
4
5. A* B* C* D* E* F*
Distância 0 12 4 6 6 12
Anterior - A A C C E
Tabela 6: Passo Final. Fechando o vértice B* pois não existe menor distância. Todos os vértices
foram avaliados, com isso construímos a tabela com as distâncias.
Figura 2: Arborescência de distâncias a partir do vértice A.
2 Questão 2. Considere os dois grafos utilizados nos algo-
ritmos de Dijkstra e Bellman-Ford.
Figura 3: Grafos fornecidos para a questão de número 2.
2.1 Aplique o algoritmo de Dijkstra, acompanhando a formalização, aos
dois grafos, use os vértices A, no primeiro, e 1, no segundo, como
origem.
2.1.1 Para o primeiro grafo teremos:
Procuramos a cidade mais próxima de A. Depois, sucessivamente, procuramos entre as cidades
não visitadas aquela que tem a menor distância desde A, diretamente ou passando por alguma
cidade já visitada, anotando sempre o percurso escolhido. Estamos considerando que nunca te-
remos distâncias negativas, pois isso atrapalharia o algoritmo, já que o mesmo não sabe lidar
com distâncias negativas(ele pode entrar em looping). Começamos por construir uma tabela de
distâncias entre os vértices. Para os vértices não ligados consideraremos a distância como infinita.
Para os próximos passos usaremos o número 1000 para representar a distância infinita (∞) que
A* B C D E F
A 0 12 4 ∞ ∞ ∞
B ∞ 0 6 6 ∞ ∞
C ∞ 10 0 ∞ 2 ∞
D ∞ ∞ 8 0 ∞ 6
E ∞ 2 ∞ ∞ 0 6
F ∞ ∞ ∞ ∞ ∞ 0
Tabela 7: 1o
Passo. Construindo a tabela de distâncias.
foi colocada na tabela de distâncias para representar a falta de ligação entre os vértices.
5
6. Inicialização: A distância de A para todos os outros vértices é marcada como infinita(nesse
caso 1000), exceto para o próprio A(distância 0). Marcamos A como fechado, usando um asterisco,
e o vértice anterior fica vazio porque A é o nosso vértice de partida.
A* B C D E F
Distância 0 ∞ ∞ ∞ ∞ ∞
Anterior - - - - - -
Tabela 8: 2o
Passo. Inicializando a tabela de distâncias.
• 2o
Passo: Que cidades posso alcançar a partir de A e qual é a distância entre elas?
• Resposta: B, distância = 12 (mudamos para 12 pois: 12 < 1000 )
• Resposta: C, distância = 4 (mudamos para 4 pois: 4 < 1000 )
O vértice C será fechado pois sua distância não pode ser melhorada e será o nosso próximo ponto
de partida.
A* B C* D E F
Distância 0 12 4 ∞ ∞ ∞
Anterior A A A - - -
Tabela 9: 3o
Passo. Passando pelo vértice C.
• 3o
Passo: Que cidades posso alcançar a partir de C e qual é a distância entre elas?
• Resposta: B, distância = 14 (não mudamos para 14 pois: 12 < 14 )
• Resposta: D, distância = 6 (mudamos para 6 pois: 6 < 1000 )
• Resposta: E, distância = 6 (mudamos para 6 pois: 6 < 1000 )
O vértice D será fechado pois sua distância não pode ser melhorada e será o nosso próximo ponto
de partida.
A* B C* D* E F
Distância 0 12 4 6 6 ∞
Anterior A A A C C -
Tabela 10: 4o
Passo. Passando pelo vértice D.
• 4o
Passo: Que cidades posso alcançar a partir de D e qual é a distância entre elas?
• Resposta: C, distância = 14 (não mudamos para 14 pois: 4 < 14 )
• Resposta: F, distância = 12 (mudamos para 12 pois: 12 < 1000 )
Por enquanto nenhum vértice será fechado mas as distâncias computadas que estavam dentro do
padrão de minimalidade serão atualizadas na tabela. Próximo ponto de partida será o vértice E.
• 5o
Passo: Que cidades posso alcançar a partir de E e qual é a distância entre elas?
• Resposta: B, distância = 8 (mudamos para 8 pois: 8 < 12)
• Resposta: F, distância = 12 (mudamos para 12 pois: 12 <= 12)
6
7. A* B C* D* E F
Distância 0 12 4 6 6 12
Anterior A A A C C D
Tabela 11: 5o
Passo. Passando pelo vértice E.
A* B C* D* E* F
Distância 0 8 4 6 6 12
Anterior A E A C C E
Tabela 12: 6o
Passo. Passando pelo vértice B.
O vértice E será fechado pois sua distância não pode ser melhorada e B será o nosso próximo
ponto de partida.
• 6o
Passo: Que cidades posso alcançar a partir de B e qual é a distância entre elas?
• Resposta: C, distância = 14 (não mudamos para 14 pois: 4 < 14)
• Resposta: D, distância = 14 (não mudamos para 14 pois: 6 < 14)
Porém vale observar que o vértice C já foi fechado e o vértice D também, logo o vértice B se-
ráfechado pois não existe menor distância para alcançá-lo. Além disso chegamos ao final das
verificações, logo o vértice F também será fechado e com isso teremos:
A* B* C* D* E* F*
Distância 0 8 4 6 6 12
Anterior A E A C C E
Tabela 13: Passo Final. Obtenção de todas as distâncias a partir do vértice A.
Figura 4: Arborescência de distâncias a partir do vértice A.
2.1.2 Para o segundo grafo teremos:
Começamos por construir uma tabela de distâncias entre os vértices. Para os vértices não
ligados consideraremos a distância como infinita (∞). Para os próximos passos usaremos o número
1000 para representar a distância infinita (∞) que foi colocada na tabela de distâncias para
representar a falta de ligação entre os vértices.
Inicialização: A distância de (1) para todos os outros vértices é marcada como infinita(nesse
caso 1000), exceto para o próprio (1)(distância 0). Marcamos (1) como fechado, usando um
asterisco, e o vértice anterior fica vazio porque (1) é o nosso vértice de partida.
• 2o
Passo: Que vértices posso alcançar a partir de (1) e qual é a distância entre eles?
• Resposta: (2), distância = 1 (mudamos para 1 pois: 1 < 1000 )
7
8. (1) (2) (3) (4) (5)
(1) 0 1 ∞ ∞ 1
(2) ∞ 0 1 2 ∞
(3) ∞ ∞ 0 4 2
(4) 3 ∞ ∞ 0 ∞
(5) 2 ∞ ∞ 1 0
Tabela 14: 1o
Passo. Construindo a tabela de distâncias.
(1)* (2) (3) (4) (5)
Distância 0 ∞ ∞ ∞ ∞
Anterior - - - - -
Tabela 15: 2o
Passo. Inicializando a tabela de distâncias.
• Resposta: (5), distância = 1 (mudamos para 1 pois: 1 < 1000 )
O vértice (2) será fechado pois sua distância não pode ser melhorada e será o nosso próximo ponto
de partida.
(1)* (2)* (3) (4) (5)
Distância 0 1 ∞ ∞ 1
Anterior - (1) - - (1)
Tabela 16: 3o
Passo. Passando pelo vértice (2).
• 3o
Passo: Que vértices posso alcançar a partir de (2) e qual é a distância entre eles?
• Resposta: (3), distância = 2 (mudamos para 2 pois: 2 < 1000 )
• Resposta: (4), distância = 3 (mudamos para 3 pois: 3 < 1000 )
O vértice (3) será fechado pois sua distância não pode ser melhorada e será o nosso próximo ponto
de partida.
(1)* (2)* (3)* (4) (5)
Distância 0 1 2 3 1
Anterior - (1) (2) (2) (1)
Tabela 17: 4o
Passo. Passando pelo vértice (3).
• 4o
Passo: Que vértices posso alcançar a partir de (3) e qual é a distância entre eles?
• Resposta: (4), distância = 6 (não mudamos para 6 pois: 3 < 6 )
• Resposta: (5), distância = 4 (não mudamos para 4 pois: 1 < 4 )
O vértice (4) não será fechado pois ainda não averiguamos se a distância pode ser melhorada e
será o nosso próximo ponto de partida.
• 4o
Passo: Que vértices posso alcançar a partir de (4) e qual é a distância entre eles?
• Resposta: (1), distância = 6 (não mudamos para 6 pois: 0 < 6 )
8
9. (1)* (2)* (3)* (4) (5)
Distância 0 1 2 3 1
Anterior - (1) (2) (2) (1)
Tabela 18: 5o
Passo. Passando pelo vértice (4).
(1)* (2)* (3)* (4) (5)
Distância 0 1 2 3 1
Anterior - (1) (2) (2) (1)
Tabela 19: 6o
Passo. Passando pelo vértice (5).
O vértice (4) não será fechado pois ainda não averiguamos se a distância pode ser melhorada e o
vértice (5) será o nosso próximo ponto de partida. Observe que o vértice (1) já estava fechado.
• Passo Final: Que vértices posso alcançar a partir de (5) e qual é a distância entre eles?
• Resposta: (1), distância = 3 (não mudamos para 3 pois: 0 < 3 )
• Resposta: (4), distância = 2 (mudamos para 2 pois: 2 < 3 )
O vértice (4) será fechado pois a distância não pode ser melhorada e o vértice (5) também será.
(1)* (2)* (3)* (4)* (5)*
Distância 0 1 2 2 1
Anterior - (1) (2) (5) (1)
Tabela 20: Passo Final. Obtenção de todas as distâncias a partir do vértice (1).
Figura 5: Arborescência de distâncias a partir do vértice (1).
2.2 Aplique o algoritmo de Bellmann-Ford aos dois grafos (mesma ob-
servação).
2.2.1 Para o primeiro grafo teremos:
(A, B) : dAB(∞) > d11(0) + vAB(12) → dAB = 12 anterior(B) = A
(A, C) : dAC(∞) > d11(0) + vAC(4) → dAC = 4 anterior(C) = A
(C, B) : dAB(12) < dAC(4) + vCB(10) → dAB = 12 sem modificação
(C, D) : dAD(∞) > dAC(4) + vCD(2) → dAD = 6 anterior(D) = C
(C, E) : dAE(∞) > dAC(4) + vCE(2) → dAE = 6 anterior(E) = C
(D, C) : dAC(4) < dAD(6) + vDC(8) → dAC = 4 sem modificação
(D, F) : dAF (∞) > dAD(6) + vDF (6) → dAF = 12 anterior(F) = D
9
10. (E, B) : dAB(12) > dAE(6) + vEB(2) → dAB = 8 anterior(B) = E
(E, F) : dAF (12) >= dAE(6) + vEF (6) → dAF = 12 anterior(F) = E
(B, C) : dAC(4) < dAB(8) + vBC(6) → dAC = 4 sem modificação
(B, D) : dAD(6) < dAB(8) + vBD(6) → dAD = 6 sem modificação
Em uma segunda iteração não haverá mudanças nos valores das distâncias.
2.2.2 Para o segundo grafo teremos:
(1, 2) : d12(∞) > d11(0) + v12(1) → d12 = 1 anterior(2) = 1
(1, 5) : d15(∞) > d11(0) + v15(1) → d15 = 1 anterior(5) = 1
(2, 3) : d13(∞) > d12(1) + v23(1) → d13 = 2 anterior(3) = 2
(2, 4) : d14(∞) > d12(1) + v24(2) → d14 = 3 anterior(4) = 2
(3, 4) : d14(3) > d13(2) + v34(4) → sem modificação
(3, 5) : d15(1) > d13(2) + v35(2) → sem modificação
(4, 1) : d11(0) > d14(3) + v41(3) → sem modificação
(5, 1) : d11(0) > d15(1) + v51(2) → sem modificação
(5, 4) : d14(3) > d15(1) + v54(1) → d14 = 2 anterior(4) = 5
Em uma segunda iteração não haverá mudanças nos valores das distâncias.
2.3 No segundo grafo, mude o valor do arco(3,5) para -2 e aplique os
dois algoritmos. Observe os resultados obtidos e interprete.
Figura 6: Grafo com o valor do arco (3,5) invertido.
2.3.1 Dijkstra:
(1)* (2) (3) (4) (5)
Distância 0 1000 1000 1000 1000
Anterior - - - - -
Tabela 21: 1o
Passo. Iniciando tabela com distâncias a partir do vértice (1). Usando o valor 1000
para representar infinito. Fechando o vértice (1), pois é nosso vértice de partida.
10
11. (1)* (2) (3) (4) (5)
Distância 0 1 1000 1000 1
Anterior - (1) - - (1)
Tabela 22: 2o
Passo. Obtendo as rotas para os vértices (2) e (5) apartir do vértice (1).
(1)* (2) (3) (4) (5)
Distância 0 1 2 3 1
Anterior - (1) (2) (2) (1)
Tabela 23: 3o
Passo. Obtendo as rotas para os vértices (3) e (4) apartir do vértice (2).
(1)* (2)* (3)* (4) (5)
Distância 0 1 2 3 0
Anterior - (1) (2) (2) (3)
Tabela 24: 4o
Passo. Obtendo as rotas para os vértices (4) e (5) apartir do vértice (3).
(1)* (2)* (3)* (4) (5)
Distância 0 1 2 3 0
Anterior - (1) (2) (2) (3)
Tabela 25: 5o
Passo. Obtendo rota para o vértice (1) apartir do vértice (4). Observe que o vértice
(1) já se encontra fechado.
(1)* (2)* (3)* (4)* (5)
Distância 0 1 2 1 0
Anterior - (1) (2) (5) (3)
Tabela 26: 6o
Passo. Obtendo rota para o vértice (1) e (4) apartir do vértice (5).
(1)* (2)* (3)* (4)* (5)*
Distância 0 1 2 1 0
Anterior - (1) (2) (5) (3)
Tabela 27: Tabela com todas as distâncias a partir do vértice (1). Houve uma redução nas
distâncias devido ao caminho com valor negativo.
11
12. 2.3.2 Bellmann-Ford:
(1, 2) : d12(∞) > d11(0) + v12(1) → d12 = 1 anterior(2) = 1
(1, 5) : d15(∞) > d11(0) + v15(1) → d15 = 1 anterior(5) = 1
(2, 3) : d13(∞) > d12(1) + v23(1) → d13 = 2 anterior(3) = 2
(2, 4) : d14(∞) > d12(1) + v24(2) → d14 = 3 anterior(4) = 2
(3, 4) : d14(3) > d13(2) + v34(4) → sem modificação
(3, 5) : d15(1) > d13(2) + v35(−2) → d15 = 0 anterior(5) = 3
(4, 1) : d11(0) > d14(3) + v41(3) → sem modificação
(5, 1) : d11(0) > d15(1) + v51(2) → sem modificação
(5, 4) : d14(3) > d15(0) + v54(1) → d14 = 1 anterior(4) = 5
Em uma segunda iteração não haverá mudanças nos valores das distâncias.
3 Questão 5. Utilizando o grafo a seguir, aplique o algo-
ritmo de Dijkstra para achar a menor distância do vér-
tice A aos outros vértices e construa a arborescência de
distâncias a partir de A.
Figura 7: Grafo fornecido para a questão de número 5.
A* B C D E F G H I J
Distância 0 ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞
Anterior - - - - - - - - - -
Tabela 28: 1o
Passo. Iniciando a tabela de distâncias e relações de anteriodidade. O rótulo
“Distância” indica a distância de qualquer vértice até o vértice A. O rótulo “Anterior” indica o
vértice anterior pelo qual o caminho está sendo contruído.
A* B* C* D* E* F* G* H* I* J*
Distância 0 4 1 2 7 4 5 4 8 6
Anterior - A A C B D D D F H
Tabela 29: Último Passo. Construção da tabela com as distâncias a partir do vértice A.
12