Projeto e Análise de Algoritmos

Documentos relacionados
Grafos e Algoritmos de Busca

Busca em Profundidade e em Largura

GRAFOS Aula 05 Algoritmos de percurso: busca em largura e profundidade Max Pereira

Análise e Síntese de Algoritmos. Algoritmos em Grafos CLRS, Cap. 22

Análise e Síntese de Algoritmos

Algoritmos e Estruturas de Dados

grafo nós vértices arcos arestas

Grafos: algoritmos de busca

Busca em Profundidade. Componentes Conexos. Grafos. Maria Adriana Vidigal de Lima. Fevereiro

PAA-DCC-UFAM. Grafos. Universidade Federal do Amazonas Departamento de Eletrônica e Computação

Estruturas de Dados Grafos

Projeto e Análise de Algoritmos

AULA 11 PROJETO E ANÁLISE DE ALGORITMOS. Conceitos básicos e representação de grafos Karina Valdivia Delgado

Teoria dos Grafos Aula 5

Busca em Largura. Adaptado de Humberto C. B. Oliveira

Grafos: Busca. Algoritmos e Estruturas de Dados 2. Graça Nunes

Grafos: Busca. SCE-183 Algoritmos e Estruturas de Dados 2. Thiago A. S. Pardo Maria Cristina

Busca em largura. Algoritmos em Grafos. Marco A L Barbosa

Grafos - Representação

GRAFOS Conceitos Básicos (Parte 1)

Projeto e Análise de Algoritmos

GRAFOS BUSCAS E MENOR CAMINHO. Prof. André Backes

Busca em Profundidade. Busca em Grafos. Busca em Grafos. Busca em Grafos. Busca em Grafos. Os objetivos da busca são: Aplicações???

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

Grafos parte 2* Algoritmos e Estruturas de Dados II SCC-203 Rosane 2010/2011. *Baseado em material de professores dos anos anteriores

Grafos parte 2. Percorrendo um grafo. Correção. Eficiência. Percorrendo um Grafo. Percorrendo um Grafo. Percorrendo um Grafo

Eduardo Camponogara. DAS-9003: Introdução a Algoritmos

06 Grafos: Caminhos Mínimos SCC0503 Algoritmos e Estruturas de Dados II

Grafos Parte 2. SCC-603 Algoritmos e Estruturas de Dados II. Profª. Rosane Minghim / Baseado em material de professores dos anos anteriores

Grafos. Fabio Gagliardi Cozman. PMR2300 Escola Politécnica da Universidade de São Paulo

APLICAÇÕES DE BUSCA EM GRAFOS

BCC402 Algoritmos e Programação Avançada. Prof. Marco Antonio M. Carvalho Prof. Túlio Toffolo 2012/1

BCC204 - Teoria dos Grafos

UNIVERSIDADE DE SÃO PAULO INSTITUTO DE CIÊNCIAS MATEMÁTICAS E DE COMPUTAÇÃO Departamento de Ciências de Computação

CT-234. Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

Teoria dos Grafos. Teoria dos Grafos. Profa. Sheila Morais de Almeida DAINF-UTFPR-PG. agosto

Algoritmos e Estruturas de Dados. Grafos Semestre de Inverno 13/14

TGR BCC Representação Computacional de Grafos. Prof. Ricardo José Pfitscher

Definição e Conceitos Básicos

Grafos IFRN. Prof. Robinson Alves

Grafos Direcionados. > Grafos Direcionados Representações Computacionais 1/36

Teoria dos Grafos Aula 1 - Introdução

Disciplina: Matemática Discreta Agostinho Iaqchan Ryokiti Homa

Grafos. Notas. Notas. Notas. Notas. Algoritmos elementares. Representação de grafos Lista de adjacências Matriz de adjacências Atributos

Grafos representação e aplicações. Prof. Guilherme Tomaschewski Netto

UNIVERSIDADE DE SÃO PAULO INSTITUTO DE CIÊNCIAS MATEMÁTICAS E DE COMPUTAÇÃO Departamento de Ciências de Computação

Árvores: Conceitos Básicos e Árvore Geradora

Grafos Caminhos mais Curtos

