Buscar

07.Grafos - Aula sobre Grafos

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 79 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 79 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 79 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Aula 07
Grafos
Rodolfo Carneiro Cavalcante
Universidade Federal de Alagoas – UFAL
Campus Arapiraca
5 de Novembro de 2015
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 1 / 79
Suma´rio
1 Introduc¸a˜o
2 Terminologia
3 Implementando um grafo
4 Percurso em Grafos
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 2 / 79
Suma´rio
Aulas anteriores...
Ja´ estudamos estruturas de dados lineares
Pilhas, filas, listas
Estudamos uma estrutura de dados na˜o linear onde cada elemento
pode ter mais de um sucessor
a´rvore
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 3 / 79
Suma´rio
Aulas anteriores...
A´rvores
Cada no´ tem apenas um predecessor, mas possui va´rios sucessores
E´ desenhada de cima para baixo, da raiz para as folhas
Apresentam uma estrutura hiera´rquica
Sa˜o estruturas de dados recursivas
Muitas func¸o˜es para manipulac¸a˜o de a´rvores sa˜o definidas como
func¸o˜es recursivas
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 4 / 79
Suma´rio
Terminologia
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 5 / 79
Introduc¸a˜o
Suma´rio
1 Introduc¸a˜o
2 Terminologia
3 Implementando um grafo
4 Percurso em Grafos
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 6 / 79
Introduc¸a˜o
Introduc¸a˜o
Limitac¸a˜o das a´rvores: cada item possui apenas um pai
Algumas aplicac¸o˜es demandam por uma estrutura sem essa limitac¸a˜o
Ou seja, um no´ pode ter va´rios antecessores e va´rios sucessores
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 7 / 79
Introduc¸a˜o
Introduc¸a˜o
Pre´-requisitos entre disciplinas
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 8 / 79
Introduc¸a˜o
Introduc¸a˜o
Representac¸a˜o uma rede de computadores
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 9 / 79
Introduc¸a˜o
Introduc¸a˜o
Redes Sociais
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 10 / 79
Introduc¸a˜o
Introduc¸a˜o
Roteamento de ve´ıculos entre cidades
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 11 / 79
Introduc¸a˜o
Introduc¸a˜o
Caminho de menor custo entre duas cidades
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 12 / 79
Introduc¸a˜o
Introduc¸a˜o
Caminho de menor custo entre duas cidades
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 13 / 79
Introduc¸a˜o
Introduc¸a˜o
Caminho de menor custo entre duas cidades
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 14 / 79
Introduc¸a˜o
Introduc¸a˜o
Caminho de menor custo entre duas cidades
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 15 / 79
Introduc¸a˜o
Introduc¸a˜o
Caminho de menor custo entre duas cidades
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 16 / 79
Introduc¸a˜o
Introduc¸a˜o
Caminho de menor custo entre duas cidades
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 17 / 79
Introduc¸a˜o
Introduc¸a˜o
Caminho de menor custo entre duas cidades
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 18 / 79
Introduc¸a˜o
Introduc¸a˜o
Grafos e algoritmos de grafos sa˜o estudados muito antes dos
computadores serem inventados
Grafos sa˜o uteis na ana´lise de redes
Inicialmente para o sistema telefoˆnico
Hoje: Internet, mapa rodovia´rio, projeto de chips de computadores
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 19 / 79
Terminologia
Suma´rio
1 Introduc¸a˜o
2 Terminologia
3 Implementando um grafo
4 Percurso em Grafos
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 20 / 79
Terminologia
Terminologia
Grafo – estrutura de dados que consiste em dois objetos especiais
Ve´rtices – no´s do grafo
Arestas – caminhos, conexo˜es ou ligac¸o˜es entre os ve´rtices
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 21 / 79
Terminologia
Terminologia
Formalmente, um grafo G consiste de dois conjuntos finitos:
1 Ve´rtices V (G)
2 Arestas E (G)
Tipicamente, um grafo G e´ representado como G = (V ,E )
Cada aresta esta´ associada a um conjunto de um ou dois ve´rtices
Um lac¸o ou loop e´ uma aresta que conecta somente um no´ terminal
Dois ve´rtices que sa˜o conectados por uma aresta sa˜o ditos adjacentes
Uma aresta e´ dita ser incidente a cada um de seus no´s terminais
Um ve´rtice que na˜o possui nenhuma aresta incidente e´ chamado de
isolado
Arestas paralelas sa˜o arestas associadas ao mesmo conjunto de
ve´rtices
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 22 / 79
Terminologia
Terminologia
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 23 / 79
Terminologia
Terminologia
V = {v1, v2, v3, v4, v5, v6}
E = {e1, e2, e3, e4, e5, e6, e7}
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 24 / 79
Terminologia
Terminologia
E´ importante notar que o desenho f´ısico do grafo na˜o e´ importante
Veja os grafos a seguir
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 25 / 79
Terminologia
Terminologia
Identificando os ve´rtices e arestas
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 26 / 79
Terminologia
Terminologia
Modelos usando grafos
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 27 / 79
Terminologia
Terminologia
Grafo simples – grafo que na˜o possui lac¸os nem arestas paralelas
Grafo orientado
tambe´m chamado de dirigido ou direcionado ou d´ıgrafo
arestas possuem um sentido
aplicac¸a˜o: ruas de ma˜o u´nica
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 28 / 79
Terminologia
Terminologia
Grafo ponderado
aresta possuem valores associados
valores sa˜o chamados de pesos
aplicac¸a˜o: distaˆncia entre cidades, custo de repasse em links de rede,
etc
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 29 / 79
Terminologia
Terminologia
Grafo completo
cada ve´rtice do grafo esta´ conectado com todos os outros
ou seja, ha´ uma aresta para cada par de ve´rtices distinto
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 30 / 79
Terminologia
Terminologia
Grafos e a´rvores
Podemos perceber que uma a´rvore e´ um tipo especial de grafo
Que tipo de grafo?
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 31 / 79
Terminologia
Terminologia
Grafos e a´rvores
Podemos perceber que uma a´rvore e´ um tipo especial de grafo
Que tipo de grafo?
Um grafo direcionado, conexo e ac´ıclico
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 32 / 79
Implementando um grafo
Suma´rio
1 Introduc¸a˜o
2 Terminologia
3 Implementando um grafo
4 Percurso em Grafos
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 33 / 79
Implementando um grafo
Implementac¸a˜o
Um grafo e´ um tipo abstrato de dados
Va´rias operac¸o˜es sa˜o definidas sobre esse TAD
Criar um grafo vazio
Inserir uma aresta no grafo
Verificar se existe uma aresta no grafo
Obter lista de ve´rtices adjacentes a determinado ve´rtice
Retirar uma aresta do grafo
Imprimir um grafo
Obter nu´mero de ve´rtices do grafo
...
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 34 / 79
Implementando um grafo
Implementac¸a˜o
Existem va´rias representac¸o˜es para implementac¸a˜o de grafos
As duas formas mais utilizadas sa˜o amatriz de adjaceˆncia e a lista de
adjaceˆncia
Estas sera˜o as formas vistas nesta disciplina
Em uma a´rvore, representa´vamos os filhos de um no´
A ideia das listas e matrizes de adjaceˆncia e´ representar os todos os
no´s adjacentes a um determinado no´
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 35 / 79
Implementando um grafo
Implementac¸a˜o
Matriz de Adjaceˆncia
Seja G = (V ,E ) um grafo com ve´rtices v1, v2, ..., vn
A matriz de adjaceˆncia de G e´ uma matriz An×n
Matriz bina´ria
uma posic¸a˜o A[i , j] tem valor 1 se existe um arco do ve´rtice i para o
ve´rtice j , ou 0, caso contra´rio
Para grafos ponderados, A[i , j] tem o valor do peso do arco que liga o
ve´rtice i ao ve´rtice j , ou 0, se na˜o ha´ ligac¸a˜o
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 36 / 79
Implementando um grafo
Implementac¸a˜o
Matriz de Adjaceˆncia
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 37 / 79
Implementando um grafo
Implementac¸a˜o
Matriz de Adjaceˆncia
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 38 / 79
Implementando um grafo
Implementac¸a˜o
Matriz de Adjaceˆncia
Como implementar um grafo utilizando matriz de adjaceˆncia?
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 39 / 79
Implementando um grafo
Implementac¸a˜o com Matriz de Adjaceˆncia
Algoritmo 1: Grafo com matriz de adjaceˆncia
class Grafo{
public:
int** mat adj;
int numVertices;
Grafo(int NumVertices);
void insereAresta(int v1, int v2);
bool existeAresta(int v1, int v2);
bool vazio();
void retiraAresta(int v1, int v2);
void imprime();
};
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 40 / 79
Implementando um grafo
Implementac¸a˜o com Matriz de Adjaceˆncia
A estrutura de dados utilizada por essa implementac¸a˜o e´ uma matriz
“mat adj”
Que sera´ inicializada dinamicamente no construtor da classe
Essa matriz ira´ guardar as informac¸o˜es das arestas existentes no grafo
O co´digo anterior mostrou tambe´m as assinaturas dos me´todos
implementados
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 41 / 79
Implementando um grafo
Implementac¸a˜o
Matriz de Adjaceˆncia
O que precisamos implementar para inicializar o grafo (o construtor)?
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 42 / 79
Implementando um grafo
Implementac¸a˜o com Matriz de Adjaceˆncia
Algoritmo 2: Grafo com matriz de adjaceˆncia: construtor
Grafo::Grafo(int numVertices){
this->numVertices = NumVertices;
this->mat adj = new int*[numVertices];
for ( int i = 0; i < numVertices ; i ++)
this->mat adj[i] = new int[numVertices];
for(int i = 0; i< this->numVertices; i++)
for(int j = 0; j< this->numVertices; j++)
this->mat adj[i][j] = 0;
}
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 43 / 79
Implementando um grafo
Implementac¸a˜o com Matriz de Adjaceˆncia
O construtor inicializa a varia´vel “numVertices”
Em seguida, utiliza esse paraˆmetro para inicializar dinamicamente a
matriz de adjaceˆncia
Por fim, e´ preciso sinalizar que o grafo e´ vazio, colocando 0 nas
posic¸o˜es da matriz
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 44 / 79
Implementando um grafo
Implementac¸a˜o
Matriz de Adjaceˆncia
Como inserir uma aresta no grafo?
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 45 / 79
Implementando um grafo
Implementac¸a˜o com Matriz de Adjaceˆncia
Algoritmo 3: Grafo com matriz de adjaceˆncia: inserir aresta
void Grafo::insereAresta(int v1, int v2){
this->mat adj[v1][v2] = 1;
this->mat adj[v2][v1] = 1;
}
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 46 / 79
Implementando um grafo
Implementac¸a˜o com Matriz de Adjaceˆncia
Para inserir uma aresta entre dois ve´rtices vi e vj , basta sinalizar
A[i , j] = 1
Se o grafo e´ na˜o-direcionado, enta˜o e´ necessa´rio fazer A[j , i ] = 1, pois
ha´ simetria
Se o grafo for ponderado, e´ preciso receber o peso da aresta durante a
inserc¸a˜o
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 47 / 79
Implementando um grafo
Implementac¸a˜o com Matriz de Adjaceˆncia
Algoritmo 4: Grafo com matriz de adjaceˆncia: inserir aresta
void Grafo::insereAresta(int v1, int v2, int peso){
this->mat adj[v1][v2] = peso;
this->mat adj[v2][v1] = peso;
}
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 48 / 79
Implementando um grafo
Implementac¸a˜o com Matriz de Adjaceˆncia
Algoritmo 5: Grafo com matriz de adjaceˆncia: retirar aresta
void Grafo::retiraAresta(int v1, int v2){
this->mat adj[v1][v2] = 0;
this->mat adj[v2][v1] = 0;
}
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 49 / 79
Implementando um grafo
Implementac¸a˜o com Matriz de Adjaceˆncia
Como verificar se existe uma aresta entre dois ve´rtices do grafo?
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 50 / 79
Implementando um grafo
Implementac¸a˜o com Matriz de Adjaceˆncia
Algoritmo 6: Grafo com matriz de adjaceˆncia: existe aresta?
bool Grafo::existeAresta(int v1, int v2){
return (this->mat adj[v1][v2]!=0);
}
Para verificar se existe uma aresta entre vi e vj , basta verificar se
A[i , j]! = 0
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 51 / 79
Implementando um grafo
Implementac¸a˜o com Matriz de Adjaceˆncia
Como verificar se o grafo esta´ vazio?
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 52 / 79
Implementando um grafo
Implementac¸a˜o com Matriz de Adjaceˆncia
Algoritmo 7: Grafo com matriz de adjaceˆncia: verificar se esta vazio
bool Grafo::vazio(){
for(int i = 0; i< this->numVertices; i++)
for(int j = 0; j< this->numVertices; j++)
if (this->mat adj[i][j] != 0)
return false;
return true;
}
Para verificar se o grafo esta´ vazio, e´ preciso percorrer toda a matriz e
verifica se ha´ alguma aresta
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 53 / 79
Implementando um grafo
Implementac¸a˜o com Matriz de Adjaceˆncia
Como imprimir as arestas do grafo?
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 54 / 79
Implementando um grafo
Implementac¸a˜o com Matriz de Adjaceˆncia
Algoritmo 8: Grafo com matriz de adjaceˆncia: imprimir arestas
void Grafo::imprime(){
for(int i = 0; i< this->numVertices; i++){
cout<<i<<“-> ”;
for(int j = 0; j< this->numVertices; j++)
if (this->mat adj[i][j] != 0)
cout<<j<<“ ”;
cout<<endl;
}
}
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 55 / 79
Implementando um grafo
Implementac¸a˜o com Lista de Adjaceˆncia
A representac¸a˜o de um grafo G = (V ,A) por lista de adjaceˆncia
consiste em utilizar uma lista de adjaceˆncia para cada no´ do grafo
Para cada u ∈ V , a lista de adjaceˆncia adj[u] conte´m todos os
ve´rtices v adjacentes a u
A lista de adjaceˆncia de cada ve´rtices pode ser implementada
utilizando arranjos ou estruturas auto-referenciadas
Vamos ver a implementac¸a˜o com estruturas auto-referenciadas
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 56 / 79
Implementando um grafo
Implementac¸a˜o com Lista de Adjaceˆncia
Algoritmo 9: Grafo com lista de adjaceˆncia
class Grafo{
public:
Lista Enc<int> *listas adj;
int numVertices;
Grafo(int numVertices);
void insereAresta(int v1, int v2);
bool existeAresta(int v1, int v2);
bool vazio();
void retiraAresta(int v1, int v2);
void imprime();
};
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 57 / 79
Implementandoum grafo
Implementac¸a˜o com Lista de Adjaceˆncia
A definic¸a˜o da classe e´ praticamente a mesma
A diferenc¸a e´ que temos uma lista de adjaceˆncia para cada ve´rtice do
grafo
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 58 / 79
Implementando um grafo
Implementac¸a˜o com Lista de Adjaceˆncia
Algoritmo 10: Grafo com lista de adjaceˆncia: construtor da classe
Grafo::Grafo(int NumVertices){
this->numVertices = NumVertices;
this->listas adj = new Lista Enc<int>[this->numVertices];
}
Inicializa a varia´vel que conta o nu´mero de ve´rtices
Inicializa as listas de adjaceˆncia dos ve´rtices
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 59 / 79
Implementando um grafo
Implementac¸a˜o com Lista de Adjaceˆncia
Algoritmo 11: Grafo com lista de adjaceˆncia: adicionar aresta
void Grafo::insereAresta(int v1, int v2){
this->listas adj[v1].insere(v2);
this->listas adj[v2].insere(v1);
}
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 60 / 79
Implementando um grafo
Implementac¸a˜o com Lista de Adjaceˆncia
Algoritmo 12: Grafo com lista de adjaceˆncia: inserir aresta
void Grafo::retiraAresta(int v1, int v2){
this->listas adj[v1].retiraItem(v2);
this->listas adj[v2].retiraItem(v1);
}
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 61 / 79
Implementando um grafo
Implementac¸a˜o com Lista de Adjaceˆncia
Algoritmo 13: Grafo com lista de adjaceˆncia: verificar se existe aresta
bool Grafo::existeAresta(int v1, int v2){
return (this->listas adj[v1].pesquisa(v2)!=NULL);
}
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 62 / 79
Implementando um grafo
Implementac¸a˜o com Lista de Adjaceˆncia
Algoritmo 14: Grafo com lista de adjaceˆncia: verificar se esta´ vazio
bool Grafo::vazio(){
for(int vi = 0; vi¡this->numVertices;vi++)
if(!this->listas adj[vi].vazia())
return false;
return true;
}
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 63 / 79
Implementando um grafo
Implementac¸a˜o com Lista de Adjaceˆncia
Algoritmo 15: Grafo com lista de adjaceˆncia: imprimir
void Grafo::imprime(){
for(int vi = 0; vi<numVertices;vi++){
cout<<vi<<“->”;
this->listas adj[vi].imprime();
cout<<endl;
}
}
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 64 / 79
Implementando um grafo
Implementac¸a˜o
Considerac¸o˜es
Qual a implementac¸a˜o mais adequada:
matriz ou lista?
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 65 / 79
Implementando um grafo
Implementac¸a˜o
Considerac¸o˜es
Depende!
O uso de matrizes e´ mais adequado para grafos densos: muitas
arestas
como o grafo possui muitas arestas, enta˜o a matriz fica quase
completamente preenchida
na˜o ha´ desperd´ıcio de espac¸o
Uma vantagem desse tipo de implementac¸a˜o e´ o tempo de acesso a
uma aresta
esse tempo de acesso e´ constante
independe do nu´mero de ve´rtices no grafo
Ideal para aplicac¸o˜es que precisam testar a existeˆncia de arestas com
frequeˆncia
A maior desvantagem do uso de matrizes e´ que elas precisam de V 2
de espac¸o
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 66 / 79
Implementando um grafo
Implementac¸a˜o
Considerac¸o˜es
A implementac¸a˜o com listas de adjaceˆncia e´ ideal para grafos esparsos
possuem muito menos arestas do que ve´rtices
Usar uma matriz nestes casos causa desperd´ıcio de espac¸o
A maior desvantagem desse tipo de implementac¸a˜o e´ o custo de
acesso a uma aresta
e´ preciso buscar na lista de um ve´rtice se ha´ a adjaceˆncia
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 67 / 79
Percurso em Grafos
Suma´rio
1 Introduc¸a˜o
2 Terminologia
3 Implementando um grafo
4 Percurso em Grafos
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 68 / 79
Percurso em Grafos
Percurso em Grafos
O objetivo do percurso em grafos e´ percorrer sistematicamente cada
aresta e ve´rtice de um grafo
Va´rias aplicac¸o˜es na computac¸a˜o:
Computac¸a˜o gra´fica
Verificac¸a˜o formal
Compiladores
Resoluc¸a˜o de problemas
Inteligeˆncia Artificial
Vamos utilizar a implementac¸a˜o com lista de adjaceˆncia
Dois tipos de algoritmos de percurso em grafos muito utilizados:
busca em largura
busca em profundidade
Nesta disciplina, estudaremos apenas a busca em largura
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 69 / 79
Percurso em Grafos
Busca em Largura
Inicia o percurso a partir de um ve´rtice s
Produz uma a´rvore com raiz s e seus ve´rtices alcanc¸a´veis
Se v e´ um ve´rtice alcanc¸a´vel a partir de s, enta˜o o caminho entre s e
v na a´rvore corresponde ao caminho mais curto entre s e v no grafo
Estruturas de dados necessa´rias para implementac¸a˜o
vetor cor[n]: cada ve´rtice do grafo vai estar associado a uma cor
vetor dist[n]: distaˆncia de cada ve´rtice do grafo ao ve´rtice de partida
da busca s
uma estrutura de dados fila
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 70 / 79
Percurso em Grafos
Busca em Largura
Algoritmo 16: Busca em Largura
buscaLargura(s){
para cada vertice u do grafo{
cor[u] ← branco;
dist[u] ←∞;
}
cor[s] ← cinza;
dist[s] ← 0;
fila.enfileira(s);
...
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 71 / 79
Percurso em Grafos
Busca em Largura
Algoritmo 17: Busca em Largura
buscaLargura(s){
...
enquanto(!fila.vazia()){
u ← fila.desenfileira();
para cada vertice v ∈ listas adj[u]{
se (cor[v ] == branco){
cor[v ] ← cinza;
dist[v ] ← dist[u] + 1;
fila.enfileira(v);
}
}
cor[u] ← preto;
}
}
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 72 / 79
Percurso em Grafos
Busca em Largura
As cores sa˜o utilizadas para auxiliar o algoritmo na expansa˜o de
ve´rtices
branco – o ve´rtice esta´ sendo visto pela primeira vez
cinza – o ve´rtice ja´ foi visto, mas na˜o foi expandido
preto – o ve´rtice ja´ foi visto e expandido
O primeiro lac¸o do algoritmo faz as inicializac¸o˜es de cor, distaˆncia e
antecedeˆncia de cada ve´rtice
Em seguida, faz as atribuic¸o˜es para o ve´rtice inicial da busca
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 73 / 79
Percurso em Grafos
Busca em Largura
o lac¸o “enquanto”, faz a expansa˜o de todos os ve´rtices do grafo
a cada iterac¸a˜o, o ve´rtice u que esta´ na frente da fila e´ recuperado
para expansa˜o
todos os ve´rtices v adjacentes a u ainda na˜o expandidos sa˜o
marcados como cinza, tem sua distaˆncia e seu antecedente
atualizados e sa˜o enfileirados para posterior expansa˜o
por fim, quanto todos os adjacentes de u sa˜o examinados, u e´
marcado como ja´ visitado e expandido (cor preta)
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 74 / 79
Percurso em Grafos
Busca em Profundidade
Inicia o percurso a partir de um ve´rtice s
Tambe´m produz uma a´rvore com raiz s e seus ve´rtices alcanc¸a´veis
Explora recursivamente os ve´rtices do grafo a partir de arestas na˜o
exploradas ainda, mais fundo no grafo quanto poss´ıvel
Processo continua ate´ que todos os ve´rtices alcanc¸a´veis a partir da
origem tenham sido descobertos
Estruturas de dados necessa´rias para implementac¸a˜o
vetor cor[n]: cada ve´rtice do grafo vai estar associada a uma cor
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 75 / 79
Percurso em Grafos
Busca em Profundidade
Algoritmo 18: Busca em Profundidade: inicializac¸a˜o
buscaProfundidade(s){
para cada vertice u do grafo{
cor[u] ← branco;
}
visite(s);
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 76 / 79
Percurso em GrafosBusca em Profundidade
Algoritmo 19: Busca em Profundidade: passo recursivo
visite(u){
cor[u] ← cinza;
para cada vertice v ∈ listas adj[u]{
se (cor[v ]) == branco
visite(v);
}
cor[u] ← preto;
}
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 77 / 79
Percurso em Grafos
Busca em Profundidade
A primeira fase do algoritmo e´ a etapa de inicializac¸a˜o, onde cada
ve´rtice recebe a cor branca
A segunda fase do algoritmo e´ o passo recursivo, onde ocorre a busca
em profundidade efetivamente
Inicialmente o ve´rtice u que esta´ sendo visitado e´ marcado com a cor
cinza
Em seguida, a visita e´ chamada recursivamente para cada ve´rtice
adjacente ao ve´rtice u
Ao final, o ve´rtice u e´ marcado com a cor preta, indicando que a visita
para o ve´rtice esta´ finalizada
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 78 / 79
Percurso em Grafos
Du´vidas
Utilizem o ambiente para tirar du´vidas!
Rodolfo Carneiro Cavalcante (UFAL) Aula 07Grafos 5 de Novembro de 2015 79 / 79
	Introdução
	Terminologia
	Implementando um grafo
	Percurso em Grafos

Continue navegando