Todos os direitos reservados e protegidos pela Lei 9 610 de 19/02/1998
Nenhuma parte deste livro, sem autorização prévia por escrito da editora, poderá ser reproduzida ou transmitida sejam quais forem os meios empregados: eletrônicos, mecânicos, fotográficos, gravação ou quaisquer outros
ISBN: 978-85-352-8884-1
ISBN (versão digital): 978-85-352-8885-8
Copidesque: Augusto Coutinho
Desenvolvimento de eBook: Loope - design e produções digitais | www loope com br
Elsevier Editora Ltda Conhecimento sem Fronteiras
Rua da Assembléia, no 100 – 6oandar 20011-904 – Centro – Rio de Janeiro – RJ
Rua Quintana, 753 – 8oandar 04569-011 – Brooklin – São Paulo – SP
Serviço de Atendimento ao Cliente 0800 026 53 40 atendimento1@elsevier com
Consulte nosso catálogo completo, os últimos lançamentos e os serviços exclusivos no site www elsevier com br
NOTA
Muito zelo e técnica foram empregados na edição desta obra No entanto, podem ocorrer erros de digitação, impressão ou dúvida conceitual Em qualquer das hipóteses, solicitamos a comunicação ao nosso serviço de Atendimento ao Cliente para que possamos esclarecer ou encaminhar a questão Para todos os efeitos legais, nem a editora, nem os autores, nem os editores, nem os tradutores, nem os revisores ou colaboradores, assumem qualquer responsabilidade por qualquer efeito danoso e/ou malefício a pessoas ou propriedades envolvendo responsabilidade, negligência etc de produtos, ou advindos de qualquer uso ou emprego de quaisquer métodos, produtos, instruções ou ideias contidos no material aqui publicado
CIP-BRASIL CATALOGAÇÃO NA PUBLICAÇÃO
SINDICATO NACIONAL DOS EDITORES DE LIVROS, RJ
S998t
Szwarcfiter, Jayme Luiz Teoria Computacional de Grafos / Jayme Luiz Szwarcfiter – 1 ed – Rio de Janeiro : Elsevier, 2018 il
Inclui índice
ISBN 978-85-352-8884-1
1 Ciência da computação 2 Programação (Computadores) 3 Algorítimos
4 Estruturas de dados (Computação) I Título
18-47019
CDD:005 1
CDU:004 41
grafos é realizado através dos seus algoritmos, cujo desenvolvimento, análise de corretude e de complexidade, e implementação são considerados.
Aqui lembramos também de um coautor do Jayme, o famoso pesquisador Donald E. Knuth, que fundamentou a análise rigorosa da complexidade computacional de algoritmos: “Ciência é o que nós entendemos bem o suficiente para explicar para um computador, e Arte é todo o resto que nós fazemos.”Nosso professor emérito Jayme Luiz Szwarcfiter nos ensina como a Matemática transforma arte em ciência, e o seu livro é inspiração e incentivo a todos aqueles que acreditam na universidade brasileira.
Universidade Federal do Rio de Janeiro (UFRJ)
Celina M. Herrera de Figueiredo PESC/COPPE
Apresentação às Implementações
Na reformulação deste livro, além da ampliação do conjunto de algoritmos estudados, implementações dos algoritmos foram incluídas ao final de cada capítulo. Apesar do estudo dos algoritmos através de linguagens em pseudocódigo possuir as vantagens de evidenciar o método de solução e omitir detalhes operacionais requeridos pelas linguagens de programação, a apresentação de implementações é uma importante complementação. Os benefícios de se dispor de implementações se estendem tanto do ponto de vista didático e acadêmico, quanto profissional. No primeiro grupo, estudantes, docentes e pesquisadores, com objetivos diferentes, podem usufruir dos resultados obtidos pelos programas. No segundo grupo, programadores, analistas e profissionais da computação, de um modo geral, podem aplicar diretamente a implementação já pronta e descrita neste texto.
As implementações são apresentadas como última seção de cada capítulo de modo a permitir que sejam consultadas seletivamente. Tal separação é conveniente tanto ao leitor interessado nas discussões pertinentes à implementação, como àqueles com interesse puramente teórico nos algoritmos.
A linguagem escolhida para as implementações foi Python, em sua versão 3.4.3, recente no momento da preparação deste livro. Python é uma linguagem cuja utilização está em larga expansão, tanto na indústria quanto na academia, sendo utilizada modernamente como linguagem introdutória à computação nas mais importantes universidades. Pode-se explicar o sucesso de Python por sua sintaxe simples e, ao mesmo tempo, de grande poder de expressão. Esta última característica é em particular conveniente para o propósito de diminuir a distância entre o pseudocódigo e o programa. Dada sua popularidade, supõe-se neste texto que Python seja uma linguagem familiar ao leitor. Se este não for o caso, o subconjunto de recursos utilizados de Python é intencionalmente mantido pequeno e, com a ajuda de algum texto de referência que introduza a linguagem, pode-se facilmente acompanhar as implementações. Tais implementações são apresentadas de forma similar aos respectivos algoritmos em pseudocódigo, procurando
2.12 Notas Bibliográficas
3 Técnicas Básicas
3.1 Introdução
3.2 Processo de Representação
3.3 Adjacências
3.4 Ordenação de Vértices ou Arestas
3.5 Coloração Aproximada
3.6 Ordenação Topológica
3.7 Recursão
3.8 Árvores de Decisão
3.9 Limite Inferior para Ordenação
3.10 Programas em Python
3.10.1 Algoritmo 3.3: Coloração Aproximada
3.10.2 Algoritmo 3.4: Ordenação Topológica
3.11 Exercícios
3.12 Notas Bibliográficas
4 Buscas em Grafos
4.1 Introdução
4.2 Algoritmo Básico
4.3 Busca em Profundidade
4.4 Biconectividade
4.5 Busca em Profundidade – Digrafos
4.6 Componentes Fortemente Conexas
4.7 Busca em Largura
4.8 Busca em Largura Lexicográfica
4.9 Reconhecimento dos Grafos Cordais
4.10 Busca Irrestrita
4.11 Programas em Python
4.11.1 Algoritmo 4.2: Busca em Profundidade
4.11.2 Algoritmo 4.4: Busca em Profundidade em Digrafos
4.12 Busca em largura lexicográfica e não lexicográfica
4.13 Busca em largura lexicográfica com rotulação de vértices
4.14 Grafo não cordal
4.15 Prova do Teorema 4.7
4.16 Prova do Teorema 4.9
4.17 Prova do Lema 4.10
4.18 Reconhecimento de esquemas de eliminação perfeita
4.19 Correção: esquemas de eliminação perfeita
4.20 Ciclicidade
4.21 Busca irrestrita em profundidade de raiz a
4.22 O subgrafo proibido
5.1 Um grafo com pesos nas arestas
5.2 Algoritmo de árvore geradora mínima
5.3 Prova do Lema 5.2
5.4 Sequência de Fibonacci, para n ≤ 9
5.5 Um particionamento de uma árvore
5.6 Um particionamento ótimo
5.7 Construção de P(v,j)
5.8 Construção de P(v,3), sendo k = 4
5.9 Dados para o cálculo de p(v,3)
5.10 Cálculo de p(v,3)
5.11 A subárvore parcial Tv i
5.12 O exemplo correspondente à Figura 5.13
5.13 Tabela de solução do problema da Figura 5.12, com k = 3
5.14 Operação de condensação
5.15 Os grafos α e β
5.16 Determinação do número cromático
6.1 Fluxo em redes
6.2 Fluxos maximal e máximo
6.3 Prova do Lema 6.1
6.4 Redes residuais
6.5 Um caso ruim para o Algoritmo 6.1
6.6 Esquema de uma rede de camadas
6.7 Rede de camadas para o fluxo da Figura 6.1(a)
6.8 Entrada para o exemplo da Figura 6.9
6.9 Um exemplo do Algoritmo 6.3
6.10 Um exemplo do algoritmo de fluxo maximal
6.11 Sugestão do Exercício 6.5
7.1 Um grafo e sua matriz de distâncias
7.2 Árvore de caminhos mínimos
7.3 Exemplo para o algoritmo de Dijkstra
7.4 Teorema 7.1
7.5 Cálculo de c(ℓ,k)
7.6 Exemplo para o algoritmo de Bellman-Ford
7.7 Matriz Wk 1
7.8 Exemplo para o algoritmo de Floyd
7.9 Computação das matrizes da Figura 7.8
7.10 Exemplo para desvios
7.11 Equação (∗)
7.12 Exemplo para o Algoritmo 7.4
7.13 Desvio simples relativo a Ci(j)
7.14 O grafo D+
7.15 Exemplo para Algoritmo 7.6
8.1 Emparelhamentos maximal e máximo
8.2 Emparelhamento perfeito
8.3 Caminhos alternante e aumentante
8.4 Aplicação do Lema 8.1
8.5 Exemplo de aplicação do Algoritmo 8.1
8.6 Floresta M-alternante
8.7 Floresta húngara
8.8 Emparelhamentos e cobertura ponderados
8.9 Um exemplo de aplicação do Algoritmo 8.3
8.10 Exemplo de emparelhamentos em grafo não bipartido
8.11 Ciclos par (a) e ímpar (b) em passeios
técnica em questão. Para cada um desses algoritmos, é efetuado um estudo de sua validade e determinada a sua complexidade. No espírito acima são apresentados os Capítulos 3, 4 e 5, onde técnicas em grafos e algoritmos de aplicação encontram-se entremeados. O Capítulo 3 descreve várias técnicas elementares. O seguinte contém um estudo detalhado de busca em grafos—métodos dos mais empregados em problemas algorítmicos. O Capítulo 5 inclui a apresentação de técnicas utilizadas em otimização combinatória. O Capítulo 6 é dedicado ao problema do fluxo máximo. Sua solução emprega diversos conceitos examinados no decorrer do texto. Além disso, é uma ilustração didática do estudo de complexidade. O Capítulo 7 é dedicado ao importante problema da determinação de caminhos mínimos em grafos, onde diversas variantes do problema são apresentadas. O Capítulo 8 contém algoritmos para resolver o problema do emparelhamento em grafos. O último capítulo descreve os princípios da teoria do NP-completo. Sua apresentação se desenvolve de modo a prescindir do leitor conhecimentos especializados em teoria da computação. A formulação utilizada representa uma tentativa de tornar mais simples a compreensão do assunto, preservando, contudo, o seu caráter matemático. A vasta aplicação da teoria do NPcompleto em algoritmos para grafos torna quase obrigatória a sua inclusão em um livro desta natureza.
Após cada capítulo, é apresentada uma lista de exercícios, de dificuldade variada. O objetivo, naturalmente, é auxiliar o estudante no aprendizado. Em alguns capítulos, os últimos exercícios foram retirados de concursos, exames de capacitação ou universidades. Em particular, aqueles referenciados como UVA são originários da Universidade de Valladolid, Espanha.
A bibliografia referenciada, em geral, é mais abrangente do que o texto. Contudo, este fato é proveitoso para leitores que desejam se aprofundar nos temas abordados. Além disso, pode ser utilizada como fonte para pesquisa bibliográfica na área. Ênfase especial foi dada à bibliografia em língua portuguesa.
Conforme mencionado, além da descrição dos algoritmos, o livro contém suas implementaçoes na linguagem Python. Assim, o texto pode ser utilizado tanto pelo leitor interessado nos aspectos mais teóricos desses processos, como por aquele que visa a utilização prática dos algoritmos. Todas as implementações foram simuladas e testadas com entradas diversas.