Representações de Grafos

Documentos relacionados
Melhores momentos AULA 4

Melhores momentos AULA 1

AULA 4. Procurando um caminho. Melhores momentos. Certicados. Certicado de inexistência

Na última aula... Algoritmos em Grafos 1º sem / 80

Na última aula... Procurando um caminho. Certificados. Procurando um caminho

Melhores momentos AULA 4

Na última aula... Algoritmos em Grafos 1º sem / 1

Na última aula... Procurando um caminho. Certicados. Problema: dados um digrafo G e dois vértices s e t decidir se existe um caminho de s a t

Melhores momentos AULA 12

Calculando distâncias

Teoria dos Grafos 1. Teoria dos Grafos

AED Algoritmos e Estruturas de Dados LEEC /2007. Teoria de Grafos e Algoritmos em Grafos

Grafos - Aplicação. Implemente na linguagem C a função procurarcaminho(...).

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

CAL ( ) MIEIC/FEUP Grafos: Introdução (Março, 2011)

Estrutura de Dados. Ricardo José Cabeça de Souza Parte 9

Grafos - O que é um grafo? Algoritmos e Estruturas de Dados LEE 2013/14. Objecto abstracto Dois tipos de entidades. Vértices representam

Grafos - O que é um grafo? Algoritmos e Estruturas de Dados MEEC 2012/13. Objecto abstracto Dois tipos de entidades. Vértices representam

GRAFOS E DIGRAFOS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

grafo nós vértices arcos arestas

Implementação do TAD DiGrafo Ponderado usando Matriz de Adjacência. Profa. Dra. Denise Guliato FACOM - UFU

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

Fluxos em redes: o Problema do Fluxo máximo

Aula 08. Estruturas de dados Árvore e Grafo

Listas ligadas/listas encadeadas

Questão 1: O histograma deve ser: [0, 1, 4, 2, 0, 3, 0,, 0, 2] Exemplo: Para a matriz

Lista de Exercícios sobre Listas Implementadas por Encadeamento

Programação II. Listas Encadeadas (Linked Lists) Bruno Feijó Dept. de Informática, PUC-Rio

Facebook. Um grafo é uma rede. Estrutura de dados fundamental em Informática, tal como listas e árvores.

Ministério da Educação UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ. Campus Curitiba PLANO DE ENSINO

Pesquisa Linear. Adriano J. Holanda 15/3/2016

Professora Jeane Melo

GRAFOS Aula 03 Representações de Grafos Max Pereira

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

Demonstração. Relação invariante chave. Implementações do algoritmo de Prim. Implementação grosseira

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

Algoritmo de Kruskal. Algoritmo de Kruskal. Floresta geradora 26. Subfloresta S 20.3

Lista de Exercícios 04

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

INF 1010 Estruturas de Dados Avançadas

Estruturas de dados compostas

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

Grafos - Representação

Grafos tipo abstrato de dados

Melhores momentos AULAS 1-8

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

Universidade Federal do Ma Curso de Ciência da Computação

Estrutura de Dados. Ricardo José Cabeça de Souza Parte 4

Tabelas Hash Endereçamento Direto

Lista Encadeada (Linked List)

Lista Ordenada. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

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

Roteiro para Laboratório - GRAFOS

Estruturas de Dados Aula 1: Introdução e conceitos básicos 28/02/2011

Web site. Profa. Patrícia Dockhorn Costa.

Linguagem C: Listas Encadeadas

Estruturas de Dados para Conjuntos Disjuntos: Union-find Letícia Rodrigues Bueno

EPs 1 e 2. EP2: veja. EP1: veja

Melhores momentos AULA 5

Algoritmos e Estruturas de dados

05 Grafos: ordenação topológica SCC0503 Algoritmos e Estruturas de Dados II

Ponteiros. Baseado nos slides do Prof. Mauro.

- Mapa de memória de um processo - Ponteiros

GRAFOS Conceitos Básicos (Parte 1)

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

Departamento de Engenharia de Produção UFPR 57

MCTA001 Algoritmos e Estruturas de Dados I Aula 02: Ponteiros e estruturas