Pesquisa em Grafos. Pedro Ribeiro 2014/2015 DCC/FCUP. Pedro Ribeiro (DCC/FCUP) Pesquisa em Grafos 2014/ / 33

Aula 2 Definições, Conceitos Básicos e Representação Interna de Grafos. Teoria dos Grafos Prof.

Teoria dos Grafos Aula 6

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches

Prof. Marco Antonio M. Carvalho

Grafos COM11087-Tópicos Especiais em Programação II

DFS: Depth-First Search (pesquisa em profundidade) Percursos e Conectividade em Grafos Depth-First Search. Implementação de DFS

AED2 - Aula 22 Busca em largura, cálculo de distâncias

Teoria dos Grafos Aula 8

Introdução à Teoria dos Grafos

AULA 13 PROJETO E ANÁLISE DE ALGORITMOS. Problema do caminho mais curto de uma única origem em grafos Karina Valdivia Delgado

Parte B Teoria dos Grafos

Matemática Discreta 10

Análise e Síntese de Algoritmos

CES-11. Árvores. Conceito de árvore. Definição recursiva de árvore Definições associadas a árvore. Ordenação dos nós de uma árvore

GRAFOS. Prof. André Backes. Como representar um conjunto de objetos e as suas relações?

INF 1010 Estruturas de Dados Avançadas

INF 1010 Estruturas de Dados Avançadas

Estrutura de Dados e Algoritmos e Programação e Computadores II. Aula 10: Introdução aos Grafos

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches

IPRJ PROJETO E ANÁLISE DE ALGORITMOS LISTA DE EXERCÍCIOS 10

Aula 09. Percurso em grafo

O estudo utilizando apenas este material não é suficiente para o entendimento do conteúdo. Recomendamos a leitura das referências no final deste

Desafios de Programação TCC Turma A-1

CONCEITOS BÁSICOS EM GRAFOS

Grafos: componentes fortemente conexos, árvores geradoras mínimas

Algoritmos e Estruturas de Dados II

CES-11. Algoritmos e Estruturas de Dados

Cap. 2 Conceitos Básicos em Teoria dos Grafos

MATEMÁTICA DISCRETA PARA ENGENHARIA DE COMPUTAÇÃO

Árvores. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

Otimização em Grafos

Grafos - Introdução. Pedro Ribeiro 2014/2015 DCC/FCUP. Pedro Ribeiro (DCC/FCUP) Grafos - Introdução 2014/ / 32

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

GRAFOS Aula 03 Representações de Grafos Max Pereira

CIC 111 Análise e Projeto de Algoritmos II

TEORIA DOS GRAFOS TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS MATEMÁTICA DISCRETA II PROFº MARCOS NASCIMENTO

Grafos: caminhos mínimos

Teoria dos Grafos. Aula 5 - Estruturas de Dados para Grafos. Profª. Alessandra Martins Coelho. março/2013

O grau de saída d + (v) de um vértice v é o número de arcos que tem

Árvores. SCC-214 Projeto de Algoritmos. Thiago A. S. Pardo. Um nó após o outro, adjacentes Sem relações hierárquicas entre os nós, em geral

03 Grafos: percurso, ponderação e caminhos SCC0503 Algoritmos e Estruturas de Dados II

Aula 08. Estruturas de dados Árvore e Grafo

O estudo utilizando apenas este material não é suficiente para o entendimento do conteúdo. Recomendamos a leitura das referências no final deste

SCC-210 Algoritmos Avançados. Capítulo 9 Grafos. Adaptado por João Luís G. Rosa

GRAFOS E ALGORITMOS ALGORITMOS E APLICAÇÕES

Prova Didática Grafos: Árvores Geradoras e Caminhos Mínimos, Análise de Complexidade

ESTRUTURAS DE DADOS. prof. Alexandre César Muniz de Oliveira. 1. Introdução 2. Pilhas 3. Filas 4. Listas 5. Árvores 6. Ordenação 7. Busca 8.

Melhores momentos AULA 5

Transcrição:

Projeto e Análise de Algoritmos Aula 06 Busca em Profundidade e Busca em Largura Edirlei Soares de Lima <edirlei@iprj.uerj.br>

