O documento fornece uma introdução sobre grafos, definindo seus principais conceitos como vértices, arestas e tipos de grafos. Explica as representações de grafos por matrizes de adjacência e listas de adjacência e apresenta os algoritmos de busca em largura e profundidade como aplicações importantes de grafos.
Laboratório de Programação II: Grafos - Matriz de adjacência e Matriz de inci...Alex Camargo
Este documento discute as representações de grafos usando matrizes de adjacência e incidência. Explica o que são grafos, vértices e arestas. Também apresenta exemplos de grafos e como representá-los usando matrizes de adjacência e incidência.
Slides da disciplina de Análise de Algoritmos, ministrada pelo Prof. Marcelo H. Carvalho no curso de Pós-Graduação em Ciência da Computação, FACOM - UFMS.
O documento discute os conceitos e objetivos da normalização de banco de dados, incluindo dependências funcionais, formas normais e como dividir tabelas para eliminar redundâncias e anomalias.
O documento descreve o modelo relacional de bancos de dados, representando os dados como uma coleção de tabelas e relacionamentos. Explica como definir atributos, domínios, chaves primárias e estrangeiras no modelo, e como representá-lo graficamente usando ferramentas como o MySQL Workbench.
Banco de Dados II: Conversão do Modelo Conceitual para o Modelo Lógico (aula 6)Gustavo Zimmermann
A aula aborda a conversão do modelo conceitual para o modelo lógico de banco de dados, discutindo diferentes notações para modelagem conceitual e lógica e tipos de dados no MySQL. Exemplos ilustram como representar entidades, atributos, relacionamentos e cardinalidades nos diagramas de tabelas do modelo lógico.
GUIA DE REFERÊNCIA RÁPIDA
Como resumo de todo o código HTML apresentado até agora, deixo algumas tabelas de referência rápida que podem ser até impressas e guardadas no bolso.
O documento discute recursividade e apresenta alguns conceitos e exemplos. Em três frases:
A recursividade é uma forma de resolver problemas dividindo-os em subproblemas menores da mesma natureza até chegar a um caso trivial. Isso é ilustrado com exemplos como o cálculo fatorial e a multiplicação usando somas sucessivas. A implementação de funções recursivas no computador usa uma pilha de execução para gerenciar os chamados recursivos.
Este documento descreve as tabelas hash, incluindo:
1) Uma tabela hash mapeia chaves para valores usando uma função hash;
2) Funções hash mapeiam chaves para índices de uma tabela para permitir buscas rápidas;
3) Colisões ocorrem quando chaves diferentes mapeiam para o mesmo índice e devem ser tratadas.
Laboratório de Programação II: Grafos - Matriz de adjacência e Matriz de inci...Alex Camargo
Este documento discute as representações de grafos usando matrizes de adjacência e incidência. Explica o que são grafos, vértices e arestas. Também apresenta exemplos de grafos e como representá-los usando matrizes de adjacência e incidência.
Slides da disciplina de Análise de Algoritmos, ministrada pelo Prof. Marcelo H. Carvalho no curso de Pós-Graduação em Ciência da Computação, FACOM - UFMS.
O documento discute os conceitos e objetivos da normalização de banco de dados, incluindo dependências funcionais, formas normais e como dividir tabelas para eliminar redundâncias e anomalias.
O documento descreve o modelo relacional de bancos de dados, representando os dados como uma coleção de tabelas e relacionamentos. Explica como definir atributos, domínios, chaves primárias e estrangeiras no modelo, e como representá-lo graficamente usando ferramentas como o MySQL Workbench.
Banco de Dados II: Conversão do Modelo Conceitual para o Modelo Lógico (aula 6)Gustavo Zimmermann
A aula aborda a conversão do modelo conceitual para o modelo lógico de banco de dados, discutindo diferentes notações para modelagem conceitual e lógica e tipos de dados no MySQL. Exemplos ilustram como representar entidades, atributos, relacionamentos e cardinalidades nos diagramas de tabelas do modelo lógico.
GUIA DE REFERÊNCIA RÁPIDA
Como resumo de todo o código HTML apresentado até agora, deixo algumas tabelas de referência rápida que podem ser até impressas e guardadas no bolso.
O documento discute recursividade e apresenta alguns conceitos e exemplos. Em três frases:
A recursividade é uma forma de resolver problemas dividindo-os em subproblemas menores da mesma natureza até chegar a um caso trivial. Isso é ilustrado com exemplos como o cálculo fatorial e a multiplicação usando somas sucessivas. A implementação de funções recursivas no computador usa uma pilha de execução para gerenciar os chamados recursivos.
Este documento descreve as tabelas hash, incluindo:
1) Uma tabela hash mapeia chaves para valores usando uma função hash;
2) Funções hash mapeiam chaves para índices de uma tabela para permitir buscas rápidas;
3) Colisões ocorrem quando chaves diferentes mapeiam para o mesmo índice e devem ser tratadas.
O documento discute os conceitos de cardinalidade e grau em relacionamentos entre entidades em bancos de dados. Explica que a cardinalidade indica quantas instâncias de uma entidade podem se relacionar com outra e define cardinalidades mínima, máxima e tipos como 1:1, 1:N e N:N. Também define grau de relacionamento como binário ou ternário dependendo do número de entidades envolvidas.
Este documento describe y compara varios sistemas gestores de bases de datos relacionales. Explica que un SGBD sirve de interfaz entre la base de datos, el usuario y las aplicaciones. Luego describe características clave de SGBDs como PostgreSQL, MySQL, Oracle y SQL Server.
O documento descreve os principais componentes necessários para configurar um servidor WEB, incluindo o servidor Apache, banco de dados MySQL, linguagem PHP e o sistema de gerenciamento de conteúdo WordPress. O CentOS é recomendado como sistema operacional de servidor e a combinação desses softwares livres (LAMP) permite criar sites dinâmicos e de alto desempenho.
O documento discute conceitos de complexidade de algoritmos, incluindo análise empírica e matemática de algoritmos. Apresenta exemplos de como contar instruções em algoritmos e discute a complexidade de casos como melhor caso, pior caso e caso médio.
Banco de Dados - Transações e Controle de ConcorrênciaJuliano Padilha
O documento discute transações e controle de concorrência em bancos de dados. Explica o que são transações, suas propriedades ACID e estados. Também aborda o controle de concorrência, escalonamento serializável, bloqueios, e problemas clássicos como atualização perdida e leitura suja.
O documento discute algoritmos, definindo-os como um conjunto de regras para solução de problemas. Apresenta etapas para construção de algoritmos, como definir entrada, processamento e saída de dados. Descreve diferentes tipos de algoritmos como descrição narrativa, pseudocódigo e fluxograma. Por fim, fornece exemplos e exercícios para fixação dos conceitos.
Construir microservices em python nunca foi tão simples como com o Nameko!Flávio Pimenta
Uma empresa desejava iniciar o desenvolvimento de APIs e microserviços em Python. Após analisar três frameworks (Django REST Framework, Flask e Nameko), o documento conclui que o Nameko é o mais adequado por ser um framework moderno e consolidado para construção de microserviços, trazendo suporte nativo para comunicação entre serviços de forma simples e performática.
Objetivo: Capacitar al estudiante para que sepa decidir la técnica de replicación más apropiada para una mejor disponibilidad y rendimiento de las operaciones sobre una base de datos.
Este documento describe diferentes tipos de listas como estructuras de datos, incluyendo listas simples, doblemente enlazadas, circulares y circulares doblemente enlazadas. Cada tipo tiene características únicas como la dirección de los punteros y la capacidad de recorrer la lista. Las listas ofrecen ventajas como la eficiencia de inserción, eliminación y acceso a elementos, dependiendo del tipo y de los requisitos del programa.
O documento discute o modelo lógico de dados, que leva em conta limitações e implementa padrões e nomenclaturas para definir chaves primárias e estrangeiras. O modelo lógico descreve as estruturas de dados que serão armazenadas no banco de dados e resulta em uma representação gráfica dos dados de forma lógica. A técnica mais comum é a abordagem entidade-relacionamento, representada por diagramas.
Este documento apresenta os principais conceitos de bancos de dados relacionais e o Sistema Gerenciador de Banco de Dados (SGBD) SQL. Ele discute a modelagem de dados, tipos de chaves e dados, e fornece exemplos dos principais comandos SQL como CREATE DATABASE, CREATE TABLE, ALTER TABLE e DROP TABLE. O documento visa ensinar os fundamentos teóricos e práticos de bancos de dados relacionais e SGBDs para estudantes.
O documento discute o Modelo de Entidade e Relacionamento (MER), que descreve entidades, atributos e relacionamentos de um banco de dados. O MER deve representar os dados e relacionamentos de forma próxima à visão do usuário. Ele inclui entidades como alunos, professores e disciplinas, com atributos como nome, data de nascimento e matrícula. O BrModelo é uma ferramenta para criar MERs.
Devido ao aumento da quantidade de dados, começaram a surgir demandas de escalabilidade e a necessidade de se trabalhar com dados de forma mais flexível do que as regras do modelo relacional. Em 2009, surgiu o termo NoSQL. Este novo modelo, faz referência a várias soluções desenvolvidas que caracterizam-se por ter esquema flexível, executar de forma distribuída e geralmente possuir o código aberto.
Este documento apresenta um minicurso introdutório ao sistema operacional Linux. O minicurso aborda conceitos básicos do Linux, como distribuições, ambientes gráficos e estrutura de diretórios. Além disso, ensina sobre instalação de pacotes, shell scripting, administração do sistema e configuração de rede através da resolução de problemas.
Este documento apresenta os conceitos fundamentais de estruturas de dados, incluindo:
1. Tipos de dados primitivos e estruturados em Pascal como inteiros, caracteres e registros.
2. O conceito de Tipo Abstrato de Dados (TAD) como um modelo matemático acompanhado de operações.
3. As estruturas de dados pilha, fila e lista sequencial implementadas em Pascal, mostrando sua declaração, procedimentos e funções.
4. O uso de apontadores e alocação dinâmica de
O documento descreve os principais conceitos do modelo entidade-relacionamento (ER) para modelagem de dados, incluindo entidades, atributos, tipos de entidades, relacionamentos e suas características.
El documento compara varios sistemas gestores de bases de datos como Oracle, PostgreSQL, SQL Server, MySQL, Access y Base. Oracle y PostgreSQL son sistemas robustos y escalables que funcionan en múltiples sistemas operativos pero Oracle es más costoso. SQL Server es estable y escalable mientras que MySQL es gratuito y portable. Access es sencillo para principiantes pero no es recomendable para bases grandes, y Base es multiplataforma y compatible con ODBC.
O documento descreve o que são triggers no SQL, como são associados a tabelas específicas e executados automaticamente sempre que há modificações nos dados da tabela. Explica também que triggers não podem ser chamados diretamente e fazem parte da mesma transação que disparou sua execução. Fornece orientações sobre como criar triggers e como funcionam para inserções, exclusões e atualizações.
O documento descreve o algoritmo de Bellman-Ford para encontrar o caminho mínimo em grafos. O algoritmo funciona em três etapas: inicialização, relaxamento e verificação de ciclos negativos. Ele pode lidar com grafos cujas arestas possuem pesos negativos, ao contrário do algoritmo de Dijkstra. A complexidade do algoritmo é O(AV) onde A é o número de arestas e V o número de vértices.
Processamento de Imagens Digitais - Transformações de Intensidade, Filtragem ...Murilo Adriano Vasconcelos
O documento introduz os conceitos básicos de processamento de imagens digitais, incluindo transformações de intensidade, filtragem espacial e processamento de histograma. Ele descreve as definições de filtragem espacial e transformação de intensidade e fornece exemplos destes processos.
O documento discute a Teoria dos Grafos, incluindo: (1) O problema das sete pontes de Königsberg que inspirou Euler a desenvolver a teoria; (2) A definição formal de grafo e elementos básicos como vértices, arestas e graus; (3) O teorema de Euler sobre a existência de caminhos eulerianos.
O documento discute os conceitos de cardinalidade e grau em relacionamentos entre entidades em bancos de dados. Explica que a cardinalidade indica quantas instâncias de uma entidade podem se relacionar com outra e define cardinalidades mínima, máxima e tipos como 1:1, 1:N e N:N. Também define grau de relacionamento como binário ou ternário dependendo do número de entidades envolvidas.
Este documento describe y compara varios sistemas gestores de bases de datos relacionales. Explica que un SGBD sirve de interfaz entre la base de datos, el usuario y las aplicaciones. Luego describe características clave de SGBDs como PostgreSQL, MySQL, Oracle y SQL Server.
O documento descreve os principais componentes necessários para configurar um servidor WEB, incluindo o servidor Apache, banco de dados MySQL, linguagem PHP e o sistema de gerenciamento de conteúdo WordPress. O CentOS é recomendado como sistema operacional de servidor e a combinação desses softwares livres (LAMP) permite criar sites dinâmicos e de alto desempenho.
O documento discute conceitos de complexidade de algoritmos, incluindo análise empírica e matemática de algoritmos. Apresenta exemplos de como contar instruções em algoritmos e discute a complexidade de casos como melhor caso, pior caso e caso médio.
Banco de Dados - Transações e Controle de ConcorrênciaJuliano Padilha
O documento discute transações e controle de concorrência em bancos de dados. Explica o que são transações, suas propriedades ACID e estados. Também aborda o controle de concorrência, escalonamento serializável, bloqueios, e problemas clássicos como atualização perdida e leitura suja.
O documento discute algoritmos, definindo-os como um conjunto de regras para solução de problemas. Apresenta etapas para construção de algoritmos, como definir entrada, processamento e saída de dados. Descreve diferentes tipos de algoritmos como descrição narrativa, pseudocódigo e fluxograma. Por fim, fornece exemplos e exercícios para fixação dos conceitos.
Construir microservices em python nunca foi tão simples como com o Nameko!Flávio Pimenta
Uma empresa desejava iniciar o desenvolvimento de APIs e microserviços em Python. Após analisar três frameworks (Django REST Framework, Flask e Nameko), o documento conclui que o Nameko é o mais adequado por ser um framework moderno e consolidado para construção de microserviços, trazendo suporte nativo para comunicação entre serviços de forma simples e performática.
Objetivo: Capacitar al estudiante para que sepa decidir la técnica de replicación más apropiada para una mejor disponibilidad y rendimiento de las operaciones sobre una base de datos.
Este documento describe diferentes tipos de listas como estructuras de datos, incluyendo listas simples, doblemente enlazadas, circulares y circulares doblemente enlazadas. Cada tipo tiene características únicas como la dirección de los punteros y la capacidad de recorrer la lista. Las listas ofrecen ventajas como la eficiencia de inserción, eliminación y acceso a elementos, dependiendo del tipo y de los requisitos del programa.
O documento discute o modelo lógico de dados, que leva em conta limitações e implementa padrões e nomenclaturas para definir chaves primárias e estrangeiras. O modelo lógico descreve as estruturas de dados que serão armazenadas no banco de dados e resulta em uma representação gráfica dos dados de forma lógica. A técnica mais comum é a abordagem entidade-relacionamento, representada por diagramas.
Este documento apresenta os principais conceitos de bancos de dados relacionais e o Sistema Gerenciador de Banco de Dados (SGBD) SQL. Ele discute a modelagem de dados, tipos de chaves e dados, e fornece exemplos dos principais comandos SQL como CREATE DATABASE, CREATE TABLE, ALTER TABLE e DROP TABLE. O documento visa ensinar os fundamentos teóricos e práticos de bancos de dados relacionais e SGBDs para estudantes.
O documento discute o Modelo de Entidade e Relacionamento (MER), que descreve entidades, atributos e relacionamentos de um banco de dados. O MER deve representar os dados e relacionamentos de forma próxima à visão do usuário. Ele inclui entidades como alunos, professores e disciplinas, com atributos como nome, data de nascimento e matrícula. O BrModelo é uma ferramenta para criar MERs.
Devido ao aumento da quantidade de dados, começaram a surgir demandas de escalabilidade e a necessidade de se trabalhar com dados de forma mais flexível do que as regras do modelo relacional. Em 2009, surgiu o termo NoSQL. Este novo modelo, faz referência a várias soluções desenvolvidas que caracterizam-se por ter esquema flexível, executar de forma distribuída e geralmente possuir o código aberto.
Este documento apresenta um minicurso introdutório ao sistema operacional Linux. O minicurso aborda conceitos básicos do Linux, como distribuições, ambientes gráficos e estrutura de diretórios. Além disso, ensina sobre instalação de pacotes, shell scripting, administração do sistema e configuração de rede através da resolução de problemas.
Este documento apresenta os conceitos fundamentais de estruturas de dados, incluindo:
1. Tipos de dados primitivos e estruturados em Pascal como inteiros, caracteres e registros.
2. O conceito de Tipo Abstrato de Dados (TAD) como um modelo matemático acompanhado de operações.
3. As estruturas de dados pilha, fila e lista sequencial implementadas em Pascal, mostrando sua declaração, procedimentos e funções.
4. O uso de apontadores e alocação dinâmica de
O documento descreve os principais conceitos do modelo entidade-relacionamento (ER) para modelagem de dados, incluindo entidades, atributos, tipos de entidades, relacionamentos e suas características.
El documento compara varios sistemas gestores de bases de datos como Oracle, PostgreSQL, SQL Server, MySQL, Access y Base. Oracle y PostgreSQL son sistemas robustos y escalables que funcionan en múltiples sistemas operativos pero Oracle es más costoso. SQL Server es estable y escalable mientras que MySQL es gratuito y portable. Access es sencillo para principiantes pero no es recomendable para bases grandes, y Base es multiplataforma y compatible con ODBC.
O documento descreve o que são triggers no SQL, como são associados a tabelas específicas e executados automaticamente sempre que há modificações nos dados da tabela. Explica também que triggers não podem ser chamados diretamente e fazem parte da mesma transação que disparou sua execução. Fornece orientações sobre como criar triggers e como funcionam para inserções, exclusões e atualizações.
O documento descreve o algoritmo de Bellman-Ford para encontrar o caminho mínimo em grafos. O algoritmo funciona em três etapas: inicialização, relaxamento e verificação de ciclos negativos. Ele pode lidar com grafos cujas arestas possuem pesos negativos, ao contrário do algoritmo de Dijkstra. A complexidade do algoritmo é O(AV) onde A é o número de arestas e V o número de vértices.
Processamento de Imagens Digitais - Transformações de Intensidade, Filtragem ...Murilo Adriano Vasconcelos
O documento introduz os conceitos básicos de processamento de imagens digitais, incluindo transformações de intensidade, filtragem espacial e processamento de histograma. Ele descreve as definições de filtragem espacial e transformação de intensidade e fornece exemplos destes processos.
O documento discute a Teoria dos Grafos, incluindo: (1) O problema das sete pontes de Königsberg que inspirou Euler a desenvolver a teoria; (2) A definição formal de grafo e elementos básicos como vértices, arestas e graus; (3) O teorema de Euler sobre a existência de caminhos eulerianos.
O documento discute o teorema da recursão e sua aplicação em tópicos avançados de computabilidade. Em particular, o teorema permite que máquinas de Turing obtenham sua própria descrição e o usem para realizar computações recursivas. Isso é ilustrado através da máquina de Turing AUTO, que imprime sua própria descrição usando recursão. O teorema também é usado para provar a indecidibilidade do problema da parada para máquinas de Turing.
Treinamento para Competições de Programacão - Single-Source Shortest Paths: D...Murilo Adriano Vasconcelos
O documento discute algoritmos para encontrar caminhos de menor custo em grafos. Apresenta o algoritmo de Dijkstra para grafos sem arestas de custo negativo e o algoritmo de Bellman-Ford para grafos que podem conter ciclos de custo negativo, podendo detectá-los. Explica a implementação e análise da complexidade de ambos, com exemplos de problemas clássicos onde podem ser usados.
Treinamento Para Competições de Programação - All Pairs Shortest Paths - O Al...Murilo Adriano Vasconcelos
O documento descreve o algoritmo de Floyd-Warshall para encontrar os caminhos mais curtos entre todos os pares de vértices em um grafo. O algoritmo funciona iterando sobre cada vértice como intermediário e atualizando as distâncias entre pares de vértices se o caminho através do vértice intermediário for mais curto. Isso é feito em O(N3) tempo e O(N2) espaço para armazenar a matriz de adjacência do grafo. O algoritmo pode ser usado para problemas como encontrar o fecho transitivo de um grafo direcionado.
Slides sobre os padrões de projeto Adapter e Decorator com exemplos em C++ apresentados a turma de Projeto de Software do curso de Ciência da Computação da Universidade Federal de Goiás.
Apresentação sobre parte do Capítulo 2 do livro Digital Image Processing de GONZALEZ e WOODS preparada para a disciplina de Processamento de Imagens Digitais do IC - Unicamp semestre 1/2012. Cobre a anatomia do olho humano, o espectro eletromagnético, sensores e aquisição de imagens e amostragem e quantização de imagens.
Introdução ao Processamento de Imagem Digital - Relacionamentos básicos entre...Murilo Adriano Vasconcelos
O documento introduz conceitos básicos sobre processamento de imagens digitais, como vizinhança e adjacência de pixels. A vizinhança de um pixel inclui pixels adjacentes horizontal, vertical e diagonalmente. A adjacência de pixels depende se eles compartilham valores de intensidade de acordo com sua vizinhança.
El documento describe los derivados del benceno, incluyendo: 1) derivados monosustituidos donde un átomo de hidrógeno es reemplazado, 2) derivados disustituidos donde dos átomos de hidrógeno son reemplazados creando isómeros de posición, y 3) derivados trisustituidos donde tres átomos de hidrógeno son reemplazados también creando isómeros de posición. Se proveen ejemplos de cada tipo de derivado.
O documento discute grafos e suas propriedades. Em três frases:
Discutiu os conceitos básicos de grafos incluindo vértices, arestas e graus. Apresentou exemplos de grafos simples e direcionados e discutiu representações computacionais como matriz de adjacências e lista de adjacências. Também abordou problemas clássicos em grafos como busca em largura, busca em profundidade e conectividade.
Grafos e árvores são estruturas matemáticas que representam relações. Grafos consistem em vértices e arestas, e podem ser direcionados ou não. Árvores são grafos acíclicos e conexos. Árvores binárias dividem cada nó em no máximo duas subárvores esquerda e direita.
La aromaticidad se presenta en hidrocarburos cíclicos conjugados donde los electrones de los enlaces dobles pueden moverse alrededor del anillo, otorgando mayor estabilidad. Los compuestos aromáticos contienen anillos de carbono y presentan gran estabilidad debido a su estructura resonante, como el benceno. Algunos derivados importantes del benceno son el tolueno, naftaleno y nitrobenceno.
Introdução à Teoria dos Grafos e Análise de Redes Sociaisfabiomalini
O documento apresenta um curso sobre extração, mineração e visualização de controvérsias em redes sociais. O curso objetiva capacitar os participantes no uso de ferramentas para análise de redes sociais, compreender termos e métricas básicas e realizar atividade prática analisando um caso sobre o Marco Civil da Internet no Twitter.
Este documento trata sobre química orgánica. Explica que en 1928, el químico alemán Friedrich Wohler descubrió la síntesis de la urea a partir de compuestos inorgánicos, lo que derribó la teoría del vitalismo. También habla sobre las diferentes formas alotrópicas del carbono y su tetravalencia, que le permite formar una gran variedad de compuestos. Finalmente, detalla las diferentes clases de hidrocarburos como alcanos, alquenos, alquinos y aromáticos.
Introdução aos grafos: Principais conceitosssusera0fc94
O documento descreve conceitos básicos de grafos, incluindo o problema das pontes de Königsberg que inspirou a teoria dos grafos. Ele define grafos, vértices, arestas e conceitos como ordem, adjacência e grau de um vértice. Também apresenta formas de representar grafos como matrizes de adjacência e lista de adjacência.
O documento discute o problema das pontes de Königsberg e como ele levou ao desenvolvimento da teoria dos grafos. Ele introduz o problema original das sete pontes de Königsberg e como Euler resolveu o problema em 1736, o que é considerado o primeiro artigo sobre teoria dos grafos. Em seguida, o documento apresenta conceitos básicos de grafos, incluindo definições de vértices, arestas, grau de vértices, subgrafos e representações de grafos como matrizes de adjacência e lista de adjacência.
Este documento descreve o algoritmo de busca em largura para grafos. Ele começa no vértice raiz e explora todos os vértices vizinhos, e então explora os vizinhos desses vértices e assim por diante até encontrar o alvo. O algoritmo usa uma fila FIFO para garantir a ordem de visita dos vértices e marca cada vértice como branco, cinza ou preto durante a busca. Sua complexidade de tempo é O(|V| + |E|) e de espaço é O(|V|) no pior caso.
O documento explica três formas principais de representar grafos em estruturas de dados: matriz de adjacência, lista de adjacência e matriz de incidência. Apresenta exemplos de cada uma e discute quando cada uma é mais apropriada dependendo do tipo e tamanho do grafo. Também introduz alguns algoritmos básicos para grafos como busca em profundidade.
Este documento apresenta os principais conceitos da Teoria dos Grafos em 3 frases:
1) Introduz os conceitos básicos de grafos como vértices, arestas, caminhos, circuitos e ciclos, além de definir graus de vértices, grafos completos e bipartidos.
2) Discute aplicações da Teoria dos Grafos como problemas de roteamento, menor distância entre vértices e coloração de mapas, e apresenta algoritmos de busca em profundidade e largura.
3) Cobre diversos tópicos avanç
O documento apresenta conceitos fundamentais da Teoria dos Grafos, incluindo definições de grafos, vértices, arestas, caminhos, ciclos, matriz de adjacências, grau de vértices, subgrafos, isomorfismo, coloração de vértices e diferentes tipos de grafos como bipartido, conexo, árvore, euleriano e hamiltoniano.
O documento discute coloração de grafos e suas aplicações. Em 3 frases:
1) A coloração de grafos envolve atribuir cores a vértices de um grafo de forma que vértices adjacentes recebam cores diferentes. 2) Isso tem aplicações como separar produtos químicos explosivos e atribuir frequências de rádio, entre outras. 3) Determinar o número cromático mínimo de um grafo é um problema NP-difícil, mas existem algoritmos como força bruta e heurísticas.
O documento apresenta uma introdução sobre árvores espalhadas mínimas e descreve dois algoritmos para encontrar tal árvore em um grafo: o algoritmo de Prim e o algoritmo de Kruskal. O documento discute o funcionamento, análise de complexidade e corretude de cada algoritmo e faz uma comparação entre eles.
Teoria de Grafos.ppt.pptx para estudar MACSsandra soares
Este documento apresenta alguns conceitos básicos sobre grafos, incluindo vértices, arestas, grau de vértices e tipos de grafos como grafos regulares e completos. Ilustra como grafos podem ser usados para modelar diversas situações como rotas de carteiros, plantas de casas e problemas de otimização.
O documento apresenta os principais conceitos da Teoria dos Grafos, incluindo definições de vértices, arestas, caminhos, ciclos, graus, matrizes de adjacência e diversos tipos de grafos como completos, bipartidos e árvores.
O documento discute ordenação topológica em grafos dirigidos acíclicos (DAGs). Explica conceitos como grafos dirigidos e DAGs, define ordenação topológica como uma sequência de vértices onde cada vértice vem antes dos vértices que dependem dele, e descreve um algoritmo de ordenação topológica baseado em busca em profundidade que imprime os vértices em ordem inversa.
O documento introduz os conceitos básicos de teoria dos grafos, incluindo definições formais e informais de grafos, exemplos de grafos, terminologia comum e aplicações. Além disso, aborda conceitos específicos como grafos isomorfos, grafos planares, árvores e percursos em árvores.
O documento descreve o algoritmo de Kosaraju para encontrar componentes fortemente conexos em um grafo. O algoritmo realiza uma DFS no grafo original e em seu transposto, empilhando os vértices visitados. Uma segunda DFS nos vértices empilhados encontra os componentes.
Elementary Circuits Enumeration in GraphsLuiz Kill
Este documento discute o problema de enumeração de ciclos elementares em grafos. Primeiro, define o problema e revisa conceitos relevantes como ciclos e componentes fortemente conexos. Em seguida, modela o problema usando um grafo direcionado desconexo representando serviços compostos. Por fim, revisa algoritmos da literatura para resolver o problema e detalha a implementação de um desses algoritmos.
O documento discute grafos e sua representação em computação. Ele define grafos, apresenta conceitos básicos como vértices, arestas e grau. Também descreve tipos de grafos como completos, regulares e ponderados. Por fim, aborda formas de representar grafos no computador como matriz e lista de adjacência.
René Descartes é considerado o pai da Geometria Analítica por ter desenvolvido um método para representar pontos no plano cartesiano e analisar geometricamente equações algébricas. O documento apresenta os conceitos básicos de geometria analítica como o plano cartesiano, quadrantes, distância entre pontos, equações de retas e suas representações gráficas.
O documento apresenta conceitos básicos de geometria como figuras geométricas planas e sólidos, suas fórmulas de área e perímetro, classificação de triângulos e quadriláteros, posições relativas de retas e planos. Também aborda aritmética, incluindo números, operações e equações do 1o grau.
MACS - grafos, trajetos e circuitos eulerianos; circuitos eulerianos...Joana Pinto
O documento define e explica conceitos básicos sobre grafos, incluindo suas partes constituintes (vértices e arestas), tipos de grafos (conexo, digrafo, completo), características dos vértices (grau, par ou ímpar) e problemas relacionados a grafos (euleriano, hamiltoniano). Também apresenta métodos para resolver esses problemas, como algoritmos para encontrar caminhos mínimos ou árvores geradoras.
Semelhante a Treinamento Para competições de Programação do INF-UFG - Grafos Parte 1 - Turma Iniciantes (20)
livro para professor da educação de jovens e adultos analisarem- do 4º ao 5º ano.
Livro integrado para professores da eja analisarem, como sugestão para ser adotado nas escolas que oferecem a educação de jovens e adultos.
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptxLuizHenriquedeAlmeid6
Slideshare Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24, Pr Henrique, EBD NA TV, Lições Bíblicas, 2º Trimestre de 2024, adultos, Tema, A CARREIRA QUE NOS ESTÁ PROPOSTA, O CAMINHO DA SALVAÇÃO, SANTIDADE E PERSEVERANÇA PARA CHEGAR AO CÉU, Coment Osiel Gomes, estudantes, professores, Ervália, MG, Imperatriz, MA, Cajamar, SP, estudos bíblicos, gospel, DEUS, ESPÍRITO SANTO, JESUS CRISTO, Com. Extra Pr. Luiz Henrique, de Almeida Silva, tel-What, 99-99152-0454, Canal YouTube, Henriquelhas, @PrHenrique, https://ebdnatv.blogspot.com/
proposta curricular para educação de jovens e adultos- Língua portuguesa- anos finais do ensino fundamental (6º ao 9º ano). Planejamento de unidades letivas para professores da EJA da disciplina língua portuguesa- pode ser trabalhado nos dois segmentos - proposta para trabalhar com alunos da EJA com a disciplina língua portuguesa.Sugestão de proposta curricular da disciplina português para turmas de educação de jovens e adultos - ensino fundamental. A proposta curricular da EJa lingua portuguesa traz sugestões para professores dos anos finais (6º ao 9º ano), sabendo que essa modalidade deve ser trabalhada com metodologias diversificadas para que o aluno não desista de estudar.
Slides Lição 9, Betel, Ordenança para uma vida de santificação, 2Tr24.pptxLuizHenriquedeAlmeid6
Slideshare Lição 10, Betel, Ordenança para buscar a paz e fazer o bem, 2Tr24, Pr Henrique, EBD NA TV, 2° TRIMESTRE DE 2024, ADULTOS, EDITORA BETEL, TEMA, ORDENANÇAS BÍBLICAS, Doutrina Fundamentais Imperativas aos Cristãos para uma vida bem-sucedida e de Comunhão com DEUS, estudantes, professores, Ervália, MG, Imperatriz, MA, Cajamar, SP, estudos bíblicos, gospel, DEUS, ESPÍRITO SANTO, JESUS CRISTO, Comentários, Bispo Abner Ferreira, Com. Extra Pr. Luiz Henrique, 99-99152-0454, Canal YouTube, Henriquelhas, @PrHenrique
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptxLuizHenriquedeAlmeid6
Slideshare Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24, Pr Henrique, EBD NA TV, Revista ano 11, nº 1, Revista Estudo Bíblico Jovens E Adultos, Central Gospel, 2º Trimestre de 2024, Professor, Tema, Os Grandes Temas Do Fim, Comentarista, Pr. Joá Caitano, estudantes, professores, Ervália, MG, Imperatriz, MA, Cajamar, SP, estudos bíblicos, gospel, DEUS, ESPÍRITO SANTO, JESUS CRISTO, Com. Extra Pr. Luiz Henrique, 99-99152-0454, Canal YouTube, Henriquelhas, @PrHenrique
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
Treinamento Para competições de Programação do INF-UFG - Grafos Parte 1 - Turma Iniciantes
1. TREINAMENTO PARA
COMPETIÇÕES DE
PROGRAMAÇÃO
GRAFOS PARTE 1
TAP
TURMA INICIANTE
Murilo Adriano Vasconcelos e Paulo Cezar P. Costa - INF/UFG
http://murilo.wordpress.com
1
3. Grafos
• O que é um grafo?
• Tipos de grafos
• Representações de grafos
• Algoritmos de busca
• Aplicações dos algoritmos de busca
3
4. O que é um grafo?
• Uma representação abstrata que pode ser
usada para descrever a organização de
sistemas de transportes, interações
humanas, redes de telecomunicação entre
outros.
4
5. O que é um grafo?
Matematicamente denotado como:
G = (V, E), onde V é o conjunto de vértices
e E o conjunto de arestas (edges) formado
por pares ordenados ou não de vértices do
conjunto V.
5
7. Grafos Não-Direcionados
• Um grafo G(V, E) é dito não-
direcionado se a existência de uma
aresta (u, v) ∈ E implica que a aresta (v, u)
também pertence a E
• Estradas interligando cidades são exemplos
de relações que podem ser representadas
por grafos não-direcionados uma vez que
as estradas possuem duplo sentido
7
8. Grafos Direcionados
• Se a presença de uma aresta (u, v) não
implica na existência da aresta (v, u) então
dizemos que o grafo é direcionado
• Ruas de uma cidade podem ser vistas como
um grafo direcionado pois nem todas as
ruas possuem mão-dupla.
8
10. Grafos Ponderados
• Em um grafo ponderado, cada aresta (ou
vértice) possui um valor que pode denotar
o peso, custo, ganho etc.
• Em um grafo representando as cidades e as
estradas que as interligam, os valores das
arestas podem representar, por exemplo, o
comprimento, o tempo de direção, o limite
de velocidade ou o custo do pedágio de
cada estrada.
10
11. Grafos Não-ponderados
• Em um grafo não-ponderado, não há
distinção de custo ou valor entre as
arestas. Isto é, cada aresta possui o mesmo
valor.
• Este tipo de grafo é utilizado quando o que
importa são somente os relacionamentos.
11
13. Grafos Cíclicos
• Um grafo cíclico é um grafo que não
contém ciclos, ou seja, se partindo de um
vértice v, conseguimos chegar a um vértice
u, então a partir de u não conseguimos
chegar novamente a v a não ser voltando
pelo caminho usado de v até u
13
14. Grafos Acíclicos
• Um grafo é acíclico se não contém ciclos
• Grafos conexos não-direcionados acíclicos?
• Árvores!!!
• Grafos direcionados acíclicos (DAGs)
14
16. Grafos Esparsos / Densos
• Um grafo G(V, E) é chamado esparso se
|E| for muito menor que |V|2
• Se um grafo possui o número de arestas (|
E|) próximo do número de vértices ao
quadrado (|V|2), então dizemos que este
grafo é denso.
16
17. Representações de grafos
• Duas formas principais
• Matrizes de adjacência
• Lista de adjacência
• É de suma importância saber identificar a
representação correta para a resolução de
problemas
17
19. Representações de grafos:
Matrizes de adjacência
• Vantagens:
• Facilidade e rapidez de implementação
• Fácil checar se a aresta (i, j) existe ou
não
• Desvantagens:
• Alocar uma matriz n pode não ser bom
2
• Ex.: 3000 de 4 bytes! de 9,000,000
posicões
cidades, array
19
20. Representações de grafos:
Listas de adjacência
• Podemos representar grafos esparsos de
uma forma mais eficiente com listas de
adjacência
• Cada vértice possui uma lista de vértices
associada
• Se existe uma aresta (u, v) no grafo então a
lista do vértice u contém o vértice v
20
21. Representações de grafos:
Listas de adjacência
• Vantagens
• Menor consumo de memória (n + m)
• Não contém arestas inexistentes no grafo
original, diminuindo assim a complexidade de
buscas no grafo
• Desvantagens
•Codificação mais demorada
•Checar se a aresta (u, v) existe é mais
demorado
21
22. Representações de grafos:
Comparativo
Comparação Vencedor
Checar se (u, v) pertence ao grafo matrizes de adjacência O(1)
Checar o grau de um vértice listas de ajacência
Memória em grafos pequenos listas de adjacência (n + m) vs n2
Inserção ou remoção de arestas matrizes de adjacência O(1) vs O(d)
Busca em grafos listas de ajacência Θ(m + n) vs Θ(n2)
Velocidade de implementação matrizes de adjacência
Melhor para a maioria dos problemas listas de ajacência
*Sugerido por [TADM] p.152
22
23. Implementação: Matrizes de adjacência
// Declarando
const int MAX_VERTICES = 100;
tipo grafo[MAX_VERTICES][MAX_VERTICES];
// Inicializando
for (int i = 0; i < num_arestas; ++i)
for (int j = i; j < num_arestas; ++j)
grafo[i][j] = grafo[j][i] = 0;
// Populando
int u, v;
for (int i = 0; i < num_arestas; ++i) {
cin >> u >> v;
grafo[u][v] = w;
// grafo[v][u] = w; se não for direcionado
// grafo[u][v] = true; se não for ponderado
}
23
24. Implementação: Listas de adjacência
#include <list> // std::list
#include <utility> // pair<> e make_pair()
using namespace std;
// Declarando
const int MAX_VERTICES = 100;
list< pair<tipo, int> > grafo[MAX_VERTICES];
// Inicializando
for (int i = 0; i < num_arestas; ++i)
grafo[i].clear();
// Populando
int u, v, w;
for (int i = 0; i < num_arestas; ++i) {
cin >> u >> v >> w;
grafo[u].push_back(make_pair(v,w));
}
Nem tão mais complicado assim... :)
24
25. Algoritmos de busca em grafos
• Dois principais:
• Busca em largura (ou Breadth-First Search
- BFS)
• Busca em profundidade (ou Depth-First
Search - DFS)
25
26. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
27. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
28. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
29. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
30. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
31. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
32. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
33. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
34. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
35. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
36. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
37. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
38. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
39. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
40. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
41. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
42. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
43. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
44. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
45. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
46. Algoritmos de busca em grafos - Busca em largura
• Expande todos os vizinhos de um vértice
primeiro:
26
47. Implementação: Busca em largura
#include <list> // std::list
#include <utility> // pair<> e make_pair()
using namespace std;
// Declarando
const int MAX_VERTICES = 100;
int grafo[MAX_VERTICES][MAX_VERTICES];
bool visitado[MAX_VERTICES];
void bfs(int origem, int num_vertices) {
for (int i = 0; i < num_vertices; ++i) {
visitado[i] = false;
}
// Fila que guarda a ordem de visita dos vértices
list<int> fila;
/*...*/
27
48. Implementação: Busca em largura
void bfs(int origem, int num_vertices) {
for (int i = 0; i < num_vertices; ++i) {
visitado[i] = false;
}
// Fila que guarda a ordem de visita dos vértices
list<int> fila;
// Adiciona a origem na fila
fila.push_back(origem);
visitado[origem] = true;
int atual; // vértice atual que estamos visitando
while (!fila.empty()) {
atual = fila.front(); // pega o 1o vértice
fila.pop_front(); // remove ele da fila
for (int i = 0; i < num_vertices; ++i) {
if (grafo[atual][i] && !visitado[i]) {
lista.push_back(i);
visited[i] = true;
}
}
}
28
51. Algoritmos de busca em grafos - Busca em largura
VISITADO
0 1 2 3 4 5 6
F F F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
52. Algoritmos de busca em grafos - Busca em largura
FILA: 0 VISITADO
0 1 2 3 4 5 6
F F F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
53. Algoritmos de busca em grafos - Busca em largura
FILA: 0 VISITADO
0 1 2 3 4 5 6
F F F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
54. Algoritmos de busca em grafos - Busca em largura
FILA: 0 VISITADO
0 1 2 3 4 5 6
T
F F F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
55. Algoritmos de busca em grafos - Busca em largura
FILA: 0 VISITADO
0 1 2 3 4 5 6
T
F F F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
56. Algoritmos de busca em grafos - Busca em largura
FILA: 0
3 VISITADO
0 1 2 3 4 5 6
T
F F F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
57. Algoritmos de busca em grafos - Busca em largura
FILA: 0
3 VISITADO
0 1 2 3 4 5 6
T
F F F T
F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
58. Algoritmos de busca em grafos - Busca em largura
FILA: 0
3 VISITADO
0 1 2 3 4 5 6
T
F F F T
F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
59. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2
3 VISITADO
0 1 2 3 4 5 6
T
F F F T
F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
60. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2
3 VISITADO
0 1 2 3 4 5 6
T
F F T T
F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
61. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2
3 VISITADO
0 1 2 3 4 5 6
T
F F T T
F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
62. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
3 VISITADO
0 1 2 3 4 5 6
T
F F T T
F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
63. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
3 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
64. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
3 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
65. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
3 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
66. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
2
31 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
67. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
2
31 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
68. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
2
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
69. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
2
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F T
F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
70. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
2
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F T
F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
71. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
2
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F T
F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
72. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
1
25
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F T
F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
73. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
1
25
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F T
F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
74. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
1
256
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F T
F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
75. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
1
256
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F T T
F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
76. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
1
256
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F T T
F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
77. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
1
256
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F T T
F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
78. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
5
16
256
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F T T
F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
79. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
5
16
256
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F T T
F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
80. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
5
16
256
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F T T
F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
81. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
6
5
16
256
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F T T
F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
82. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
6
5
16
256
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F T T
F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
83. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
6
5
16
256
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F T T
F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
84. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
6
5
16
256
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F T T
F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
85. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
6
5
16
256
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F T T
F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
86. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
4
6
5
16
256
315 VISITADO
0 1 2 3 4 5 6
T T T T
F F F F F T T
F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
87. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
4
6
5
16
256
315 VISITADO
0 1 2 3 4 5 6
T T T T T T T
F F F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
88. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
4
6
5
16
256
315 VISITADO
0 1 2 3 4 5 6
T T T T T T T
F F F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
89. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
4
6
5
16
256
315 VISITADO
0 1 2 3 4 5 6
T T T T T T T
F F F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
90. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
4
6
5
16
256
315 VISITADO
0 1 2 3 4 5 6
T T T T T T T
F F F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
91. Algoritmos de busca em grafos - Busca em largura
FILA: 0 2 1
4
6
5
16
256
315 VISITADO
0 1 2 3 4 5 6
T T T T T T T
F F F F F F F
3
5
2 4
0 0 1 2 3 4 5 6
6 0 - 1 1 1 0 0 0
1 1 - 0 0 0 0 1
1 2 1 0 - 0 0 0 1
3 1 0 0 - 0 1 0
4 0 0 0 0 - 0 1
5 0 0 0 1 0 - 0
6 0 1 1 0 1 0 -
29
92. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
93. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
94. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
95. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
96. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
97. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
98. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
99. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
100. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
101. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
102. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
103. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
104. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
105. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
106. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
107. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
108. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
109. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
110. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
111. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
112. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
113. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
114. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
115. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
116. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
117. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
118. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
119. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
120. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
121. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
122. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
123. Algoritmos de busca em grafos - Busca em
profundidade
• Explora primeiro o último vértice
colocado na lista (funciona como uma
pilha):
30
124. Implementação: Busca em profundidade
// Declarando
const int MAX_VERTICES = 100;
int grafo[MAX_VERTICES][MAX_VERTICES];
bool visitado[MAX_VERTICES];
int num_vertices; // qtd de vértices do grafo atual
// Recursivamente visita todos os vértices
// alcançáveis a partir de atual
void dfs(int atual) {
for (int i = 0; i < num_vertices; ++i) {
if (grafo[atual][i] && !visitado[i]) {
visitado[i] = true;
dfs(i);
}
}
}
31
126. Aplicações
• Verificar se um grafo é bicolorível
• Detecção de Ciclos
• Ordenação Topológica
• Caminhos Mínimos (Grafos não
ponderados)
• Conectividade
127. Aplicações:
Bicoloração
• Em algumas espécies é difícil distinguir os
machos das fêmeas, como é o caso de uma
espécie recém descoberta, os
happyRockers.
• Num laboratório são realizadas
experiências para determinar potenciais
machos e fêmeas em uma amostra.
128. Aplicações:
Bicoloração
• São feitas anotações sempre que dois indivíduos
se “relacionam”.
• A espécie não é monogâmica, portanto um
indivíduo A pode tranquilamente ter relações
com os indivíduo B e C.
• Porém, os sexos são bem definidos, machos
apenas se relacionam com fêmeas e vice-versa.
Então, se A se relaciona com B e C, estes são do
mesmo sexo, o qual é diferente do sexo de A.
129. Aplicações:
Bicoloração
• Dadas as anotações sobre as interações entre
os indivíduos, o Dr. que coordena o laboratório
quer saber se é possível distinguir quais
indivíduos tem o mesmo sexo ou se existem
indivíduos suspeitos no grupo.
• Como resolver ?
130. Aplicações:
Bicoloração
• O problema pode ser modelado em um
grafo não direcionado.
• Indivíduos são os vértices, relações são as
arestas.
• Tá, e agora ?
131. Aplicações:
Bicoloração
• Queremos saber se é possível separar os
vértices em dois conjuntos, onde os vértices
pertencentes a cada conjunto não se
relacionaram durante o experimento.
• Ah, que legal, e como faço isso ?!?
• Basta verificar se é possível colorir os
vértices do grafo usando apenas duas cores,
ou seja, verificar se o grafo é bicolorível/
bipartido.
132. Aplicações:
Bicoloração
• E como fazer essa verificação ?
• Fácil ! Basta fazer uma busca em largura..
• Começamos um BFS de cada vértice ainda não
colorido, pintando ele de branco e adicionando
na fila;
• Quando tira-se um vértice da fila e vai
processar seus vizinhos, tenta pintar eles da cor
contrária a que o vértice atual está pintado.
133. Aplicações:
Bicoloração
#include <iostream>
#include <list>
using namespace std;
int main(){
int u, v, num_individuos, num_relacoes;
list< int >::iterator w;
cin >> num_individuos >> num_relacoes;
list< int > grafo[num_individuos+1];
int cor[num_individuos+1];
for( u = 1; u <= num_individuos; u++ )
cor[u] = -1;
134. Aplicações:
Bicoloração
while( num_relacoes-- ){
cin >> u >> v;
grafo[u].push_back( v );
grafo[v].push_back( u );
}
bool bipartido = true;
for( int i = 1; i <= num_individuos && bipartido; i++ ){
if( cor[i] != -1 ) continue;
cor[i] = 1;
list< int > fila;
fila.push_back( i );
135. Aplicações:
Bicoloração
while( !fila.empty() && bipartido ){
u = fila.front(); fila.pop_front();
for( w = grafo[u].begin(); w != grafo[u].end(); w++ ){
if( cor[*w] == -1 ){
cor[*w] = 1-cor[u]; // pinta o vizinho da cor contraria
fila.push_back( *w ); // e adiciona na fila
} else if( cor[*w] != 1-cor[*w] ) {
// O vizinho estava pintado da mesma cor, grafo nao e
// bicolorivel.
bipartido = false;
break;
}
}
}
137. Aplicações:
Detecção de Ciclos
• Sabemos que existem grafos cíclicos e
acíclicos.
• Mas dado um grafo, como seria uma
algoritmo que verifica se ele é cíclico ou
acíclico ?
138. Aplicações:
Detecção de Ciclos
• Durante um DFS, podemos classificar as
arestas do grafo em 3 tipos, são eles:
• arestas descendentes - ligam
ancestrais a descendentes
• arestas de retorno - ligam
descendentes a ancestrais
• arestas cruzadas - ligam vértices sem
relação ancestral/descendente
139. Aplicações:
Detecção de Ciclos
• Um grafo tem um ciclo, se e somente se ele
possui uma aresta de retorno.
• Portanto, se durante uma busca em
profundidade detectarmos tal tipo de
aresta, podemos garantir que o grafo é
cíclico.
140. Aplicações:
Detecção de Ciclos
• A idéia apesar de muito parecida funciona
de maneiras diferentes para grafos
orientados e não orientados.
• No grafo não orientado, inicialmente todos
estão pintados de branco, e a medida que
são descobertos são pintados de preto.
141. Aplicações:
Detecção de Ciclos
• Quando um vértice tem uma aresta para
um vértice pintado de preto ( que já foi
descoberto ), e esse não é seu pai, essa é
uma aresta de retorno.
• Logo, o grafo tem um ciclo.
142. Aplicações:
Detecção de Ciclos
• Nos grafos orientados, o fato de um
vizinho já ter sido descoberto não significa
que a aresta é de retorno;
• Isso só é verdade se o vértice ainda estiver
sendo processado..
• Portanto, precisamos diferenciar entre ‘não-
usado’, ‘descoberto’ e ‘processado’
143. Aplicações:
Detecção de Ciclos
• Num grafo direcionado uma aresta de
retorno é uma aresta que aponta para um
vértice ‘descoberto’.
• Então.. vamos ao código !
144. Aplicações:
Detecção de Ciclos
bool ciclico(){
for( int u = 1; u <= num_vert; u++ )
cor[u] = -1;
for( int u = 1; u <= num_vert; u++ )
if( cor[u] == -1 ){
parent[u] = u; // necessario para grafos nao orientados
if( dfsC( u ) ) return true;
}
return false;
}
145. Aplicações:
Detecção de Ciclos
bool dfsC( int u ){
// versao para grafos nao orientados
cor[u] = 1;
for( list<int>::iterator v = grafo[u].beging(); v != grafo[u].end(); v++ ){
if( cor[*v] == -1 ){
parent[*v] = u;
if( dfsC( *v ) ) return true;
}
else if( *v != parent[u] ) return true;
}
return false;
}
146. Aplicações:
Detecção de Ciclos
bool dfsC( int u ){
// versao para grafos orientados
cor[u] = 1; // vertice u foi descoberto
for( list<int>::iterator v = grafo[u].beging(); v != grafo[u].end(); v++ ){
if( cor[*v] == -1 ){
if( dfsC( *v ) ) return true;
}
else if( cor[*v] == 1 ) return true;
}
cor[u] = 2; // vertice u foi processado
return false;
}
147. Aplicações:
Ordenação Topológica
• No curso de Ciência da Computação
algumas disciplinas possuem pré-requisitos.
• Dadas as disciplinas que o aluno deve
cursar e seus pré-requisitos como
descobrir em qual ordem as matérias
podem ser cursadas ?
148. Aplicações:
Ordenação Topológica
• As disciplinas podem ser vistas como os
vértices de um grafo;
• Existe uma aresta direcionada do vértice X
para o vértice Y se a disciplina X é pré-
requisito da disciplina Y.
149. Aplicações:
Ordenação Topológica
• Uma ordenação topológica ordena os
vértices em uma linha de modo que as
arestas são todas direcionadas da esquerda
pra direita.
• Logicamente, se o grafo é cíclico é
impossível que tal ordenação exista.
150. Aplicações:
Ordenação Topológica
• Mas como fazer uma ordenação
topológica ?
• Simples! Basta uma busca em
profundidade para gerar uma
ordenação topológica, ou retornar um
erro caso o grafo seja cíclico.
• Como assim ?
151. Aplicações:
Ordenação Topológica
• Na busca em profundidade depois que
analisamos todas as arestas que saem de um
vértice, podemos garantir que ele não tem
nenhuma aresta de entrada vindo de um vértice
que já foi processado.
• E se em algum momento detectamos a
existência de um ciclo ?
• Uma ordenação topológica não existe.
152. Aplicações:
Ordenação Topológica
bool gera_ordenacao(){
ordem.clear(); // pilha onde a ordenacao sera armazenada
for( int u = 1; u <= num_vert; u++ )
cor[u] = -1;
for( int u = 1; u <= num_vert; u++ )
if( cor[u] == -1 ){
if( dfsT( u ) ) return false;
}
while( !ordem.empty() ){
int u = ordem.top(); ordem.pop();
cout << u << “ “;
}
return true;
}
153. Aplicações:
Ordenação Topológica
bool dfsT( int u ){
cor[u] = 1; // vertice u foi descoberto
for( list<int>::iterator v = grafo[u].beging(); v != grafo[u].end(); v++ ){
if( cor[*v] == -1 ){
if( dfsC( *v ) ) return true;
}
else if( cor[*v] == 1 ) return true;
}
cor[u] = 2; // vertice u foi processado
pilha.push( u );
return false;
}
154. Aplicações:
Caminhos Mínimos
• Num grafo não ponderado, quando
queremos encontrar o menor caminho do
vértice s ao vértice t, precisamos apenas
de uma busca em largura.
155. Aplicações:
Caminhos Mínimos
• Por que ?
• Se as arestas não tem pesos diferentes, o
custo do menor caminho de s para t é
na verdade, a menor profundidade,
partindo de s com que conseguimos
visitar t.
156. Aplicações:
Caminhos Mínimos
• Dado o funcionamento da busca em
largura, isso é exatamente o que ela
calcula.
• Primeiro todos os vértices a
profundidade 1 são visitados, em seguida
todos que estão a profundidade 2 e assim
por diante.
157. Aplicações:
Caminhos Mínimos
int menorCaminho( int s, int t ){
int dist[num_vert];
memset( dist, -1, sizeof( dist ) );
dist[s] = 0;
...
return dist[t];
}
159. Referências e bibliografia
• [TADM] - Steven S. Skiena -The Algorithm Design Manual
• Thomas H. Cormen, Charles E. Leiserson - Introduction to Algorithms, Second
Edition
66