Volmir Eugênio Wilhelm Departamento de Engenharia de Produção UFPR 45

Teoria dos Grafos. Valeriano A. de Oliveira, Socorro Rangel, Silvio A. de Araujo. Departamento de Matemática Aplicada

SCC Algoritmos e Estruturas de Dados I

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

Os métodos de ordenação externa possuem particularidades que os diferenciam dos métodos de ordenação interna.

Matrizes Esparsas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Universidade Federal do Vale do São Francisco. Estruturas de Dados. Professor: Marcelo Santos Linder

Teoria dos Grafos Aula 3

AULA 6. Conceitos. Melhores momentos. Conceitos. Conceitos. Conceitos. Conceitos

LISTAS ENCADEADAS OU NÃO- SEQÜENCIAIS. Estrutura de Dados

Classes, Herança e Interfaces

Lista de Exercícios de CES-11 CTA - ITA - IEC

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

Acessibilidade e Fecho Transitivo de Grafos Dirigidos

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

Matrizes. Marina Andretta. 17 de abril de 2017 ICMC-USP. Marina Andretta (ICMC-USP) sme0230-ipc 17 de abril de / 30

Grafos - Representação

Universidade de São Paulo

Estrutura de Dados. Ricardo José Cabeça de Souza Parte 2

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

Introdução a Programação. Listas Encadeadas

Algoritmos e Estrutura de Dados II. Árvore. Prof a Karina Oliveira.

Alocação dinâmica de Memória

Teoria dos Grafos Aula 1 - Introdução

Algoritmos e Estruturas de Dados II IEC013

Estruturas de Dados Grafos

char* prefixo (char* str, int n);

Algoritmo da IFT 2 / 16. Algoritmo da IFT Estrutura da fila de prioridade Resolvendo empates. Algoritmo 1 Algoritmo geral da IFT

Plano de Aula Segunda-feira Tarde 13/10/2014 Objetivo: Introduzir o conceito de alocação dinâmica na memória e registros / structs.

Estruturas de Dados Aula 10: Listas (parte 2) 19/04/2011

Um Minotauro Perdido & Percolação

Árvores Binárias de Busca (ABB) 18/11

Transcrição:

