algoritmos em grafos baseado em: the algorithm design manual steven s. skiena

52
Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Upload: internet

Post on 18-Apr-2015

121 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Algoritmos em Grafos

Baseado em:The Algorithm Design Manual

Steven S. Skiena

Page 2: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Introdução (1) Um grafo G=(V,E) consiste em cum

conjunto V de vértices e um conjunto E de pares de vértices ou arestas.

Os grafos são uma forma de modelar os problemas.

Muitos problemas algorítmicos são simplificados ao pensarmos neles em termos de grafos.

Page 3: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Introdução (2)

A teoria dos Grafos fornece uma linguagem para tratarmos com as propriedades dos grafos.

Conhecer diferentes problemas algorítmicos em grafos é melhor do que entender os detalhes de algoritmos particulares em grafos.

Page 4: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Conteúdo

Estruturas de dados básicas e operações de atravessamento.

Algoritmos mais sofisticados para: caminhos mais curtos e árvore geradora.

Page 5: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Observações

Grafos podem ser utilizados para modelar uma variedade de estruturas e relações.

Muitas aplicações de grafos podem ser reduzidas a propriedades padrão de grafos e usando algoritmos bem conhecidos.

Busca em profundidade e busca em largura fornecem mecanismos para visitar cada aresta e cada vértice do grafo.

Page 6: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

O grafo de relacionamento

Page 7: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

O grafo de relacionamento

Se sou seu amigo, você é meu amigo?

Sou amigo de mim mesmo? Quão íntimo é um amigo? Estou relacionado através de uma

cadeia a alguém famoso? Quão próximo estou de alguém

famoso?

Grafos orientados e não-orientadosLaços, multi-arestas, grafos simples.

Grafos com pesos

Caminho em um grafo

Caminho mínimo

Page 8: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

O grafo de relacionamento

Existe um caminho de relacionamento entre quaisquer duas pessoas no mundo?

Quem tem mais amigos? E menos? Qual o maior clique? Quanto tempo uma fofoca minha

leva para retornar a mim?

Componentes conexas

Grau de um vértice, grafos regularesClique

Circuitos

Page 9: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Estruturas de Dados Matriz de

adjacências Lista de adjacências

1

5 4

2

3

1 2 3 4 5

1 0 1 0 0 1

2 1 0 1 1 1

3 0 1 0 1 0

4 0 1 1 0 1

5 1 1 0 1 1

1 2 5

2 1 5 3 43 2 4

4 2 5 3

5 4 1 2

Page 10: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Matriz de adjacências

Espaço: O(n²) Espaço pode ser reduzido

agrupando-se as informações em bits ou armaze-nando apenas a matriz triangular.

Tempo constante para testar a pertinência de uma aresta ao grafo.

Page 11: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Listas de adjacências

Tempo O(di) para verificar a pertinência de uma aresta ao grafo, onde di é o grau do vértice i.

Pior caso quando din). Na prática os grafos geralmente

são esparsos.

Page 12: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Lista de adjacências

Para muitas aplicações é a melhor alternativa.

A utilização de lista ligada facilita a “ampliação” da estrutura.

Page 13: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Matriz de Adjacências X Listas de Adjacências

Testar se aresta está no grafo. Determinar o grau de um vértice. Menos memória em grafos pequenos. Menos memória em grafos grandes. Inserção ou remoção de aresta. Atravessar o grafo. Melhor na maioria dos problemas.

Matriz de Adjacência

Listas de Adjacências

Matriz de Adjacência

Listas de Adjacências

Matriz de Adjacência

Listas de Adjacências

Listas de Adjacências

Page 14: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Atravessando Grafos Impressão ou validação de cada

vértice e/ou aresta. Cópia de um grafo ou conversão entre

representações diferentes. Contagem de números de vértices

e/ou arestas. Determinação de componentes

conexas. Determinação de caminho entre dois

vértices ou ciclos, caso existam.

Page 15: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Atravessando Grafos

