Anotações sobre Grafos e Algoritmos
Anotações sobre Grafos e Algoritmos
6
2
5 3
4
List of Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1 Definições Iniciais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1.1 Grafos Valorados ou Ponderados . . . . . . . . . . . . . . . . . . . 8
1.1.2 Grafos Orientados . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.1.3 Hipergrafo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.1.4 Multigrafo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.1.5 Grau de um Vértice . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.1.6 Igualdade e Isomorfismo . . . . . . . . . . . . . . . . . . . . . . . 12
1.1.7 Partição de Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.1.8 Matriz de Incidência . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.1.9 Operações com Grafos . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.1.10 Vizinhança . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.1.11 Grafo Regular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.1.12 Grafo Simétrico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.1.13 Grafo Anti-simétrico . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.1.14 Grafo Completo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.1.15 Grafo Complementar . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.1.16 Percursos em Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.1.17 Cintura e Circunferência . . . . . . . . . . . . . . . . . . . . . . . 16
1.1.18 Planaridade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.1.19 Vértice de Corte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.1.20 Ponte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.1.21 Base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.1.22 Anti-Base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.1.23 SCIE (Subconjunto Internamente Estável ou conjunto indepen-
dente) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.1.24 SCEE (Subconjunto Externamente Estável ou conjunto dominante) 18
2 Representações Computacionais . . . . . . . . . . . . . . . . . . . . . . 19
2.1 Lista de Adjacências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2 Matriz de Adjacências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3 Buscas em Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1 Busca em Largura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1.1 Complexidade da Busca em Largura . . . . . . . . . . . . . . . . . 24
3.1.2 Propriedades e Provas . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.1.2.1 Caminhos Mínimos . . . . . . . . . . . . . . . . . . . . . 24
3.1.2.2 Árvores em Largura . . . . . . . . . . . . . . . . . . . . . 27
3.2 Busca em Profundidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.1 Complexidade da Busca em Profundidade . . . . . . . . . . . . . 28
4 Caminhos e Ciclos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.1 Caminhos e Ciclos Eulerianos . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.1.0.1 Curiosidade . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.1.1 Algoritmo de Hierholzer . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2 Caminhos e Ciclos Hamiltonianos . . . . . . . . . . . . . . . . . . . . . . 38
4.2.1 Caixeiro Viajante . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5 Caminhos Mínimos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.1 Propriedades de Caminhos Mínimos . . . . . . . . . . . . . . . . . . . . . 43
5.1.1 Propriedade de subcaminhos de caminhos mínimos o são . . . 43
5.1.2 Propriedade de desigualdade triangular . . . . . . . . . . . . . . 44
5.1.3 Propriedade de limite superior . . . . . . . . . . . . . . . . . . . . 44
5.1.4 Propriedade de inexistência de caminho . . . . . . . . . . . . . . 45
5.1.5 Propriedade de convergência . . . . . . . . . . . . . . . . . . . . . 45
5.1.6 Propriedade de relaxamento de caminho . . . . . . . . . . . . . . 46
5.1.7 Propriedade de relaxamento e árvores de caminho mínimo . . . 47
5.1.8 Propriedade de subgrafo dos predecessores . . . . . . . . . . . . 48
5.2 Bellman-Ford . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.2.1 Complexidade de Bellman-Ford . . . . . . . . . . . . . . . . . . . 51
5.2.2 Corretude de Bellman-Ford . . . . . . . . . . . . . . . . . . . . . . 51
5.3 Dijkstra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.3.1 Complexidade de Dijkstra . . . . . . . . . . . . . . . . . . . . . . . 54
5.3.2 Corretude do Algoritmo de Dijkstra . . . . . . . . . . . . . . . . . 55
5.4 Floyd-Warshall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.4.1 Complexidade de Floyd-Warshall . . . . . . . . . . . . . . . . . . 57
5.4.2 Corretude de Floyd-Warshall . . . . . . . . . . . . . . . . . . . . . 58
5.4.3 Construção de Caminhos Mínimos para Floyd-Warshall . . . . . 58
6 Problemas de Travessia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.1 Problema dos Canibais e Missionários . . . . . . . . . . . . . . . . . . . . 62
6.1.1 Construção e Busca . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.2 Problemas dos Potes de Vinho . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.3 Problema da Fuga dos Ladrões . . . . . . . . . . . . . . . . . . . . . . . . 65
6.4 Problema dos três maridos ciumentos . . . . . . . . . . . . . . . . . . . . 65
6.5 Problema de Agrupamento de Indivíduos . . . . . . . . . . . . . . . . . . 65
7 Conectividade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
7.1 Componentes Fortemente Conexas . . . . . . . . . . . . . . . . . . . . . . 67
7.1.1 Complexidade do Algoritmo de Componentes Fortemente Conexas 69
7.1.2 Corretude do Algoritmo de Componentes Fortemente Conexas 69
7.1.2.1 Propriedades de Buscas em Profundidade . . . . . . . 69
7.1.2.2 Propriedades de Componentes Fortemente Conexas . 71
7.2 Ordenação Topológica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
7.2.1 Complexidade da Ordenação Topológica . . . . . . . . . . . . . . 75
7.2.2 Corretude da Ordenação Topológica . . . . . . . . . . . . . . . . . 75
8 Árvores Geradoras Mínimas . . . . . . . . . . . . . . . . . . . . . . . . . 77
8.1 Propriedades do Método Genérico . . . . . . . . . . . . . . . . . . . . . . 78
8.2 Algoritmo de Kruskal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
8.2.1 Complexidade do Algoritmo de Kruskal . . . . . . . . . . . . . . . 80
8.3 Algoritmo de Prim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
8.3.1 Complexidade do Algoritmo de Prim . . . . . . . . . . . . . . . . 82
9 Fluxo Máximo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
9.1 Redes de Fluxo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
9.2 Rede Residual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
9.3 Caminhos Aumentantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
9.4 Cortes de Redes de Fluxo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
9.5 Ford-Fulkerson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
9.5.1 Complexidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
9.6 Edmonds-Karp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
9.6.1 Complexidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
10 Emparelhamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
10.1 Emparelhamento Máximo em Grafos Bipartidos . . . . . . . . . . . . . . 91
10.1.1 Resolução por Fluxo Máximo . . . . . . . . . . . . . . . . . . . . . 91
10.1.1.1 Complexidade . . . . . . . . . . . . . . . . . . . . . . . . 93
10.1.2 Algoritmo de Hopcroft-Karp . . . . . . . . . . . . . . . . . . . . . 93
10.1.2.1 Algoritmo detalhado . . . . . . . . . . . . . . . . . . . . 94
10.1.2.2 Complexidade . . . . . . . . . . . . . . . . . . . . . . . . 96
10.2 Emparelhamento Máximo em Grafos . . . . . . . . . . . . . . . . . . . . . 96
11 Coloração de Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
11.1 Aplicações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
11.2 Algoritmo de Lawler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
11.2.1 Complexidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
11.3 Listar Conjuntos Independentes Maximais . . . . . . . . . . . . . . . . . 102
12 Caminho Crítico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
12.1 Listar Conjuntos Independentes Maximais . . . . . . . . . . . . . . . . . 105
12.2 Cálculo do caminho crítico . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Referências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
A Revisão de Matemática Discreta . . . . . . . . . . . . . . . . . . . . . . 111
B Estruturas de Dados Auxiliares . . . . . . . . . . . . . . . . . . . . . . . 113
B.1 Conjuntos Disjuntos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Índice de algoritmos
3 Busca em largura. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4 Busca em profundidade. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5 Algoritmo de Hierholzer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
6 Algoritmo de Auxiliar “busc ar Subci cl oEul er i ano”. . . . . . . . . . . . . 35
7 Algoritmo de Bellman-Held-Karp. . . . . . . . . . . . . . . . . . . . . . . . . 39
8 Inicialização de G. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
9 Relaxamento de v. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
10 Algoritmo de Bellman-Ford. . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
11 Algoritmo de Dijkstra. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
12 Algoritmo de Floyd-Warshall. . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
13 Algoritmo de Floyd-Warshall com Matriz dos Predecessores. . . . . . . . . 59
14 Print-Shortest-Path. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
15 Algoritmo de Componentes-Fortemente-Conexas . . . . . . . . . . . . . . 68
16 DFS de Cormen et al. (2012). . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
17 DFS-Visit de Cormen et al. (2012). . . . . . . . . . . . . . . . . . . . . . . . . 69
18 DFS para Ordenação Topológica . . . . . . . . . . . . . . . . . . . . . . . . . 74
19 DFS-Visit-OT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
23 Algoritmo de Ford-Fulkerson. . . . . . . . . . . . . . . . . . . . . . . . . . . 87
24 Busca em Largura para Edmonds-Karp. . . . . . . . . . . . . . . . . . . . . 88
Antes de visitar a representação de grafos, é importante que saibamos o que são vér-
Um grafo pode ser representado de duas formas (CORMEN et al., 2012). A primeira
Nela, o grafo é representado como uma dupla para especificar vértices e arestas. Por
exemplo, para um grafo G, pode-se dizer que o mesmo é uma dupla G = (V, E ), especifi-
forma seria uma através de uma matriz binária, chamada de matriz de adjacência.
Normalmente representada pela letra A(G), a matriz é definida por A(G) = {0, 1}|V |×|V | ,
a qual seus elementos a u,v = 1 se existir uma aresta entre os vértices u e v. Um exemplo
das das formas para um mesmo grafo pode ser visualizado no Exemplo 1.1.1.
8 Capítulo 1. Introdução
G = ({1, 2, 3, 4}, {{1, 2}, {1, 4}, {2, 4}, {3, 4}}). (1.1)
1 0 1 0 1
A(G) = 2 1 0 0 1 .
3 0 0 0 1
4 1 1 1 0
1 3
2 4
Figura 1 – Exemplo de grafo com 4 vértices e 4 arestas.
a definição do grafo passa a ser uma tripla G = (V, E , w), na qual V é o conjunto de
Quando não se possui valornas arestas, parte-se de uma relação binária entre existir
ou não uma aresta entre dois vértices. Neste caso, se u e v possui uma aresta, geralmente
Em uma matriz de adjacências para grafos valorados, o valor das arestas aparecem
nas células da matriz. Em um par de vértices que não possui valor estabelecido (não há
aresta), representa-se com uma lacuna ou com um valor simbólico para o problema que
associa o valor infinito aos pares de vértices que não possuem arestas.
plo 1.1.2.
sentação por listas de adjacências, o grafo pode ser representado da seguinte forma
G = ({1, 2, 3, 4}, {{1, 2}, {1, 4}, {2, 4}, {3, 4}}, w). (1.2)
A função w teria os seguintes valores: w({1, 2}) = 8, w({1, 4}) = 9, w({2, 4}) = 5 e w({3, 4}) =
7.
1 2 3 4
1 0 8 0 9
A(G) = 2 8 0 0 5
3 0 0 0 7
4 9 5 7 0
ou desta outra forma para o caso de uma aplicação a problemas que envolvam
distâncias
1 2 3 4
1 ∞ 8 ∞ 9
A(G) = 2 8 ∞ ∞ 5 .
3 ∞ ∞ ∞ 7
4 9 5 7 ∞
10 Capítulo 1. Introdução
1 3
9
8 7
2 5
4
Figura 2 – Exemplo de grafo valorado com 4 vértices e 4 arestas.
Para amizade, utiliza-se o valor 1 e para inimizade o valor −1. Nesse caso, não dizemos
que o grafo é valorado ou ponderado, mas sim um grafo com sinais. Quando os valores
negativos e positivos podem ser diferentes de 1 e −1, diz-se que os grafos são valorados
e com sinais.
Um grafo orientado é aquele no qual suas arestas possuem direção. Nesse caso, não
chamamos mais de arestas e sim de arcos. Um grafo orientado é definido como uma
nesse contexto: a função de arcos saintes δ+ (v) = {(v, u) : (v, u) ∈ A} e arcos entrantes
sentação por listas de adjacências, o grafo pode ser representado da seguinte forma
G = ({1, 2, 3, 4}, {(1, 4), (2, 1), (4, 2), (4, 3)}). (1.3)
1 2 3 4
1 0 0 0 1
A(G) = 2 1 0 0 0 .
3 0 0 0 0
4 0 1 1 0
1 3
2 4
Figura 3 – Exemplo de grafo orientado com 4 vértices e 4 arcos.
1.1.3 Hipergrafo
1.1.4 Multigrafo
Um multigrafo G = (V, E ) é um grafo que permite múltiplas arestas para o mesmo par de
vértices. Logo, não se tem mais um conjunto de arestas, mas sim uma tupla de arestas.
12 Capítulo 1. Introdução
Para o exemplo da Figura 4, têm-se E = ({1, 2}, {1, 2}, {1, 4}, {2, 4}, {3, 4}, {3, 4}).
1 3
2 4
Figura 4 – Exemplo de um multigrafo com 4 vértices e 6 arestas.
por d v− .
dois grafos são considerados isomorfos se existir uma função bijetora (uma-por-uma)
Uma partição de um grafo é uma divisão disjunta de seu conjunto de vértices. Um grafo
Sobre um grafo orientado G = (V, E ), uma matriz de incidência B (G) = {+1, −1, }|V |×|A|
mapeia a origem e o destino de cada arco no grafo G. Dado um arco (u, v), b u,(u,v) = +1
E 2 ∪ {{u, v} : u ∈ V1 ∧ v ∈ V2 });
e G 2 ×G 1 são isomorfos;
G 1 ⊕G 2 = (V1 , E 1 ∪ E 2 ).
Outras operações sobre grafos são descritas na literatura. Esse texto irá omití-las
por enquanto para que sejam utilizados no momento mais oportuno. Sõ elas: inserção
contexto de aplicação.
14 Capítulo 1. Introdução
1.1.10 Vizinhança
Nesse contexto, N (S) = v∈S N (v), N + (S) = v∈S N + (v), e N − (S) = v∈S N − (v).
S S S
N +2 (v) = N + N +1 (v)
¡ ¢
(1.6)
Chama-se de fecho transitivo direto aqueles que correspondem aos vizinhos suces-
R − (v) = |V
S | −k
k=0
N (v). Diz-se que w é descendente de v se w ∈ R + (v). Diz-se que w é
ascendente de v se w ∈ R − (v).
1.1.18 Planaridade
grafo planar pode ser representado em um plano sem que suas arestas se cruzem. Um
grafo plano é um grafo planar que foi desenhado numa superfície plana.
Netto (2006) cita três resultados mais conhecidos para considerar que um grafo é
planar:
• (Harary) Um grafo é planar sse não tiver, como subgrafo, um grafo homeomorfo1
a K 5 2 ou a K 3,3 3 .
1
Um grafo H é homeomorfo a um grafo G, se H pode ser obtido de G pela inserção de vértices de grau
2 em pontos intermediários de suas arestas (substitui uma aresta {u, v}, adicionando um vértice w e
duas arestas {u, w} e {v, w}) (NETTO, 2006).
2
Grafo K 5 : grafo completo com cinco vértices.
3
Grafo K 3,3 : grafo bipartido com 3 vértices para cada parte e cada parte se conecta a outra completa-
mente (9 arestas).
1.1. Definições Iniciais 17
ou a K 3,3 .
Um vértice é dito ser um vértice de corte se sua remoção (juntamente com as ares-
tas a ele conectadas) provoca um redução na conexidade do grafo (passa a ter mais
componentes desconexas).
1.1.20 Ponte
Uma aresta é dita ser um a ponte se sua remoção provoca um redução na conexidade
1.1.21 Base
• todo vértice não pertencente a B pode ser atingido por um caminho partindo de
B.
1.1.22 Anti-Base
pendente)
Agora, se dado um SCIE S não existe um outro SCIE S 0 tal que S ⊂ S 0 , então S é dito
minante)
estável se todo vértice não pertencente a T tiver pelo menos um vértice de T como
sucessor. A Figura 5 traz um grafo dirigido com o conjunto dominante {A, B,C }.
A B C
D E F
Se dado um SCEE T não existe um outro SCEE T 0 tal que T 0 ⊂ T , então T é dito
ser um SCEE minimal. Este conceito também pode ser aplicado a grafos não-dirigidos,
bastando que considere-se que todo vértice exterior a T deva ter como adjacente pelo
menos um vértice de T .
CAPÍTULO 2
Representações Computacionais
São elas “listas de adjacências” e “por matriz de adjacências” (CORMEN et al., 2012).
chamado aqui de Adj. Esse arranjo é composto por |V | listas, e cada posição do arranjo
Para grafos ponderados, Cormen et al. (2012) sugere o uso da própria estrutura de ad-
jacências para armazenar o peso. Dado um grafo ponderado não-dirigido G = (V, E , w),
¡ ¡ ¢ ¢ ¡ ¡ ¢ ¢
para cada {u, v} ∈ E , têm-se Adj[u] = . . . , v, w({u, v}) , . . . e Adj[v] = . . . , u, w({u, v}) , . . . .
¡ ¡ ¢ ¢
Quando o grafo for dirigido, para cada (u, v) ∈ E , têm-se Adj[u] = . . . , v, w((u, v)) , . . . .
20 Capítulo 2. Representações Computacionais
Para um grafo não-dirigido G = (V, E ), A = B|V |×|V | , na qual cada elemento a u,v = 1 e
a v,u = 1 se {u, v} ∈ E ; a u,v = 0 e a v,u = 0 caso {u, v} ∉ E . Para todo grafo não-dirigido G,
a u,v = a v,u .
Para um grafo dirigido G = (V, X ), A = B|V |×|V | , na qual cada elemento a u,v = 1 se
Para um grafo não-dirigido e ponderado G = (V, E , w), a matriz será formada por
células que comportem o tipo de dado representado pelos pesos. Assumindo que
os pesos serão números reais, então a matriz de adjacências será A = R|V |×|V | . Cada
elemento a u,v = w({u, v}) e a v,u = w({u, v}) se {u, v} ∈ E ; a u,v = ² e a v,u = ² caso {u, v} ∉
do contexto de aplicação.
5 foreach (u, v) ∈ A do
6 Adju,v ← w((u, v))
7 return Adj
2.3 Exercícios
Inserção de vértice
inserção de arestas
Remoção de vértice
Remoção de arestas
Teste se {u, v} ∈ E
Percorrer vizinhos
Grau de um vértice
CAPÍTULO 3
Buscas em Grafos
BFS) explora as arestas/arcos de G a partir de s para cada vértice que pode ser atingido a
O algoritmo pode produzir uma árvore de busca em largura com raiz s. Nessa árvore,
criam-se três estruturas de dados que serão utilizadas para armazenar os resultados
2012).
24 Capítulo 3. Buscas em Grafos
16 return (D, A)
podem ser realizadas em tempo Θ(1), então para realizar estas operações demanda-se
tempo de O(|V |). Deve-se considerar ainda, que muitas arestas/arcos incidem em vérti-
adjacências, que demandaria Θ(|E |). Diz-se então, que a complexidade computacional
da BFS é O(|V | + |E |) .
Para demonstrar isso, Cormen et al. (2012) examina algumas propriedades importantes
Prova: Se u pode ser atingido a partir de s, então o mesmo ocorre com v. Desse modo,
o caminho mínimo de s para v não pode ser mais longo do que o caminho de s para u
seguido pela aresta/arco (u, v) e a desigualdade vale. Se u não pode ser alcançado por s,
Lema 3.1.2. Seja G = (V, E ) um grafo orientado ou não-orientado e suponha que G tenha
Então, o vértice v é enfileirado e nunca será enfileirado novamente porque ele também
Lema 3.1.3. Suponha que durante a execução do algoritmo de busca em largura (Al-
i ∈ {1, 2, . . . , r − 1}.
Para a base da indução, imediatamente antes do laço de repetição (antes da linha 8),
Para o passo da indução, deve-se provar que o lema se mantém para depois do de-
removeu da fila o vértice u cujo as adjacências estão sendo analisadas, e pela hipótese
Prova: Imediata pelo Lema 3.1.3 e pela propriedade de que cada vértice recebe um
atingível por s. Ao findar sua execução, o algoritmo retornará a distância mínima entre s
Prova: Por contradição, suponha que algum vértice receba um valor de distância não
igual à distância de seu caminho mínimo. Seja v um vértice (com δ(s, v)) que recebe tal
valor de distância D v incorreto. O vértice v não poderia ser s, pois o algoritmo define
D s = 0, o que estaria correto. Então deve-se encontrar um outro v 6= s. Pelo Lema 3.1.2,
D v ≥ δ(s, v) e portanto, temos D v > δ(s, v). O vértice v deve poder ser visitado a partir
caminho mínimo de s a v, de modo que δ(s, v) = δ(s, u) + 1. Como δ(s, u) < δ(s, v), e em
momento, o vértice v pode ter sido não-visitado, visitado e já foi removido da fila, ou
• Se v já foi visitado (C v =true) e foi removido da fila, pelo Corolário 3.1.4, têm-se
à medida que efetua busca no grafo G = (V, E ). Também chamada de “subgrafo dos
28 Capítulo 3. Buscas em Grafos
predecessores”, uma árvore de busca em lagura pode ser definida como G π = (Vπ , E π ),
A busca em profundidade (Depth-First Search - DFS) realiza a visita a vértices cada vez
visitados. Parte-se a busca do vértice mais recentemente descoberto do qual ainda saem
arestas inexploradas. Depois que todas as arestas foram visitadas no mesmo caminho,
a busca retorna pelo mesmo caminho para passar por arestas inexploradas. Quando
não houver mais arestas inexploradas a busca em profundidade pára (CORMEN et al.,
2012).
que no lugar de usar uma fila, como na busca em largura (vide Algoritmo 3, utiliza-se
Cormen et al. (2012) afirma que é mais comum realizar a busca em profundidade de
várias fontes. Desse modo, seu livro reporta um algoritmo que sempre que um subgrafo
possui complexidade O(|V | + |E |). As operações da pilha resultariam tempo O(|V |).
17 return (C , T, A)
CAPÍTULO 4
Caminhos e Ciclos
ou arco. Gross e Yellen (2006) definem um caminho como um grafo com dois vértices
com grau 1 e os demais vértices com grau 2, formando uma estrutura linear. Um
ciclo (ou circuito)2 é uma cadeia fechada de vértices 〈v 1 , v 2 , . . . , v n , v 1 〉 onde cada par
consecutivo é conectado por uma aresta ou arco. É como um caminho com o fim e o
início conectados.
Dois problemas são apresentados a seguir. Eles estão relacionados a encontrar percursos
envolvendo percursos Eulerianos para grafos dirigidos, mas não será o foco deste curso.
1
Em inglês, chamado de path.
2
Em inglês, chamado de cycle ou circuit.
32 Capítulo 4. Caminhos e Ciclos
O problema do Caminho (ou Trilha) Euleriano pode ser definido como: encontrar
4.1.0.1 Curiosidade
sem repetí-las.
Observando um mapa antigo das sete pontes, você consegue determinar o caminho
Euleriano?
Figura 6 – Mapa das sete pontes de Königsberg na época de in Euler (GIUSCA, 2005).
4.1. Caminhos e Ciclos Eulerianos 33
publicação póstuma a seu criador, Carl Hierholzer (falecido em 1871). Através desse
trabalho, Carl Hierholzer provou que o que Leonhard Euler tinha razão ao conjecturar
que
. A partir dessa definição, uma dúvida pode permanecer: e sobre um grafo com vértice(s)
de grau zero, não teriam Ciclo Euleriano? A resposta mais adequada é teriam. Aceita-
3
Será que podemos estender uma propriedade semelhante para Caminhos Eulerianos?
34 Capítulo 4. Caminhos e Ciclos
1 foreach e ∈ E do
2 C e ← false
5 if r =false then
6 return (false,null)
7 else
8 if ∃e ∈ E : C e =false then
9 return (false,null)
10 else
11 return (true,C i cl o)
4.1. Caminhos e Ciclos Eulerianos 35
1 C i cl o ← (v)
2 t ←v
3 repeat
5 return (false,null)
6 else
8 C {v,u} ← true
9 v ←u
10 C i cl o ← C i cl o · (v)
11 until v = t
visitada. */
© ª
12 foreach x ∈ u ∈ C i cl o : ∃{u, w} ∈ {e ∈ E : C e =false} do
14 if r =false then
15 return (false,null)
lugar da posição de x em C i cl o.
17 return (true,C i cl o)
Lema 4.1.1. Seja G = (V, E ) um grafo não-dirigido no qual todas as arestas pertençam
à única componente conectada e todos os vértices possuem grau par, é sempre possível
36 Capítulo 4. Caminhos e Ciclos
Prova: A prova é realizada por contradição. Imagine que comecemos a criar um ciclo p
iremos tentar criar um caminho que nunca encontrará novamente v 1 . Ao iniciar por v 1 ,
d v0 1 e d u0 se tornam números ímpares. Como o grau de u é par e maior que 0, ele terá
alguma aresta não marcada que permitirá que o caminho continue a ser construído.
Repete-se o processo até que não seja mais possível encontrar arestas não marcadas,
adicionando um novo vértice ao caminho que esteja conectado ao último vértice adicio-
nado em p utilizando uma aresta não marcadas. Note que é impossível não retornar a v 1
e estabelecer um ciclo, pois todo vértice recém adicionado terá uma aresta não marcada
formando um ciclo, o que é uma contradição. Dessa forma, a prova por contradição
está completa.
Lema 4.1.2. Seja G = (V, E ) um grafo não-dirigido com dois ciclos p 1 e p 2 que não com-
partilham arestas, eles podem ser unidos para formar um único ciclo, caso compartilhem
um vértice.
2. conside p 1 = 〈u 1 , u 2 , . . . , x, . . . , u 1 〉 e p 2 = 〈v 1 , v 2 , . . . , x, . . . , v 1 〉;
4.1. Caminhos e Ciclos Eulerianos 37
〈x, . . . , v 1 , v 2 , . . . , x〉;
Lema 4.1.3. Seja G = (V, E ) um grafo não-dirigido no qual todos os vértices possuem grau
par, remover as arestas que compõem qualquer ciclo em G, todos os vértices continuarão
vértices que sofrerão redução de grau serão aqueles que pertencem ao ciclo, portanto,
por contradição, devemos supor que ao menos um vértice do ciclo terá grau ímpar. Isso
ao ciclo sofrerão sempre o decréscimo de dois em seus graus (um para aresta que entra
somente se G cada vértice tem um grau par e todas as arestas pertençam a uma única
Prova: A prova será realizada por contradição. Considerando o Lema 4.1.1 há ao menos
Então devemos imaginar arestas que não pertençam a um ciclo presente no grafo.
Ao remover os ciclos formados, ainda assim, teremos vértices com grau par pelo Lema
4.1.3. Essas arestas podem estar em uma única ou em várias componentes conectadas.
Sabe-se que essa ou essas componentes terão vértices de grau par e cada componente
poderá ter um ciclo (Lema 4.1.1). No caso de mais de uma componente conectada ter
sido gerada, significa que o ciclo removido conectava as componentes. Se cada uma
38 Capítulo 4. Caminhos e Ciclos
delas tiver um ciclo, então é possível obter um ciclo de cada uma (pelo Lema 4.1.2), logo
Analisando cada componente (ou a única que tenha sobra pela remoção), há de se
encontrar a aresta que não está no ciclo. No entanto, cada componente conectada pos-
sui um ciclo (Lema 4.1.1) e a remoção desse ciclo gerará componente ou componentes
com vértices de grau par (Lema 4.1.3) até que o grau seja igual a zero ou não haja mais
grafo apenas uma vez. Mais especificamente para um ciclo Hamiltoniano, o início e o
fim terminam no mesmo vértice. O nome Hamiltoniano vem de William Rowan Hamil-
ton, o inventor de um jogo que desafia a buscar um ciclo pelas arestas de dodecaedro
Completo.
pelo ciclo Hamiltoniano de menor soma total de peso (menor custo ou distância).
w({1, v})
para |S| = 0,
OP T (S, v) =
minu∈S,u6=1 {OP T (S − {u}, u) + w({u, v})} para n > 0.
é a função que representa o peso entre dois vértices (distância ou custo das arestas).
p
min{w(p) : u
v}, se há um caminho de u para v ,
δ(u, v) = (5.1)
∞, caso contrário.
2012):
todo o v ∈ V ;
para todo o v ∈ V ;
42 Capítulo 5. Caminhos Mínimos
Pesos Negativos
Os problemas de caminho mínimo geralmente operam sem erros em grafos com pe-
sos negativos. Uma exceção a isso é quando há um ciclo com peso negativo. Nesse
caso, nunca haverá um peso definido, pois é sempre possível diminuir o peso total do
Inicialização e Relaxamento
dados A é utilizada para identificar o vértice anterior em cada caminho mínimo para
5.1. Propriedades de Caminhos Mínimos 43
um vértice v ∈ V .
Algoritmo 8: Inicialização de G.
Input :um grafo G = (V, E , w), um vértice de origem s ∈ V
// inicialização
1 D v ← ∞ ∀v ∈ V
2 A v ← null ∀v ∈ V
3 Ds ← 0
4 return (D, A)
Algoritmo 9: Relaxamento de v.
Input :um grafo G = (V, E , w)a , (u, v) ∈ E , A, D
¡ ¢
1 if D v > D u + w (u, v) then
¡ ¢
2 D v ← D u + w (u, v)
3 Av ← u
a
Para o caso de G ser não-dirigido, deve-se realizar o relaxamento em (u, v) e (v, u) para uma aresta
{u, v} ∈ E , ou seja, deve-se realizar o relaxamento nos dois sentidos.
Lema 5.1.1. Dado um grafo ponderado G = (V, E , w), um caminho mínimo entre v 1 e v k
p 1i pi j p jk
Prova: Se o caminho p for decomposto em v 1 vi vj v k , têm-se w(p) = w(p 0 j )+
w(p i j ) + w(p j k ). Suponha que exista um caminho p i0 j de v i a v j com peso w(p i0 j ) <
p 1i p i0 j p jk
w(p i j ). Então, v 1 vi vj v k é um caminho de v 1 a v k cujo o peso w(p) = w(p 0 j )+
w(p i0 j ) + w(p j k ) é menor do que w(p), o que contradiz a hipótese de que p seja um
caminho mínimo de v 1 a v k .
44 Capítulo 5. Caminhos Mínimos
Prova: Suponha que p seja um caminho entre s e v. Então, p não tem peso maior do
que qualquer outro caminho de s a v. Especificamente, p não possui peso maior que o
caminho de s até o vértice u que utiliza a aresta/arco (u, v) para atingir o destino v.
Lema 5.1.3. Seja G = (V, E , w) um grafo ponderado dirigido ou não com a função de peso
(Algoritmo 8). Então, D v ≥ δ(s, v) para todo v ∈ V , e esse invariante é mantido para
qualquer sequência de etapas de relaxamentos em G (Algoritmo 9). Além disso, tão logo
Prova: Prova-se que o invariante D v ≥ δ(s, v) para todo o vértice v ∈ V por indução em
pois esse procedimento define que D v = ∞ para todo v ∈ V \{s}, ou seja, D v ≥ δ(s, v)
Para o passo da indução, considere o relaxamento de uma aresta/arco (u, v). Pela
¡ ¢
D v = D u + w (u, v)
Lema 5.1.2)
Para demonstrar que D v não se altera depois que D v = δ(s, v), por ter alcaçado seu
limite inferior, D v não pode diminuir porque D v ≥ δ(s, v) e não pode aumentar porque
Prova: Pela propriedade de limite superior (Lema 5.1.3), têm-se sempre ∞ = δ(s, v) ≤
momento antes do relaxamento da aresta/arco (u, v), então essa igualdade se mantém
¡ ¢
D v ≤ D u + w (u, v) pelo Corolário 5.1.4)
Pela propriedade do limite superior (Lema 5.1.3) D v ≥ δ(s, v), da qual concluímos
então D k = δ(s, v k ) depois desses relaxamentos e todas as vezes daí em diante. Essa
propriedade se mantém válida, não importa quais outros relaxamentos forem realizados.
Prova: Esta prova é realizada por indução, na qual têm-se D v i = δ(s, v i ) depois que o
após o relaxamento dessa aresta, têm-se D v = δ(s, v i ) e essa igualdade é mantida todas
origem, suponha que G não possua um ciclo de peso negativo que possa ser atingido por
s. Então, depois que o grafo G é inicializado (Algoritmo 8), o subgrafo dos predecessores
dade. Considere um subgrafo dos predecessores G π que surja depois de uma sequência
de etapas de relavamento.
Primeiro, prova-se que o subgrafo é acíclico. Suponha por contradição que alguma
supor que o relaxamento de arestas (v k−1 , v k ) criou o ciclo em G π . Afirma-se que todos
os vértices do ciclo c podem ser atingidos por s, pois cada um tem um predecessor não
nulo (null). Portanto, uma estimativa de caminho mínimo fora atribuída a cada vértice
em c quando um valor atribuídoo à A v não foi igual a null. Pela propriedade do limite
superior (Lema 5.1.3), cada vértice no ciclo c tem um peso de caminho mínimo infinito,
possui um ciclo negativo que possa ser atingido por s. Imediatamente antes da cha-
mudou desde então, ela diminuiu. Por essa razão, imediatamente antes da chamada de
relaxamento, têm-se
¡ ¢
D v i ≥ D v i −1 + w (v i −1 , v i ) ∀i ∈ {2, 3, . . . , k − 1} (5.5)
48 Capítulo 5. Caminhos Mínimos
gualdade estrita
¡ ¢
D v k > D v k−1 + w (v k−1 , v k ) . (5.6)
Mas,
k
X k
X
D vi = D v i −1 , (5.8)
i =2 i =2
já que cada vértice no ciclo c aparece exatamente uma vez em cada somatório. Esa
desigualdade implica
k
X ¡ ¢
0> w (v i −1 , v i ) . (5.9)
i =2
Agora, provamos que G π é acíclico. Para mostrar que ele forma uma árvore enraizada
vértices em Vπ são os que têm os valores A não null, e o vértice s. Aqui a ideia é provar a
Para concluir a prova do lema, deve-se mostrar agora que, para qualquer vértice v ∈
origem s ∈ V . Suponha que G não possua um ciclo de peso negativo que possa ser atingido
5.1. Propriedades de Caminhos Mínimos 49
atingidos por s. Por definição, um peso de caminho mínimo δ(s, v) é finito sse v pode ser
alcançado por s. Isso implica que os vértices atingidos por s possuem peso de caminho
finito. Porém, um vértice v ∈ V \{s} recebeu um valor finito para D v sse A v 6=null. Assim,
O Lema 5.1.7 define que após a inicialização, G π possui raiz em s e assim permanece
produz
k
X ¡ ¢
w(p) = w (v i −1 , v i )
i =2
k
δ(s, v i ) − δ(s, v i −1 )
X
≤
i =2 (5.10)
= δ(s, v k ) − δ(s, v 0 )
= δ(s, v k )
Assim w(p) ≤ δ(s, v k ). Visto que δ(s, v k ) é um limite inferior para o peso de qualquer
de s a v = v k .
50 Capítulo 5. Caminhos Mínimos
5.2 Bellman-Ford
// inicialização
1 D v ← ∞ ∀v ∈ V
2 A v ← null ∀v ∈ V
3 Ds ← 0
4 for i ← 1 to |V | − 1 do
5 foreach (u, v) ∈ E do
// relaxamento
¡ ¢
6 if D v > D u + w (u, v) then
¡ ¢
7 D v ← D u + w (u, v)
8 Av ← u
9 foreach (u, v) ∈ E do
¡ ¢
10 if D v > D u + w (u, v) then
11 return (false,null,null)
12 return (true, D, A)
5.2. Bellman-Ford 51
laços de repetição, há o laço mais externo que repete |V | − 1 vezes. Para cada repetição
desse laço, passa-se por cada aresta em E , logo esse primeiro conjunto de laços dita
ponha que G não possua nenhum ciclo de peso negativo que possa ser alcançado por
5.1.6). Considera-se que qualquer vértice v possa ser atingido por s e seja p = 〈v 1 , v 2 , . . . , v k 〉
de origem, supõe-se que G não tenha nenhum ciclo negativo que possa ser atingido
Prova: Se v ∈ V pode ser atingido por s, então existe uma aresta/arco (u, v). Então,
custo negativo, que pode ser alcançado de s, então o algoritmo retorna true, D v = δ(s, v)
raiz em s. Se G contém um ciclo de peso negativo que possa ser atingido por s, então o
Prova: Suponha que o grafo G não tenha um ciclo de peso negativo atingível por s.
Primeiro, prova-se que D v = δ(s, v) para todo v ∈ V . Se o vértice v pode ser atingido
por s, então o Lema 5.2.1 prova essa afirmação. Se v não pode ser atingido por s, a
juntamente com essa última afirmação implica que G π é uma árvore de caminhos
mínimos. Agora, usa-se a afirmação para mostrar que Bellman-Ford retorna true. No
D v = δ(s, v)
¡ ¢
= D u + w (u, v) ,
e, assim, nenhum dos testes na linha 10 serão verdadeiros e Bellamn-Ford retorna false.
Agora, suponha que o grafo G contenha o ciclo de peso negativo que possa ser
k
X ¡ ¢
w (v i −1 , v i ) < 0 (5.12)
i =2
5.3. Dijkstra 53
ciclo c têm-se
k
X k
X ¡ ¢ Xk k
X ¡ ¢
D vi ≤ D v i −1 + w (v i −1 , v i ) = D v i −1 + w (v i −1 , v i ) . (5.13)
i =2 i =2 i =2 i =2
k
X ¡ ¢
0≤ w (v i −1 , v i ) , (5.15)
i =2
Bellman-Ford retorna true se o grafo G não contém nenhum ciclo negativo que possa
5.3 Dijkstra
esse algoritmo, as arestas/arcos não devem ter pesos negativos. Então, a função de
mais eficiente que o do Bellman-Ford se for utilizada uma estrutura de dados adequada.
Quando esse vértice é selecionado, ele não é mais atualizado e sua distância é propagada
54 Capítulo 5. Caminhos Mínimos
1 D v ← ∞ ∀v ∈ V
2 A v ← null ∀v ∈ V
3 C v ← false ∀v ∈ V
4 Ds ← 0
5 while ∃v ∈ V (C v = false) do
7 C u ← true
11 Av ← u
12 return (D, A)
Ford. Seria utilizada uma operação do tipo “EXTRACT-MIN” no lugar da que está na
prioridade, não mais seria necessário. Poderia-se gravar sua distância mínima em uma
Para essa fila de prioridades, poderia se utilizar um Heap, como o Heap Binário,
Para essa aplicação, n = |V |. Utilizando essa estrutura de dados, sabe-se que no máximo
Prova: Usa-se a seguinte invariante de laço: no início de cada iteração do laço das
linhas 5 – 11, D v = δ(s, v) para todo v o qual C v =true. Para demonstrar isso, diz-se que
vez demonstrado isso, recorre-se à propriedade do limite superior (Lema 5.1.3) para
mente verdadeiro.
Manutenção:
Por contradição, seja u o primeiro vértice para o qual D u 6= δ(s, u) quando C u torna-
se true. O vértice u não pode ser s, pois D s = δ(s, v) = 0 nesse momento. Como u 6= s,
momento que C u se torna true. Para provar essa afirmação, observa-se que C x =true.
Então, u foi escolhido como primeiro vértice para o qual D u 6= δ(s, u) quando C u se
torna true, tínha-se D x = δ(s, x) quando C x se tornou true. A aresta/arco (x, y) foi
(Lema 5.1.5). Agora, pode-se obter uma contradição para provar que D u = δ(s, u). Como
D y = δ(s, y)
≤ δ(s, u) (5.16)
dá
D u = δ(s, u) quando C u se torna true e que essa igualdade é mantida até o término do
algoritmo.
Término:
(V, E , w) ponderado orientado ou não, sem ciclos de peso negativo, para o vértice de
s.
(Lema 5.1.8).
5.4 Floyd-Warshall
grafo G(V, E , w) ponderado dirigido ou não para todos os pares de vértices. O algoritmo
5.4. Floyd-Warshall 57
suporta arestas/arcos de pesos negativos, mas não opera em grafos com ciclos de peso
negativo.
de Floyd-Warshall.
0, se u = v,
³ ´
W G(V, E , w) = (5.18)
¡ ¢
uv w (u, v) , se u 6= v ∧ (u, v) ∈ E ,
∞,
se u 6= v ∧ (u, v) ∉ E .
de criar uma nova matriz e atualizar as distâncias de cada celula da nova matriz por |V |
2 foreach k ∈ {1, 2, . . . , |V |} do
¡ (k) ¢
3 seja D (k) = d uv uma nova matriz |V | × |V |
4 foreach u ∈ V do
5 foreach v ∈ V do
n o
(k) (k−1) (k−1) (k−1)
6 d uv ← min d uv , d uk + d kv
7 return D (|V |)
1
Para grafos não-dirigidos, deve-se preencher a matriz resultante de W (G) nas coordenadas (u, v) e
(v, u)
58 Capítulo 5. Caminhos Mínimos
computacional Θ(|V |2 ).
Prove que quando o Floyd-Warshall pára sobre uma entrada G = (V, E , w) ele retornará
predecessores Π, ou seja, uma matriz que indica o vértice anterior no caminho de cada
5.4. Floyd-Warshall 59
coordenada u, v.
Π(0)
¡ (0) ¢
2 uv ← πuv uma nova matriz |V | × |V |
3 foreach u ∈ V do
4 foreach v ∈ V do
5 if (u, v) ∈ E then
6 π(0)
uv ← u
7 else
8 π(0)
uv ← null
9 foreach k ∈ V do
¡ (k) ¢
10 seja D (k) = d uv uma nova matriz |V | × |V |
12 foreach u ∈ V do
13 foreach v ∈ V do
15 π(k) (k−1)
uv ← πkv
16 else
17 π(k) (k−1)
uv ← πuv
n o
(k) (k−1) (k−1) (k−1)
18 d uv ← min d uv , d uk + d kv
A impressão de cada caminho pode ser realizada através do Algoritmo 14, que
recebe como entrada a matriz de predecessores gerada pelo Algoritmo 13, um vértice de
mínimo de u a v.
Algoritmo 14: Print-Shortest-Path.
Input :a matriz dos predecessores Π, um vértice de origem u, um vértice de destino v
1 if u = v then
2 pr i nt (u)
3 else
6 else
8 pr i nt (v)
CAPÍTULO 6
Problemas de Travessia
arestas ou arcos. Cada estado pode ser considerado como uma solução candidata a
solução esperada. Nesses problemas, espera-se que haja um estado inicial (situação
inicial) que possa atingir um estado final através de um caminho em sucessivos estados
adjacentes. Depois do grafo representar o problema, seus estados e transições, uma das
buscas estudadas aqui podem ser utilizadas para localizar um estado final.
utilizados para realizar uma “travessia”. Se há uma função que avalia quais vértices
adjacentes aos já visitados são melhores, há a Best First Search ou Busca do Melhor
(pathfinding) é o A*, que utiliza duas funções (objetivo e heurística) para determinar
de qual vértice a busca deve continuar. Há várias buscas utilizadas para travessia que
É importante ressaltar que muitos dos problemas de travessia podem ter uma quan-
tamanho. Nesse caso, se não houver uma estratégia mais eficiente de busca, as buscas
seja, a execução pode demandar tempo mais elevado do que se pode aguardar para a
busca.
Alguns dos problemas aqui citados foram obtidos a partir de Mariani (2019).
sia.
O problema dos canibais e missionários assume que três canibais e três missionários
devem cruzar um rio, mas para isso possuem apenas um barco. Cada canibal e cada
missionário sabe conduzir o barco. O barco suporta apenas dois indivíduos. Ao lado de
cada margem, não poderá permanecer um número maior de canibais do que de missio-
nários, pois há uma alta probabilidade de que os canibais devorem o(s) missionário(s)
(MARIANI, 2019).
travessia, deve-se pensar sobre a representação de cada estado, de modo que parte-se
estados teria-se
©
(0, 0), (0, 1), (0, 2), (0, 3),
São ao todo 16 estados. O estado (3, 3) representa que três canibais e três missionários
estão do lado indesejado do rio, ou seja, representa o estado inicial. O estado (0, 0)
uma das margens do rio. Então, o subconjunto de estados {(2, 1), (3, 2), (3, 1)} não podem
ser admitidos, pois haveria um número maior de canibais que o número de missioná-
estados inadmissíveis {(2, 1), (3, 2), (3, 1), (1, 2), (0, 2), (0, 1)}. Todos os demais estados se-
V = {(0, 0), (0, 3), (1, 0), (1, 1), (1, 3), (2, 0), (2, 2), (2, 3), (3, 0), (3, 3)}.
seria o estado de destino. Considere também que v 1 = (α1 , β1 ) e v 2 = (α2 , β2 ). Para isso,
Com essas regras, o percurso a ser descoberto deve considerar. Seja i = 1, 2, 3 . . . a ordem
do passo para encontrar um caminho a partir do estado inicial, nos passos ímpares
deve-se seguir o arco em sua orientação original. Em passos pares, deve-se seguir um
Pode-se realizar a construção do grafo enquanto a busca ocorre. Para isso, considere
• 1 canibal;
• 1 missionário;
• 2 canibais;
• 2 missionários;
• 1 canibal e 1 missionário.
(3, 3, d ).
os quais não possuem qualquer marcação. O maior deles esta completamente cheio
enquanto que os outros dois estão vazios. Estamos interessados em dividir o vinho
em duas porções iguais de 4 litros, tarefa esta que pode ser realizada por transvasos
Uma quadrilha de 3 ladrões assalta um banco e foge com uma mala de dinheiro para
um aeroporto onde um avião pronto para decolar está à espera. O esconderijo é seguro,
mas a fuga é difícil porque o avião só comporta 170 kg. Só um dos ladrões sabe pilotar
e ele pesa 60 kg. O segundo, que é o guarda-costas do chefe, pesa 100 kg e o chefe
pesa 70 kg. O chefe teme que o piloto fuja com o dinheiro (que pesa 40 kg) se tiver
plano de fuga capaz de satisfazer a todos. Qual é esse plano (MARIANI, 2019)?
o qual comporta apenas duas pessoas. Como eles poderiam deslocar-se até o centro
considerando que nenhuma esposa deveria estar com um ou ambos os outros maridos
1
Para aqueles que quiserem mais detalhes sobre esse projeto, basta ler o artigo Da Silva Mendes, De
Santiago e Lamb (2018) ou conversar com o professor, coautor do trabalho
66 Capítulo 6. Problemas de Travessia
• E é o conjunto de arestas, na qual cada aresta conecta dois vértices (duas soluções)
ditos vizinhos. Para o trabalho, foi considerado que dois vértices são vizinhos se
Um grafo conexo é aquele no qual há um caminho entre todos os pares de vértices. É dita
têm-se u vev u.
Cormen et al. (2012) e apresentado aqui no Algoritmo 15. Nele, utiliza-se duas vezes
/* Chamar a DFS (do Algoritmo 16) para computar os tempos de término para
cada vértice */
1 (C , T, A 0 , F ) ← DFS(G)
2 A T ← {}
3 foreach (u, v) ∈ A do
5 G T ← (V, A T )
/* Chamar a DFS (do Algoritmo 16) alterado para que ele execute o laço da
6 (C T , T T , A 0T , F T ) ← DFS-adaptado(G T )
7 return A 0T
1 C v ← false ∀v ∈ V
2 T v ← ∞ ∀v ∈ V
3 F v ← ∞ ∀v ∈ V
4 A v ← null ∀v ∈ V
5 tempo ← 0
6 foreach u ∈ V do
7 if C u = false then
8 DFS-Visit(G, u, C , T , A, F , tempo)
9 return (C , T, A, F )
7.1. Componentes Fortemente Conexas 69
8 tempo ← tempo +1
9 F v ← tempo
Conexas
quantidade de instruções igual a Θ(|V |). O laço entre as linhas 6 a 8 é executado por
DFS-Visit é invocado apenas uma vez para cada vértice, graças ao vetor de visitados
xas
G = (V, E ), para quaisquer dois vértices u e v, exatamente uma das três condições é
70 Capítulo 7. Conectividade
válida:
Prova: A prova começará com o caso de Tu < T v . Para isso, consideramos dois subcasos:
T v < F u ou não. O primeiro subcaso ocorre quando T v < F u , portanto v foi descoberto
quando C u =true, ou seja, v foi descoberto mais recentemente que u, o que implica que
intervalo [Tu , F u ].
Como os intervalos são disjuntos, nenhum vértice foi descoberto enquanto o outro
ainda não havia findado (linha 9 do Algoritmo 17), então nenhum é descendente do
outro.
anterior.
profundidade para um grafo dirigido ou não G = (V, E ) sse Tu < T v < F v < F u .
Agora, supõe-se que v seja um descendente próprio de u, que ainda tem C v =false
tempo Tu . Visto que v pode ser descendente de u, todos os vértices w num caminho
modo que w seja um descendente de u. Pelo Corolário 7.1.2, F w < F u . Como v tem
que ser descoberto depois de u ser descoberto, mas antes de w ser terminado, têm-se
Tu < T v < F w < F u . Então o Teorema 7.1.1 implica que o intervalo [T v , F v ] está contido
• d (S) = minv∈S {T v };
• f (S) = maxv∈S {F v };
G = (V, A). Suponha que haja um arco (u, v) ∈ A, no qual u ∈ C e v ∈ C 0 . Então, f (C ) >
f (C 0 ).
72 Capítulo 7. Conectividade
Prova: Considera-se dois casos dependendo qual das componentes fortemente conexas
f (C 0 );
C 0 formado apenas por vértices z com C z =false. Pelo Teorema 7.1.3, todos os vértices
arco (u, v) de C a C 0 , o Lema 7.1.4 implica que não pode haver um caminho de C 0 a C .
grafo dirigido G = (V, A), suponha que havia um arco (u, v) ∈ A T , no qual u ∈ C e v ∈ C 0 .
Então, f (C ) < f (C 0 ).
Prova: Como (u, v) ∈ A T , têm-se (v, u) ∈ A. Visto que as componentes fortemente cone-
sua entrada.
7.2. Ordenação Topológica 73
No passo da indução, supõe-se que cada uma das k primeiras árvores de profundi-
(k + 1)-ésima árvore produzida. Seja u a raiz dessa árvore, e supondo que u esteja na
exceto C que ainda tenha de ser visitada. Pela hipótese de indução, no momento da
pelo Teorema 7.1.3, todos os outros vértices de C são descendentes de u nessa árvore
de profundidade. Além disso, pela hipótese de indução e pelo Corolário 7.1.6, qualquer
arco em G T que saem de C devem ir até componentes fortemente conexas que já foram
(V, A) e ordena linearmente todos os vértices tal que se existe um arco (u, v) ∈ A então
base uma busca em profundidade com a adição de uma lista O para inserir os vértices,
como pode ser visto no Algoritmo 19. Os vértices são inseridos sempre no início da lista
74 Capítulo 7. Conectividade
1 C v ← false ∀v ∈ V
2 T v ← ∞ ∀v ∈ V
3 F v ← ∞ ∀v ∈ V
4 tempo ← 0
5 O ← ()
6 foreach u ∈ V do
7 if C u = false then
8 DFS-Visit-OT(G, u, C , T , F , tempo, O)
9 return O
variável tempo ∈ Z+
∗ , uma lista O
1 C v ← true
2 tempo ← tempo +1
3 T v ← tempo
4 foreach u ∈ N + (v) do
5 if C u = false then
6 DFS-Visit-OT(G, u, C , T , F , tempo, O)
7 tempo ← tempo +1
8 F v ← tempo
9 O ← (v) ∪ O
7.2. Ordenação Topológica 75
Como a inserção no início de uma lista demanda tempo O(1), a complexidade de tempo
Lema 7.2.1. Um grafo dirigido G = (V, A) é acíclico sse uma busca em profundidade de
Prova: Supondo que uma busca em profundidade produza um arco de retorno (u, v).
Prova: Supondo que o algoritmo seja executado sobre um determinado grafo dirigido
acíclico G = (V, A) para determinar os tempos de término para seus vértices. É suficiente
a v, então F v < F u . Considere qualquer arco (u, v) explorado no algoritmo. Quando esse
arco é explorado, v ainda não foi visitado (por DFS-Visit-OT), já que v é ascendente
já deve ter C v =false ou já foi visitado. Se v tem C v =false, ele se torna um descendente
de u e F v < F u . Se v já foi visitado F v já foi definido, então F v < F u . Assim, para qualquer
arvore geradora mínima é aquele no qual busca-se encontrar uma árvore que conecte
todos os vértices do grafo G, tal que a soma dos pesos das arestas seja o menor possível.
Seja T uma árvore geradora, diz-se que o custo da árvore geradora de T é dado por
P ¡ ¢
w(T ) = {u,v}∈T w {u, v} .
Este capítulo apresenta dois métodos para encontrar árvores geradoras mínimas:
(V, E , w), esse método genérico encontra uma árvore geradora mínima.
uma aresta que pode ser adicionada a A sem violar a invariante de laço. A aresta segura
78 Capítulo 8. Árvores Geradoras Mínimas
1 A ← {}
5 return A
Teorema 8.1.1. Considere um grafo conexo não-dirigido ponderado G = (V, E , w). Seja
A ⊆ E uma árvore geradora mínima de G. Seja (S,V \S) qualquer conjunto de corte de G
que respeita A e seja {u, v} uma aresta leve1 que cruza (S,V \S), então {u, v} é uma aresta
segura para A.
Prova:
Seja T uma árvore geradora mínima que inclui A e suponha que T não contenha
a aresta leve {u, v}, pois se tiver, o processo termina. Constrói-se então outra árvore
geradora mínima T 0 que inclui A ∪ {u, v} usando uma técnica de recortar e colar,
© ª
Desde que u esteja em S e v em V \S, a aresta {u, v} forma um ciclo com as arestas
simples p e cruza o corte. Considere que {x, y} seja essa aresta de corte. A aresta {x, y}
não está em A, pois o corte respeita A. Desde que {x, y} está no único caminho de u a v
Depois, mostra-se que T 0 é uma árvore geradora mínima. Desde que {u, v} é uma
¡ ¢
aresta leve atravessando (S, S\V ) e {x, y} também atravessa esse corte, w {u, v} ≤
1
Arestas de baixo custo/peso.
8.2. Algoritmo de Kruskal 79
¡ ¢
w {x, y} . Por essa razão:
Mas, T é uma árvore geradora mínima, então w(T ) ≤ w(T 0 ). Desse modo, T 0 precisa ser
Falta mostrar que {u, v} é uma aresta segura para A. Têm-se A ⊆ T 0 , desde que A ⊆ T
componente conectado (uma árvore) na floresta G A = (V, A). Se {u, v} é uma aresta leve
Prova: O corte (VC ,V \VC ) respeita A e {u, v} é uma aresta leve para esse corte. Por essa
razão, {u, v} é uma aresta segura para A (com base no Teorema 8.1.1).
encontra uma aresta segura e a adiciona a uma floresta, que está sendo montada,
conectando duas árvores na floresta. Essa aresta {u, v} é de peso mínimo. Suponha
que C 1 e C 2 sejam duas árvores conectadas por uma aresta {u, v}. Visto que essa deve
ser uma aresta leve, o Corolário 8.1.2 implica que {u, v} é uma aresta segura para C 1 .
Kruskal é um algoritmo guloso, pois ele adiciona à floresta uma aresta de menor peso
2 a 4). Então, cria-se uma lista das arestas E 0 ordenadas por peso (linha 5). Depois,
iterativamente, se tenta inserir uma aresta leve em duas árvores que contém nodos não
foram conectadas ainda (linhas 7 a 9). Quando a inserção ocorre, a estrutura de dados
1 A ← {}
3 foreach v ∈ V do
4 S v ← {v}
6 foreach {u, v} ∈ E 0 do
7 if S u 6= S v then
8 A ← A ∪ {{u, v}}
9 x ← Su ∪ S v
10 foreach y ∈ x do
11 Sy ← x
12 return A
zada para implementar o mapeamento das árvores de cada vértice, ou seja, da estrutura
conjuntos disjuntos no Capítulo 21 de Cormen et al. (2012). Sabe-se que para ordenar o
árvore única. Essa árvore tem raízes em um vértice arbitrário r . Essa arbitrariedade
não gera problemas de corretudo no algoritmo, pois uma árvore geradora mínima deve
conter todos os vértices do grafo. A cada iteração, seleciona-se o vértice que é atingido
por uma aresta de custo mínimo (linha 7), sendo que o vértice selecionado adiciona
chave de menor custo, ou seja, o vértice conectado a árvore que possui o menor custo.
©
Antes de cada iteração do laço da linha 6, a árvore obtida é dada por {v, A v } : v ∈
ª
V \{r }\Q . Os vértices que já participam da solução final são V \Q. Além disso, para todo
v ∈ Q, se A v 6=null, então K v < ∞ e K v é o peso de uma resta leve {v, A v } que conecta o
vértice v a algum vértice que já está na árvore que está sendo construída. As linhas 7
© ª
deve-se criar o conjunto {v, A v } : v ∈ V \{r } .
Algoritmo 22: Algoritmo de Prim.
Input :um grafo G = (V, E , w)
2 A v ← null ∀v ∈ V
3 K v ← ∞ ∀v ∈ V
4 Kr ← 0
5 Q ← (V, K )
6 while Q 6= {} do
7 u ← arg minv∈Q {K v }
8 Q ← Q\{u}
9 foreach v ∈ N (u) do
¡ ¢
10 if v ∈ Q ∧ w {u, v} < K v then
11 Av ← u
¡ ¢
12 K v ← w {u, v}
13 return A
de Prim?
CAPÍTULO 9
Fluxo Máximo
O problema de fluxo máximo pode ser formalizado da seguinte forma: dado um grafo
capacidades dos arcos dadas por c no qual a soma total de fluxo que incide em t seja
máxima. Desse modo, o fluxo despachado em cada arco deve ser menor ou igual a sua
capacidade. O fluxo total que chega a um vértice v ∈ V − {s, t } deve ser o mesmo que
sai do vértice (sob pena de acúmulo de fluxo no vértice, que não tem reservatório para
fluxo).
Um exemplo de aplicação pode ser dado para um projeto de malha viária terrestre.
Imagine que G seja a malha de uma cidade nas quais os veículos entram em s e saiam
as capacidades de cada via (arcos). Exemplos de aplicação podem ser obtidos para
Uma rede de fluxo, no contexto da Teoria dos Grafos, é um grafo dirigido ponderado
¡ ¢ ¡ ¢
• Restrição de capacidade: para todo u, v ∈ V , 0 ≤ f (u, v) ≤ c (u, v) ;
X ¡ ¢ X ¡ ¢
f (v, u) = f (u, v) .
v∈V v∈V
¡ ¢
Quando (u, v) ∉ A, então f (v, u) = 0.
¡ ¢
A quantidade não negativa f (v, u) é denominada o fluxo do vértice u a v. O valor
P ¡ ¢ P ¡ ¢
de fluxo é dado por F = v∈V f (s, v) − v∈V f (v, s) , ou seja, o total de fluxo que
Quando (u, v), (v, u) ∈ A, deve-se remover (u, v) de A, adicionar um novo vértice
Uma rede residual consiste em um grafo G f = (V, A f , c f ) composto por arcos com
¡ ¢ ¡ ¢ ¡ ¢
capacidades c f (u, v) = c (u, v) − f (u, v) para todo arco A. Para cada arco (u, v) em
¡ ¢ ¡ ¢
A, têm-se um arco invertido em A f com capacidade c f (v, u) = f (u, v) . Se um arco
¡ ¢
(u, v) ∉ A, então c f (v, u) = 0. Desse modo, |A f | = 2|A|.
na rede residal G f . Ele aumenta o fluxo na rede sem ferir as restrições de capacidades
¡ ¢
impostas em c. A capacidade residual de p é c f (p) = min{c f (u, v) : (u, v) ∈ p}.
Lema 9.3.1. Seja G = (V, A, c) uma rede de fluxo com fonte s e sorvedouro em t , seja p
por
¡ ¢ c f (p) se(u, v) ∈ p,
f p (u, v) =
0 caso contrário.
Corolário 9.3.2. Seja G = (V, A, c) uma rede de fluxo, seja f um fluxo em G e seja p
Em uma das estratégias para se obter o fluxo máximo, busca-se caminhos aumentantes
iterativamente. Como saber que quando o algoritmo termina, têm-se realmente o fluxo
86 Capítulo 9. Fluxo Máximo
máximo? O teorema de fluxo máximo/corte mínimo diz que se não houver caminho
Lema 9.4.1. Seja G = (V, A, c) uma rede de fluxo com fonte s e sorvedouro em t , e seja
(S, T ) qualquer corte de G. O fluxo que passa pelo corte é igual a F (o valor do fluxo).
Corolário 9.4.2. O valor de qualquer fluxo em f em uma rede de fluxo G é limite superior
Teorema 9.4.3. Se f é um fluxo em uma rede de fluxo G = (V, A, c) com fonte s e sorve-
1. f é um fluxo máximo em G.
9.5 Ford-Fulkerson
arcos que podem alterar seu fluxo, consultando suas capacidades. O fluxo aumenta até
1 F ←0
4 F ← F + fp
5 foreach (u, v) ∈ p do
¡ ¢ ¡ ¢
6 c f (u, v) ← c f (u, v) − f p
¡ ¢ ¡ ¢
7 c f (v, u) ← c f (v, u) + f p
8 return F
9.5.1 Complexidade
máximo. A Figura 9.6.1 demonstra um exemplo de um pior caso. O tempo para encontrar
, ,99 ,
1,0 1,0 999 9 999
00, 000 00,
000 00, 000 1 1 1
v 1,0 v v
Figura 7 – Exemplo citado por Cormen et al. (2012) para demonstrar o pior caso quanto
a complexidade de tempo.
88 Capítulo 9. Fluxo Máximo
9.6 Edmonds-Karp
algoritmo Edmonds-Karp propõe uma pequena adaptação para superar esse problema.
20 return null
com a fonte s e o sorvedouro sendo t , então para todos os vértices, exceto s e t , a distância
9.6. Edmonds-Karp 89
aumento de fluxo.
(V, A, c) com a fonte s e o sorvedouro sendo t , então o número total de aumentos de fluxo
9.6.1 Complexidade
Como cada caminho aumentante pode ter um arco crítico1 , o número total de arcos
críticos é O(|V | · |A|). Como cada iteração do Ford-Fulkerson pode demandar passar por
Para pensar
Será que os arcos de retorno ainda fazem sentido para o algoritmo de Edmonds-Karp?
1
Considera-se arco crítico todo arco que define um fluxo para um caminho aumentante (que define o
valor de c f (p) em um caminho p).
90 Capítulo 9. Fluxo Máximo
1
d e
1
1
1 1 1 1
s a b c t
1
1
1 g 1
f h
.
CAPÍTULO 10
Emparelhamento
vértices bipartidos, e E é o conjunto de arestas. Considere que em cada aresta {x, y},
De acordo com Kleinberg e Tardos (2005), uma forma de resolver esse problema é
depois da adaptação.
92 Capítulo 10. Emparelhamento
s t
(a) (b)
Figura 9 – Exemplo citado por Kleinberg e Tardos (2005) na tranformaçao do grafo bipar-
tido não dirigido para um grafo dirigido e ponderado que, ao ser submetido
a um algoritmo de fluxo máximo, obtém-se o emparelhamento máximo.
9 return M
10.1.1.1 Complexidade
cional O(|V |+|E |). Supondo que utilizemos o algoritmo de Ford-Fulkerson para resolver
O(|A 0 ||V |). Analisando o Algoritmo 25, sabe-se que |A 0 | = |E | + |X | + |Y |. Então a com-
¡
plexidade de tempo em usar o algoritmo de Ford-Fulkerson é O |V | + |E | + (|E | + |X | +
¢ ¡ ¢
|Y |)|V | = O (|E | + |X | + |Y |)|V | = O(|E ||V | + |X ||V | + |Y ||V |) = O(|E ||V |).
Karp. Ele é demonstrado no Algoritmo 27. Para entender o algoritmo, devemos compre-
em X e o fim em um vértice livre em Y . É dito vértice livre, um vértice que não está em M .
(A\B ) ∪ (B \A).
1 D v ← ∞ ∀v ∈ V
2 mat e v ← null ∀v ∈ V
// tamanho do emparelhamento
3 m←0
5 foreach x ∈ X do
8 m ← m +1
8 D nul l ← ∞
9 while Q.empty() = false do
10 x ← Q.dequeue()
11 if D x < D nul l then
12 foreach y ∈ N (x) do
13 if D mat e y = ∞ then
14 D mat e y ← D x + 1
15 Q.enqueue(mat e y )
16 return D nul l 6= ∞
1 if x 6= null then
2 foreach y ∈ N (x) do
3 if D mat e y = D x + 1 then
5 mat e y ← x
6 mat e x ← y
7 return true
8 Dx ← ∞
9 return false
10 return true
96 Capítulo 10. Emparelhamento
10.1.2.2 Complexidade
esses caminhos, pode-se encontrar um ciclo que não pode ser excluído. Em 1965, Ed-
monds descobriu uma forma de resolver isso, mesclando os vértices desse ciclo recursi-
ponderados.
Input :um grafo não-dirigido e não-ponderado G = (V, E )
1 M v ← null ∀v ∈ V
2 C v ← false ∀v ∈ V
3 X v ← null ∀v ∈ V
4 S v ← false ∀v ∈ V
5 L v ← null ∀v ∈ V
8 C u ← true
9 A ← {}
10 X v ← null ∀v ∈ V
11 foreach {v, w} ∈ E do
12 if M w = null ∧ w 6= u then
13 Xv ← w
14 else
15 if M w ∉ {v,null} then
16 A ← A ∪ {(v, M w )}
17 S v ← false ∀v ∈ V
18 Q ← {u}
19 L u ← null
20 if X u 6= null then
21 AumentanteAlternante(G, u, M , X , L)
22 else
23 while Q 6= {} do
24 v ← selecione um vértice em Q
25 Q ← Q\{v}
26 foreach w ∈ V : L w =null∧(v, w) ∈ A do
27 Q ← Q ∪ {w}
28 Lw ← v
29 S M w ← true
30 if X w 6= null then
31 AumentanteAlternante(G, w, M , X , L)
32 Q ← {}
33 break
34 else
35 if S w = true then
36 Blossom(G, w)
37 return M
98 Capítulo 10. Emparelhamento
atribuídos aos vértices, sem que vértices adjacentes tenham a mesma cor. O problema
NP-Difícil o que significa que não existe um algoritmo executado em tempo polinomial
11.1 Aplicações
lelamente, mas certos pares de tarefas não podem ser processados ao mesmo
tarefas e as arestas ligam duas tarefas que não podem ser executadas no mesmo
coloração indicará qual comprimento de onda deve ser atribuído a cada um dos
n dispositivos.
subconjuntos de vértices.
1
Um conjunto independente maximal é um conjunto de vértices no qual cada vértice não está co-
nectado a cada outro, e não exista outro vértice no grafo que poderia pertencer a esse conjunto
conservando essa propriedade.
11.2. Algoritmo de Lawler 101
¡ ¢ 0
se S={},
OP T G = (S, E ) = n ³
ª¢´o
1 + minI ∈I(G) OP T G 0 = S\I , {u, v} ∈ E : u, v ∈ S\I
¡ ©
caso contrário.
número inteiro obtido por f (·). X f (S) possui o coloração mínima possível considerando
o subconjunto de vértices S.
12 return X 2|V | −1
11.2.1 Complexidade
O algoritmo demanda complexidade de tempo O(|V ||E |2.4423|V | ). Isso devido ao uso
10 if c = true then
11 remover todos os subconjuntos de X de S
© ª
12 R ←R ∪ X
13 return R
CAPÍTULO 12
Caminho Crítico
Método do Caminho Crítico (CPM - Critical Path Method) e a técnica de revisão e avalia-
ção de programa (PERT - Program Evaluation and Review Technique) são métodos para
Tanto para o CPM quanto para PERT, divide-se as fases de planejamento de projeto
da outra. A diferença entre elas é que CPM considera durações determinísticas para as
dade atual; (ii) quais atividades devem vir depois da atividade atual; e (iii) quais
Para responder as perguntas da segunda regra, pode-se ter que criar atividades fictícias
conflito de recorrência entre duas atividades, criando uma atividade inexistente com
duração que demanda 0 unidades de tempo (arcos tracejados), de acordo com Taha
(2006).
2 2
A
A
B B
1 3 1 3
2 2
B
B
1 3 1 3
A A
10 if c = true then
© ª
11 remover todos os subconjuntos de X de S R ← R ∪ X
12 return R
De acordo com Taha (2006), executam-se cálculos com o objetivo de encontrar a du-
ração total necessária para concluir o projeto e a classificação das atividades entre
críticas1 ou não-críticas.
Considerando que evento é um ponto no tempo em que algumas tarefas são con-
Forward-pass
vértice j , calcula-se
© ª
E j = maxv∈N − ( j ) E v + D v j . (12.1)
calculados.
Backward-pass
© ª
T j = minv∈N + ( j ) T v − D j v . (12.2)
Folgas
De acordo com Taha (2006), folgas ou flutuações são os tempos disponíveis dentro do
intervalo de tempo para uma atividade não crítica. Geralmente calcula-se a folga total e
a folga livre.
D i j . Ela representa o excesso de tempo definido desde a ocorrência mais cedo do vento
Agradeço o Prof. Antônio Carlos Mariani pelo apoio e suporte quando a disciplina de
CORMEN, T. H. et al. Algoritmos: teoria e prática. Rio de Janeiro: Elsevier, 2012. Citado
19 vezes nas páginas 5, 7, 19, 23, 25, 28, 41, 67, 68, 69, 77, 78, 80, 84, 85, 86, 87, 89 e 113.
Da Silva Mendes, R. F.; De Santiago, R.; Lamb, L. C. Novel parallel anytime a* for graph
and network clustering. In: 2018 IEEE Congress on Evolutionary Computation (CEC).
[S.l.: s.n.], 2018. p. 1–6. Citado na página 65.
De Lima, A. M.; CARMO, R. Exact Algorithms for the Graph Coloring Problem. Revista
de Informática Teórica e Aplicada, v. 25, n. 4, p. 57, 2019. ISSN 01034308. Citado na
página 101.
GIUSCA, B. Map of Konigsberg in Euler’s time showing the actual layout of the
seven bridges, highlighting the river Pregel and the bridges. 2005. Disponível em:
<https://en.wikipedia.org/wiki/Seven_Bridges_of_K%C3%B6nigsberg#/media/File:
Konigsberg_bridges.png>. Citado na página 32.
GROSS, J. T.; YELLEN, J. Graph Theory and Its Applications. FL: CRC Press, 2006. Citado
na página 31.
LAWLER, E. L. A note on the complexity of the chromatic number problem. Inf. Process.
Lett., v. 5, p. 66–67, 1976. Citado na página 100.
NETTO, P. O. B. Grafos: teoria, modelos, algoritmos. São Paulo: Edgard Blucher, 2006.
Citado 4 vezes nas páginas 12, 13, 16 e 64.
TAHA, H. A. Operations Research: An Introduction (8th Edition). Upper Saddle River, NJ,
USA: Prentice-Hall, Inc., 2006. ISBN 0131889230. Citado 4 vezes nas páginas 103, 104,
105 e 106.
APÊNDICE A
Revisão de Matemática Discreta
Conjuntos é uma coleção de elementos sem repetição em que a sequência não importa.
No Brasil, utilizamos a seguinte notação para enumerar todos os elementos de um
conjunto. Na Equação (A.1), é possível visualizar a representação de um conjunto
denominado A, formado pelos elementos e 1 , e 2 , . . ., e n . Devido ao uso da vírgula como
separador de decimais, usa-se formalmente o ponto-e-vírgula. Para essa disciplina,
podemos utilizar a vírgula como o separador de elementos em um conjunto, desde
que utilizados o ponto como separador de decimais1 . Para dar nome a um conjunto,
geralmente utiliza-se uma letra maiúscula ou uma palavra com a inicial em maiúscula.
© ª
A = e1; e2; . . . ; en (A.1)
• N = {♦, ♠, ♥, ♣};
• V = {a, e, i , o, u};
• G = {α, β, γ, δ, ², ζ, η, θ, ι, κ, λ, µ, ν, ξ, π, ρ, σ, τ, υ, φ, χ, ψ, ω};
• D = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.
A forma por descrição de propriedades utiliza-se de uma notação que evidencia a natu-
reza de cada elemento pela descrição de um em um formato genérico. Por exemplo o
conjunto D, descrito na Equação (A.2), denota um conjunto com os mesmos elementos
em {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.
. Então para que complicar utilizando uma notação não enumerativa? Por dois motivos:
por questões de simplicidade, dado a quantidade de conjuntos; ou para representar
conjuntos infinitos, como no exemplo dos inteiros pares Pares = {x ∈ Z|x ≡ 0( mod 2)}.
1
Nas anotações
© presentesªnesse documento, utiliza-se a “notação americana”. Para a Equação (A.1) ,
teria-se A = e 1 , e 2 , . . . , e n .
112 Apêndice A. Revisão de Matemática Discreta
Para o conjunto dos pares, ainda podemos utilizar uma descrição mais informal, mas
que é dependente da conhecimento sobre a linguagem Portuguesa: Pares = {x ∈ Z| x é
inteiro e par }.
Para denotar a cardinalidade (quantidade de elementos) de um conjunto, utilizamos
o símbolo “|”. Para os conjuntos apresentados acima, é correto afirmar que:
• |N | = 4;
• |V | = 5;
• |R| = 3;
• |D| = 10;
• |Pares| = ∞.
A cardinalidade pode ser utilizada para identificar quantos símbolos são necessários
para representar um elemento. Por exemplo, |12, 66| = 5
Para denotar conjuntos vazios, adota-se duas formas de representação: {} ou ;.
Utilizando o operador de cardinalidade, têm-se |{}| = |;| = 0.
Como principais operações entre conjuntos, pode-se destacar:
• União (∪): união de dois conjuntos. Exemplo: {1, 2, 3, 4, 5}∪{2, 4, 6, 8} = {1, 2, 3, 4, 5, 6, 8};
• Produto cartesiano (×): Exemplo {1, 2, 3}×{A, B } = {(1, A), (2, A), (3, A), (1, B ), (2, B ), (3, B )};