Representações de Grafos Teoria dos Grafos 1 É possível diversas representações dos grafos. Vamos estudar as três utilizadas mais comumente: as matrizes de adjacência, as listas de adjacência e as multilistas de adjacência. A escolha de determinada representação dependerá da aplicação que se tem em vista e das funções que se espera realizar no grafo. A representação de listas de adjacências em geral é preferida porque ela fornece um modo compacto de representar grafos esparsos. Contudo, uma representação de matriz de adjacências pode ser preferível quando o grafo é denso, ou quando precisamos ter a possibilidade de saber com rapidez se existe uma aresta conectando dois vértices dados. Matriz de Adjacências Seja G = (V, E) um grafo com n vértices, onde n 1. Supomos que os vértices são numerados 1, 2,..., V de alguma maneira arbitrária. Então a representação de matriz de adjacências de um grafo G consiste em uma matriz V V A = (a ij ) tal que A(i,j) = 1 se a borda (vi, vj)({vi, vj para um grafo dirigido 1 ) fica em E(G). A(i, j) = 0 se não houver tal borda em G. A matriz de adjacência do grafo ao lado. A matriz de adjacências para um grafo não-dirigido 2 é simétrica, pois a borda (v i, v j ) está em E(G), se a borda (v i, v j ) também está em E(G). A matriz de adjacências de um grafo dirigido não necessita ser simétrica. É de n 2 bits o espaço necessário para representar um grafo, usando a matriz de adjacências. A representação de matriz de adjacências pode ser usada no caso de grafos ponderados 3. Por exemplo, se G = (V, E) é um grafo ponderado com função peso de aresta w, o peso w(u, v) da aresta (u, v) E é simplesmente armazenado como a entrada na fila u e na coluna v da matriz de adjacências. A simplicidade de uma matriz de adjacências pode torná-la preferível quando os grafos são razoavelmente pequenos. Em lugar de usar uma palavra de memória de computador para cada entrada da matriz, a matriz de adjacências usa somente um bit por entrada. 1 Num grafo dirigido cada borda é representada por um par dirigido (v 1, v 2 ), v 1 é o cabo e v 2 a cabeça da borda. 2 Num grafo não-dirigido, não tem ordenação especial o par de vértices que representam qualquer borda 3 Grafos nos quais cada aresta tem um peso associado a ela.

2 Representações de Grafos Listas de Adjacências Nesta representação as n fileiras da matriz de adjacências são representadas como n listas interligadas. Existe uma lista para cada vértice em G. Os nós na relação i representam os vértices que são adjacentes do vértice i. Cada nó possui, pelo menos, dois campos: VERTEX e LINK. Os campos VERTEX contém dois índices dos vértices adjacentes do vértice i. Cada relação possui um nó de cabeça. Os nós de cabeça são sequenciais, permitindo fácil acesso aleatório à lista de adjacências de determinado vértice. No caso de um grafo não-dirigido com n vértices e bordas, essa representação requer n nós de cabeça a 2e nós de lista. Cada nó de lista possui dois campos. Em muitos casos, os nós podem ser condensados sequencialmente nas listas de adjacências eliminando-se os campos de ligação. Uma Aplicação de Grafos Suponha uma linha de entrada contendo quatro inteiros seguidos por qualquer número de linhas de entrada com dois inteiros cada uma. O primeiro inteiro na primeira linha, n, representa um número de cidades, que, para simplificar, serão numeradas de 0 a n-1. O segundo e o terceiro inteiro nessa linha estão entre 0 e n-1 e representam duas cidades. Queremos sair da primeira cidade para a segunda usando exatamente nr estradas, onde nr é o quarto inteiro na primeira linha de entrada. Cada linha de entrada subsequente contém dois inteiros representando duas cidades, indicando que existe uma estrada da primeira cidade até a segunda. O problema é determinar se existe um percurso do tamanho solicitado pelo qual se possa viajar da primeira cidade para a segunda. Uma solução é criar um grafo com as cidades como nós e as estradas como arcos. Para achar um caminho de comprimento nr do nó A ao nó B, procure um nó C de modo que exista um arco de A até C e um caminho de comprimento nr-1 de C até B. Se essas condições forem atendidas para um nó C, o caminho desejado existirá; se elas não forem atendidas para qualquer nó C, o caminho não existirá. Representações de Grafos em C Os vértices de um grafo serão representados por números inteiros no intervalo 0..v-1. O conjunto de vértices será, portanto, 0 1 2 3...v-1. Vértices são representados por objetos do tipo Vertex. #define Vertex int Os arcos dos grafos serão representados por structs do tipo Edge. Um objeto do tipo Edge representa um arco com ponta inicial v e ponta final w. typedef struct{ Vertex v; Vertex w; Edge; Se e é um arco então e.v é a ponta inicial e e.w é a ponta final do arco. A construção de arcos ficará a cargo de uma função EDGE. A função EDGE recebe dois vértices v e w e devolve um arco com ponta inicial v e ponta final w. Edge EDGE (Vertex v, Vertex w){ Edge e;

e.v = v; e.w = w; return e; Teoria dos Grafos 3 Um grafo será representado por uma struct graph que contém o número de vértices, o número de arcos e a matriz de adjacências do grafo. O campo adj é um ponteiro para a matriz de adjacência do grafo. O campo V contém o número de vértices e o campo E contém o número de arcos do grafo. struct graph{ int V; int E; int **adj; ; Um objeto do tipo Graph contém o endereço de um graph. typedef struct graph *Graph; Funções básicas Esta função devolve o endereço de um novo grafo com vértices 0,..,V-1 e nenhum arco. Graph GRAPHinit (int V){ Graph G = malloc(sizeof *G); G->V = V; G->E = 0; G->adj = MATRIXint(V, V, 0); return G; A função abaixo aloca uma matriz com linhas 0..r-1 e colunas 0..c-1. Cada elemento da matriz recebe valor val. int **MATRIXint (int r, int c, int val){ Vertex i, j; int **m = malloc(r* sizeof(int *)); for (i = 0; i < r; i++) m[i] = malloc(c* sizeof(int)); for (i = 0; i < r; i++) for (j = 0; j < c; j++) m[i][j]= val; returm m; Esta função insere um arco v-w no grafo G. Se v == w ou o grafo já tem arco v-w, a função nada faz. v e w não podem ser negativos e deve ser menores que G->V. void GRAPHinsertE (Graph G, Vertex v, Vertex w){ if (v!= w && G->adj[v][w] == 0){ G->adj[v][w] = 1; G->E++; Esta função remove do grafo G o arco que tem ponta inicial v e ponta final w. Se não existe tal arco, a função não faz nada. void GRAPHremoveE (Graph G, Vertex v, Vertex w){ if (G->adj[v][w] == 1){ G->E--; G->adj[v][w] = 0; Para cada vértice v do grafo G, esta função imprime, em uma linha, todos os vértices adjacentes a v. void GRAPHshow (Graph G){

4 Representações de Grafos Vertex v, w; for (v = 0; v < G->V; v++){ printf("%2d:", v); for (w = 0; w < G->V; w++) if (G->adj[v][w] == 1) printf(" %2d", w); printf("\n"); Vetor de listas de adjacência O vetor de listas de adjacência de um grafo tem uma lista encadeada para cada vértice do grafo. A lista do vértice v contém todos os vértices vizinhos de v. Listas encadeadas Uma lista encadeada é uma representação de uma sequência de objetos na memória do computador. Cada elemento da sequência é armazenado em uma célula da lista: o primeiro elemento na primeira célula, o segundo na segunda e assim por diante. Uma lista encadeana é uma sequência de células; cada célula contém um objeto de algum tipo e o endereço da célula seguinte. Exemplo do conjunto de arestas de um grafo e o vetor de listas de adjacências do grafo: 0 1 0 5 1 5 2 4 3 1 5 3 0 : 5 1 1 : 3 5 0 2 : 4 3 : 5 1 4 : 2 5 : 3 1 0 Exemplo de um dígrafo e seu vetor de listas de adjacência: 0 1 0 5 1 0 1 5 2 4 3 1 5 3 0 : 5 1 1 : 5 0 2 : 4 3 : 1 4 : 5 : 3 Estruturas Um dígrafo é representado por uma struct digraph que contém o número de vértices, o número de arcos e o vetor de listas de adjacência do dígrafo. A estrutura digraph represente um dígrafo. O campo adj é um ponteiro para o vetor de listas de adjacência do dígrafo. O campo V contém o número de vértices e o campo A contém o número de arcos do dígrafo. struct digraph { int V; int A; link *adj; ; Um objeto do tipo Digraph contém o endereço de um digraph. typed struct digraph *Digraph;

Teoria dos Grafos 5 A lista de adjacência de um vértice v é composta por nós do tipo node. Um link é um ponteiro para um node. Cada nó da lista contém um vizinho w e v e o endereço do nó seguinte da lista. typedef struct node *link; struct node { Vertex w; link next; ; A função NEW recebe um vértice w e o endereço next de um nó e devolve um novo nó x com x.w = w e x.next = next. link NEW (Vertex w, link next){ link x = malloc(sizeof *x); x->w = w; x->next = next; return x; Essa mesma estrutura é usada para representar grafos, nesse caso escrevemos graph e Graph no lugar de digraph e Digraph. Essas estruturas não devem ser consideradas definitivas. Elas poderão ser modificadas e adaptadas conforme as necessidades. Funções básicas Algumas funções básicas de construção e manipulação de dígrafos representados por listas de adjacência: Digraph DIGRAPHinit (int V){ Digraph G = malloc(sizeof *G); G->V = V; G->A = 0; G->adj = malloc(v * sizeof(link)); for (v = 0; v < V; v++) G->adj[v] = NULL; return G; A função acima devolve o endereço de um novo dígrafo com vértices 0,..., V-1 e nenhum arco. void DIGRAPHinsertA (Digraph G, Vertex v, Vertex w){ link p; if (v == w) return; for (p = G->adj[v]; p!= NULL; p = p->next) if (p->w == w) return; G->adj[v] = NEW(w, G->adj[v]); G->A++; A função acima insere um arco v-w no dígrafo G. Se v == w ou o dígrafo já tem arco v-w, a função não faz nada. A execução da função DIGRAPHinsertA consome muito tempo, pois percorre toda a lista de vizinhos de v. A função abaixo transfere a responsabilidade de evitar laços e arcos paralelos ao usuário, que provavelmente tem condições de fazer isso de maneira eficiente. void DIGRAPHinsertA (Digraph G, Vertex v, Vertex w){ if (v == w) return; G->adj[v] = NEW(w, G->adj[v]); G->A++;

6 Representações de Grafos Exercícios 1. Dados os grafos a seguir represente as matrizes de adjacências. a) b) c) d) e) 2. Dados os grafos abaixo represente as listas de adjacências. a)

Teoria dos Grafos 7 b) c) d) 3. Escreva uma função GRAPHedges que armazene as arestas de um grafo num vetor fornecido pelo usuário. 4. Digamos que um arquivo é grafico se sua primeira linha contém um inteiro V e cada uma das demais linhas contém dois inteiros pertencentes ao intervalo [0..V-1] se parados por um caractere -. Eis o exemplo: 6 0-1 0-5 1-0 1-5 2-4 3-1 Se interpretarmos cada linha do arquivo como uma aresta, podemos dizer que o arquivo define um grafo com vértices 0..V-1. Escreva uma função GRAPHconstruct que receba um arquivo gráfico e construa a matriz de adjacência do grafo. Use as funções GRAPHinit e GRAPHinsertE. 5. Siga as orientações acima para o mesmo exemplo e construa a lista de adjacência. 6. A figura abaixo sugere o vetor de listas de adjacência de um grafo. De quantas maneiras diferentes essas listas poderiam ser reescritas sem deixar de representar o mesmo grafo? 0 : 6 5 1 2 1 : 0 2 : 0 3 : 5 4 4 : 6 5 3 5 : 3 0 4 6 : 0 4 7 : 8 9 : 12 11 10 10 : 9 11 : 12 9 12 : 9 11 7. Escreva uma função que receba um vetor de arestas e devolva a representação por listas de adjacência do grafo definido por essas arestas. 8. Escreva uma função que receba um grafo representado por matriz de adjacência e construa a correspondente representação por listas de adjacência.

8 Representações de Grafos 9. Escreva uma função que receba um grafo representado por listas de adjacência e construa a correspondente representação por matriz de adjacência. 10. Uma grade m-por-n é um grafo com m n vértices distribuídos em m linhas e n colunas com arestas ligando vértices vizinhos na horizontal e na vertical da maneira óbvia. A figura ao lado sugere uma grade 3-por-4. Escreva uma função que construa uma grade m n. Faça duas versões: uma gera uma representação por matriz de adjacência e outra gera uma representação por listas de adjacência. Bibliografia Estrutura de Dados Usando C Aaron M. Tenenbaum, Yedidyah Langsam, Moshe J. Augenstein São Paulo: Makron Books, 1995 Algoritmos: Teoria e Prática Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein Rio de Janeiro: Elsevier, 2002 Estrutura de Dados Paulo Veloso, Clesio dos Santos, Paulo Azevedo, Antonio Furtado Rio de Janeiro: Campus, 1983 Fundamentos de Estrutura de Dados 253 Ellis Horowitz, Sartaj Sahni Rio de Janeiro: Campus, 1986 Uma Introdução Sucinta à Teoria dos Grafos 8 http://www.ime.usp.br/~pf/teoriadosgrafos/ P. Feofiloff, Y. Kohayakawa, Y. Wakabayashi Algoritmos para Grafos em C via Sedgewick http://www.ime.usp.br/~pf/algoritmos_para_grafos/ Paulo Feofiloff