Grafos (Revisão) G = (V, A) G: grafo; V: conjunto de vértices; A: conjunto de arestas;

Grafos (Revisão) Grafos Direcionados Uma aresta (u, v) sai do vértice u e entra no vértice v. O vértice v é adjacente ao vértice u. Podem existir arestas de um vértice para ele mesmo, chamadas de self-loops.

Grafos (Revisão) Grafos Não Direcionados As arestas (u, v) e (v, u) são consideradas como uma única aresta. A relação de adjacência é simétrica. Self-loops não são permitidos.

Grafos (Revisão) Grau de um Vértice Em grafos não direcionados: é o número de arestas que incidem nele. Em grafos direcionados: é o número de arestas que saem dele (out-degree) mais o número de arestas que chegam nele (in-degree). Um vérice de grau zero é dito isolado ou não conectado.

Grafos (Revisão) Caminho entre Vértices Um caminho de comprimento k de um vértice x a um vértice y em um grafo G = (V, A) é uma sequência de vértices (v 0, v 1, v 2,..., v k ) tal que x = v 0 e y = v k, e v i V para i = 1, 2,..., k. O comprimento de um caminho é o número de arestas nele, isto é, o caminho contém os vértices v 0, v 1, v 2,..., v k e as arestas (v 0, v 1 ), (v 1, v 2 ),..., (v k-1, v k ). Se existir um caminho c de x a y então y é alcançável a partir de x via c.

Grafos (Revisão) Ciclos Em um grafo direcionado: um caminho (v 0, v 1,..., v k ) forma um ciclo se v 0 = v k e o caminho contém pelo menos uma aresta. O self-loop é um ciclo de tamanho 1. Em um grafo não direcionado: um caminho (v 0, v 1,..., v k ) forma um ciclo se v 0 = v k e o caminho contém pelo menos três arestas.

Grafos (Revisão) Componentes Conectados Um grafo não direcionado é conectado se cada par de vértices está conectado por um caminho. Os componentes conectados são as porções conectadas de um grafo. Um grafo não direcionado é conectado se ele tem exatamente um componente conectado.

Grafos (Revisão) Componentes Fortemente Conectados Um grafo direcionado G = (V, A) é fortemente conectado se cada dois vértices quaisquer são alcançáveis a partir um do outro. Os componentes fortemente conectados de um grafo direcionado são conjuntos de vértices sob a relação são mutuamente alcançáveis. Um grafo direcionado fortemente conectado tem apenas um componente fortemente conectado.

Grafos (Revisão) Outras Classificações de Grafos Um grafo ponderado possui pesos associados às arestas. Um grafo completo é um grafo não direcionado no qual todos os pares de vértices são adjacentes.

Grafos (Revisão) Representação de Grafos Lista de Adjacências: Consiste em um vetor Adj com V listas de adjacências, uma para cada vértice v V. Para cada u V, Adj[u] contém ponteiros para todos os vértices v tal que (u, v) A. Ou seja, Adj[u] consiste de todos os vértices que são adjacentes a u.

Grafos (Revisão) Representação de Grafos Matriz de Adjacências: Para um grafo G = (V, E), assumimos que os vértices são rotulados com números 1, 2,..., V. A representação consiste de uma matriz A ij de dimensões V V, onde: a ij = 1 se i, j A 0 caso contrario

Busca em Largura A busca em largura é um dos algoritmos mais simples para exploração de um grafo. Dados um grafo G = (V, E) e um vértice s, chamado de fonte, a busca em largura sistematicamente explora as arestas de G de maneira a visitar todos os vértices alcançáveis a partir de s. Expande a fronteira entre vértices descobertos e não descobertos uniformemente através da largura da fronteira. O algoritmo descobre todos os vértices a uma distância k do vértice origem antes de descobrir qualquer vértice a uma distância k + 1. O grafo pode ser direcionado ou não direcionado.

Busca em Largura Algoritmo: Para controlar a busca, o algoritmo da Busca em Largura pinta cada vértice na cor branca, cinza ou preto. Todos os vértices iniciam com a cor branca e podem, mais tarde, se tornar cinza e depois preto. Branca: não visitado; Cinza: visitado; Preta: visitado e seus nós adjacentes visitados.

