Teoria computacional de grafos: os algoritmos com programas python 1st edition jayme luiz szwarcfite

Page 1


https://ebookmass.com/product/fruit-juices-extraction-compositionquality-and-analysis-gaurav-rajauria/

ebookmass.com

Attention, Not Self Jonardon Ganeri

https://ebookmass.com/product/attention-not-self-jonardon-ganeri/

ebookmass.com

It's My Life Stacie Ramey

https://ebookmass.com/product/its-my-life-stacie-ramey/

ebookmass.com

Misterio en Craven house 1ª Edition Camila Winter

https://ebookmass.com/product/misterio-en-craven-house-1a-editioncamila-winter/

ebookmass.com

Groups: A Counseling Specialty 7th Edition, (Ebook PDF)

https://ebookmass.com/product/groups-a-counseling-specialty-7thedition-ebook-pdf/

ebookmass.com

https://ebookmass.com/product/bank-investing-a-practitioners-fieldguide-suhail-chandy-and-weison-ding/

ebookmass.com

© 2018, Elsevier Editora Ltda

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.11.3 Algoritmo 4.5: Componentes Fortemente Conexas

4.11.4 Algoritmo 4.6: Busca em Largura

4.11.5 Algoritmo 4.7: Busca em Largura Lexicográfica

9 Problemas NP-Completos

9.1 Introdução

9.2 Problemas de Decisão

9.3 A Classe P

9.4 Alguns Problemas Aparentemente Difíceis

9.5 A Classe NP

9.6 A Questão P = NP

9.7 Complementos de Problemas

9.8 Transformações Polinomiais

9.9 Alguns Problemas NP-Completos

9.10 Restrições e Extensões de Problemas

9.11 Algoritmos Pseudopolinomiais

9.12 Complexidade de um Problema Numérico

9.13 Programas em Python

9.13.1 Algoritmo 9.1: Subconjunto Soma

9.14 Exercícios

9.15 Notas Bibliográficas

Referências

Posfácio

Notação

Conjuntos

s ∈ S s é elemento do conjunto S.

S ⊆ R conjunto S é subconjunto do conjunto R.

S ⊂ R conjunto S é subconjunto próprio do conjunto R.

∅ conjunto vazio.

S ∪ R união dos conjuntos S e R.

S ∩ R interseção dos conjuntos S e R.

S − R diferença do conjunto S para R.

S × R produto cartesiano dos conjuntos S e R.

|S| cardinalidade do conjunto S.

S∆R diferença simétrica entre os conjuntos S e R.

Funções

f : S → R f é uma função de domínio S e contradomínio R.

f(s) valor da função f para o argumento s.

Índice de Algoritmos

1.1 Inversão de uma sequência

1.2 Ordenação de uma sequência (básico)

1.3 Ordenação de uma sequência

2.1 Determinação do centro de uma árvore

3.1 Estrutura de adjacências de um digrafo

3.2 Coloração aproximada

3.3 Coloração aproximada

3.4 Ordenação topológica

4.1 Busca geral

4.2 Busca em profundidade (utilizando pilha)

4.3 Busca em profundidade (recursivo)

4.4 Busca em profundidade em digrafos

4.5 Componentes fortemente conexas de um digra9

4.6 Busca em largura

4.7 Busca em largura lexicográfica

4.8 Busca irrestrita em profundidade (utilizando pilha)

4.9 Busca irrestrita em profundidade (recursivo)

5.1 Árvore geradora mínima

5.2 Particionamento de árvores

5.3 Determinação do número cromático χ de um grafo

6.1 Fluxo máximo em uma rede (Ford e Fulkerson)

6.2 Construção da rede de camadas D∗(f)

6.3 Fluxo máximo em uma rede (Dinic)

7.1 Caminhos mínimos – Dijkstra

7.2 Caminhos mínimos: Bellman-Ford

7.3 Caminhos mínimos: Floy

7.4 k-ésimos caminhos mínimo 199

7.5 k-ésimos caminhos simples mínimo

7.6 Detecção de ciclos negativo 206

8.1 Emparelhamento cardinalidade máxima – Grafos bipartido

8.2 Emparelhamento cardinalidade máxima – Método Húngar

8.3 Emparelhamento ponderado máximo – Grafos bipartido

8.4 Emparelhamento em grafos gerai

9.1 Subconjunto Som

Índice de Programas

1.1 Inversão de uma sequência

1.2 Ordenação de sequências

2.1 Determinação do centro de uma árvore

3.1 Coloração aproximada

3.2 Ordenação topológica

4.1 Busca em profundidade (utilizando pilha)

4.2 Busca em profundidade em digrafos

4.3 Componentes fortemente conexas de um digrafo

4.4 Busca em largura

4.5 Busca em largura lexicográfica

4.6 Busca irrestrita em profundidade (utilizando pilha)

5.1 Árvore geradora mínima

5.2 Particionamento de árvores

5.3 Determinação do número cromático χ de um grafo

6.1 Fluxo máximo em uma rede (Ford e Fulkerson)

6.2 Fluxo máximo em uma rede de camadas

7.1 Caminhos mínimos - Dijkstra

7.2 Caminhos mínimos - Bellman-Ford

7.3 Caminhos mínimos - Floyd

7.4 k-ésimos caminhos mínimos

7.5 k-ésimos caminhos simples mínimos

7.6 Detecção de ciclos negativos

8.1 Emparelhamento cardinalidade máxima - Grafos bipartidos

8.2 Emparelhamento cardinalidade máxima - Método Húngaro

8.3 Emparelhamento ponderado máximo - Grafos bipartidos

8.4 Emparelhamento em grafos gerais 251

9.1 Subconjunto Soma 295

4.10 Tipos de arestas na busca em largura

4.11 Uma busca em largura

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.

Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.