Eficiência um mesmo local não deve ser visitado repetidamente.

Corretude o percurso deve ser feito de modo que não se perca nada.

Page 16: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Atravessando Grafos

Os vértices devem ser marcados quando visitados pela primeira vez.

Cada vértice deve ter um dos estados: Não-visitado Visitado Completamente explorado

Page 17: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Atravessando Grafos

Mantém-se uma estrutura de dados com todos os vértices já visitados mas ainda não completamente explorados.

As arestas não-orientadas são consideradas duas vezes. As orientadas apenas uma.

Page 18: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Atravessando Grafos

Estruturas dados para armazenar os vértices descobertos mas ainda não completamente explorados: Fila busca em largura Pilha busca em profundidade

Page 19: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Busca em Largura

A árvore define um caminho mais curto da raiz até cada um dos vértices.

3

3 3 3

3 3

3

4

5

2

1

6

Page 20: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Busca em Profundidade

3

4

5

2

1

6

1

2

5

6

3

4

Geralmente é mais útil do que a busca em largura.

Page 21: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Busca em Profundidade

Em um grafo não-orientado temos: arestas da árvore arestas para um ancestral (aresta de

retorno)

Page 22: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Busca em Profundidade

Em um grafo orientado temos: arestas da árvore arestas para a frente ligam um

vértice visitado a um completamente explorado.

arestas para trás ligam um vértice visitado a outro visitado.

arestas cruzadas as demais.

Page 23: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Aplicações da Travessia

Componentes Conexas Detecção de Árvores e Ciclos 2-coloração de Grafos Ordenação Topológica Vértices de Articulação

Page 24: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Componentes Conexas

Pode-se usar Busca em Largura ou Busca em Profundidade.

Em grafos orientados temos os conceitos de fracamente conexo e fortemente conexo.

Tempo: O(m+n)

Page 25: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Detecção de Árvores e Ciclos Detecção de árvores é feita

usando busca em profundidade o grafo é uma árvore se, e somente se, não existirem arestas de retorno.

A detecção de ciclo é feita quando a primeira aresta de retorno é identificada.

Tempo: O(n)

Page 26: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

2-coloração de Grafos Pode-se usar busca em largura ou

em profundidade. Um vértice visitado recebe sempre

cor diferente da de seu pai. Para cada aresta não visitada

verifica-se se ela não une dois vértices de mesma cor. Neste caso, foi possível uma 2-coloração.

Page 27: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Ordenação Topológica

Consideremos grafos dirigidos acíclicos.

Page 28: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Ordenação Topológica

É uma ordenação nos vértices de forma que todas as arestas vão da esquerda para a direita.

Busca em profundidade é utilizada para determinar se o grafo orientado é acíclico e então determinar uma ordenação topológica.

Page 29: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Ordenação Topológica

Um grafo orientado é acíclico se, e somente se, não são encontradas arestas de retorno durante uma busca em profundidade.

Cada vértice é rotulado em ordem inversa à ordem em que eles são marcados completamente explorados.

Page 30: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Vértices de Articulação (1) É um vértice de um grafo conexo cuja

remoção torna o grafo desconexo. Qualquer grafo que contenha um

vértice de articulação é frágil. A conectividade de um grafo é a

quantidade de vértices necessários para desconectar o grafo.

Conectividade é uma importante medida de robustez no projeto de rede.

Page 31: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Vértice de Articulação (2)

Page 32: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Modelagem de Problemas (1)

Procura-se um algoritmo para o projeto de rotas naturais para personagens de jogos de vídeo game através de uma sala cheia de objetos. Como fazer?

Page 33: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Como proceder?

Uma grade onde cada vértice é um lugar válido e uma aresta ligando vértices vizinhos, com pesos dependendo da distância entre os vértices.

Determinar o caminho mais curto.

Page 34: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Modelagem de Problemas (2)