BuscaEmLargura(G, s) for each u V[G] c[u] white d[u] π[u] NULL c[s] gray d[s] 0 Q {s} //Queue while Q u head[q] for each v Adj[u] if c[v] = white c[v] gray d[v] d[u] + 1 π[v] u enqueue(q,v) dequeue(q) c[u] black Busca em Largura

for each u V[G] c[u] white d[u] π[u] NULL c[s] gray d[s] 0 Q {s} //Queue Busca em Largura

u head[q] for each v Adj[u] if c[v] = white c[v] gray d[v] d[u] + 1 π[v] u enqueue(q,v) dequeue(q) c[u] black Busca em Largura

u head[q] for each v Adj[u] if c[v] = white c[v] gray d[v] d[u] + 1 π[v] u enqueue(q,v) dequeue(q) c[u] black Busca em Largura

u head[q] for each v Adj[u] if c[v] = white c[v] gray d[v] d[u] + 1 π[v] u enqueue(q,v) dequeue(q) c[u] black Busca em Largura

Busca em Largura Análise BuscaEmLargura(G, s) for each u V[G] c[u] white d[u] π[u] NULL c[s] gray d[s] 0 Q {s} //Queue while Q u head[q] for each v Adj[u] if c[v] = white c[v] gray d[v] d[u] + 1 π[v] u enqueue(q,v) dequeue(q) c[u] black Cada vértice de V é colocado na fila Q no máximo uma vez: O(V); A lista de adjacência de um vértice qualquer de u é percorrida somente quando o vértice é removido da fila; A soma de todas as listas de adjacentes é O(A), então o tempo total gasto com as listas de adjacentes é O(A); Enfileirar e desenfileirar tem custo O(1); Complexidade: O(V + A)

Busca em Largura A partir de π é possível reconstruir a árvore da busca em largura:

Busca em Profundidade A estratégia é buscar o vértice mais profundo no grafo sempre que possível: As arestas são exploradas a partir do vértice v mais recentemente descoberto que ainda possui arestas não exploradas saindo dele. Quando todas as arestas adjacentes a v tiverem sido exploradas a busca anda para trás para explorar vértices que saem do vértice do qual v foi descoberto (backtraking). O algoritmo é a base para muitos outros algoritmos importantes, tais como verificação de grafos acíclicos, ordenação topológica e componentes fortemente conectados.

Busca em Profundidade Algoritmo: Para controlar a busca, o algoritmo da Busca em Largura pinta cada vértice na cor branca, cinza ou preto. Todos os vértices iniciam com a cor branca e podem, mais tarde, se tornar cinza e depois preto. Branca: não visitado; Cinza: visitado; Preta: visitado e seus nós adjacentes visitados.

Busca em Profundidade Algoritmo: A busca em profundidade também marca cada vértice com um timestamp. Cada vértice tem dois timestamps: d[v]: indica o instante em que v foi visitado (pintado com cinza); f[v]: indica o instante em que a busca pelos vértices na lista de adjacência de v foi completada (pintado de preto).

Busca em Profundidade BuscaEmProfundidade(G) for each u V[G] c[u] white π[u] NULL time 0 for each u V[G] if c[u] = white visita(u) visita(u) c[u] gray d[u] time time + 1 for each v Adj[u] if c[v] = white π[v] u visita(v) c[u] black f[u] time time + 1

Busca em Profundidade for each u V[G] c[u] white π[u] NULL time 0 for each u V[G] if c[u] = white visita(u) u v y x w z c w w w w w w π / / / / / / d f

Busca em Profundidade c[u] gray d[u] time time + 1 for each v Adj[u] if c[v] = white π[v] u visita(v) c[u] black f[u] time time + 1 u v y x w z c g w w w w w π / / / / / / d 1 f

Busca em Profundidade c[u] gray d[u] time time + 1 for each v Adj[u] if c[v] = white π[v] u visita(v) c[u] black f[u] time time + 1 u v y x w z c g g w w w w π / u / / / / d 1 2 f

Busca em Profundidade c[u] gray d[u] time time + 1 for each v Adj[u] if c[v] = white π[v] u visita(v) c[u] black f[u] time time + 1 u v y x w z c g g g w w w π / u v / / / d 1 2 3 f

Busca em Profundidade c[u] gray d[u] time time + 1 for each v Adj[u] if c[v] = white π[v] u visita(v) c[u] black f[u] time time + 1 u v y x w z c g g g g w w π / u v y / / d 1 2 3 4 f

Busca em Profundidade c[u] gray d[u] time time + 1 for each v Adj[u] if c[v] = white π[v] u visita(v) c[u] black f[u] time time + 1 u v y x w z c g g g b w w π / u v y / / d 1 2 3 4 f 5

Busca em Profundidade c[u] gray d[u] time time + 1 for each v Adj[u] if c[v] = white π[v] u visita(v) c[u] black f[u] time time + 1 u v y x w z c g g b b w w π / u v y / / d 1 2 3 4 f 6 5

Busca em Profundidade c[u] gray d[u] time time + 1 for each v Adj[u] if c[v] = white π[v] u visita(v) c[u] black f[u] time time + 1 u v y x w z c g b b b w w π / u v y / / d 1 2 3 4 f 7 6 5

Busca em Profundidade c[u] gray d[u] time time + 1 for each v Adj[u] if c[v] = white π[v] u visita(v) c[u] black f[u] time time + 1 u v y x w z c b b b b w w π / u v y / / d 1 2 3 4 f 8 7 6 5

Busca em Profundidade for each u V[G] c[u] white π[u] NULL time 0 for each u V[G] if c[u] = white visita(u) u v y x w z c b b b b w w π / u v y / / d 1 2 3 4 f 8 7 6 5

Busca em Profundidade c[u] gray d[u] time time + 1 for each v Adj[u] if c[v] = white π[v] u visita(v) c[u] black f[u] time time + 1 u v y x w z c b b b b g w π / u v y / / d 1 2 3 4 9 f 8 7 6 5

Busca em Profundidade c[u] gray d[u] time time + 1 for each v Adj[u] if c[v] = white π[v] u visita(v) c[u] black f[u] time time + 1 u v y x w z c b b b b g g π / u v y / w d 1 2 3 4 9 10 f 8 7 6 5

Busca em Profundidade c[u] gray d[u] time time + 1 for each v Adj[u] if c[v] = white π[v] u visita(v) c[u] black f[u] time time + 1 u v y x w z c b b b b b b π / u v y / w d 1 2 3 4 9 10 f 8 7 6 5 11 12

Busca em Profundidade Análise BuscaEmProfundidade(G) for each u V[G] c[u] white π[u] NULL time 0 for each u V[G] if c[u] = white visita(u) visita(u) c[u] gray d[u] time time + 1 for each v Adj[u] if c[v] = white π[v] u visita(v) c[u] black f[u] time time + 1 O procedimento visita é chamado exatamente uma vez ara cada vértice u V, isso porque visita é chamado apenas para vértices brancos e a primeira ação é pintar o vértice de cinza: O(V); O loop principal de visita(u) tem complexidade O(A); Complexidade: O(V + A)

Busca em Profundidade Classificação de Arestas: Arestas de árvore: são arestas de uma árvore de busca em profundidade. A aresta (u, v) é uma aresta de árvore se v foi descoberto pela primeira vez ao percorrer a aresta (u, v); Arestas de retorno: conectam um vértice u com um antecessor v em uma árvore de busca em profundidade (inclui self-loops); Arestas de avanço: não pertencem à árvore de busca em profundidade mas conectam um vértice a um descendente que pertence à árvore de busca em profundidade; Arestas de cruzamento: podem conectar vértices na mesma árvore de busca em profundidade, ou em duas árvores diferentes.

Busca em Profundidade Classificação de arestas pode ser útil para derivar outros algoritmos. Na busca em profundidade cada aresta pode ser classificada pela cor do vértice que é alcançado pela primeira vez: Branco indica uma aresta de árvore. Cinza indica uma aresta de retorno. Preto indica uma aresta de avanço quando u é descoberto antes de v ou uma aresta de cruzamento caso contrário.

Exercícios Lista de Exercícios 06 Busca em Profundidade e Busca em Largura http://www.inf.puc-rio.br/~elima/paa/