No seqüenciamento de DNA, os dados experimentais consistem de pequenos fragmentos. Para cada fragmento f, existem fragmentos que são forçados a estar à esquerda de f, outros à direita e outros que podem ir para qualquer um dos lados. Como podemos determinar uma ordenação consistente dos fragmentos da esquerda para a direita que satisfaça todas as restrições?

Page 35: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Como proceder? Criar um grafo dirigido no qual a

cada vértice é atribuído um fragmento.

Uma aresta (l,f) liga um fragmento l que é obrigado a estar à esquerda.

Uma aresta (f,r) liga um fragmento r que é obrigado a estar à direita.

Determinar uma ordenação topológica neste grafo.

Page 36: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Modelagem de Problemas (3)

Dado um conjunto qualquer de retângulos no plano, como distribuí-los em um número mínimo de cestos tal que o subconjunto de retângulos em um mesmo cesto não intersectam-se entre si?

Page 37: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Como proceder? Cada vértice representa um retângulo. Uma aresta liga vértices cujos

retângulos se intersectam. Cada cesto corresponde a um conjunto

independente. A coloração de vértices particiona um

grafo em conjuntos independentes, logo nosso problema é determinar uma coloração mínima de vértices.

Page 38: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Modelagem de Problemas (4)

Ao portar códigos de UNIX para DOS, tem-se que reduzir o tamanho dos nomes de várias centenas de arquivos para no máximo 8 caracteres cada. Como diminuir o nome dos arquivos e garantir que não haja conflito?

Page 39: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Como proceder? Construir um grafo com vértices

correspondendo ao nome original ligados a vértices que possam corresponder a reduções do nome.

Determinar um conjunto de n arestas que não tenham vértices em comum.

Determinar um conjunto independente de arestas em um grafo bipartido.

Page 40: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Árvore Geradora Mínima

Uma árvore é uma grafo sem ciclos.

Um árvore geradora é um subgrafo de G com os mesmo vértices que é uma árvore.

Um árvore geradora mínima de um grafo com pesos é a árvore geradora de peso mínimo.

Page 41: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Observações Úteis em determinar a menor

quantidade de fios necessárias para interligar um grupo de casas ou cidades.

Pode existir mais de uma tal árvore. Para o caso em que todas as arestas

têm o mesmo peso, todas as árvores geradoras são mínimas.

Para o caso geral, o problema não é tão simples.

Page 42: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Algoritmo de Prim

Escolha um vértice arbitrário senquanto existe algum vértice fora

da árvore façatome a aresta de menor peso entre a árvore e um vértice não pertencen- te à árvoreadicione a aresta selecionada e o

vértice à árvore T

Page 43: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Exemplo

Page 44: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Tempo

O(nm) Pode ser reduzido a O(n²).

Page 45: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Algoritmo de Kruskal

Mantenha as arestas em uma fila de prioridade ordenada pelo peso

Conta <- 0enquanto (Conta < n-1) faça

tome o próxima aresta (v,w)se componente(v) != componente(w)

insira (v,w) em Tjunte as componentes

Page 46: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Exemplo

1

1

31

2

1

33 1

2

1

1

3

3

3

2

Page 47: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Tempo

O(nm) Pode ser melhorado para O(m log

m).

Page 48: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Caminho mais curto

Quando o grafo é sem pesos, a determinação de um caminho mais curto pode ser feita através de uma busca em largura.

Quando o grafo tem pesos associados às arestas, o caminho mais curto pode não ser o que usa menos arestas.

Page 49: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Caminho mais curto (2)

S

t

Page 50: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Algoritmo de Dijkstra

O grafo de entrada tem pesos não-negativos associados às suas arestas.

Dado o caminho mais curto entre s e cada vértice v1,v2,...vk de um conjunto de vértices, deve existir algum outro vértice x tal que o caminho mais curto de s a vi a x, para algum 1 i k.

Page 51: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Algoritmo de Dijkstra

Page 52: Algoritmos em Grafos Baseado em: The Algorithm Design Manual Steven S. Skiena

Todos os caminhos mais curtos