Você está na página 1de 30

Introdução

a Grafos
Byron Leite
Dantas Bezerra
Exemplo de Grafo
 Pode representar
uma rede de
computadores
 Cada computador da
rede é um vértice do
Grafo
 A conexão entre dois
computadores é
representada por
uma aresta do Grafo

Byron Leite Dantas Bezerra


Exemplo de Grafo
 Pode representar um mapa de vôos
 Cada ponto do mapa (cidade) é um
vértice do Grafo
 A linha aérea entre duas cidades é
representada por uma aresta do Grafo

Man Rec

BSB Sal

Sao Rio
Byron Leite Dantas Bezerra
Tipos de Grafos
 Grafo direcionado
 Suas arestas são direcionadas

Man Rec

BSB Sal

Sao Rio

Byron Leite Dantas Bezerra


Tipos de Grafos
 Grafo ponderados
 Suas arestas possuem pesos

Man Rec
3480 2220
845 839
2660
3490
BSB 1038 Sal
1659
445 1649
1015 Sao Rio
429

Byron Leite Dantas Bezerra


Definição
 Um grafo é um par de conjuntos,
G(V, E), onde:
 V é um conjunto finito de vértices
 E é uma relação entre vértices, ou
seja, um conjunto de pares em
VxV.

Quem são V e E nos exemplos anteriores ?

Byron Leite Dantas Bezerra


Representação Interna
 Normalmente há alguns elementos
que precisam ser definidos antes
mesmo de definirmos um grafo
 Vértice

 Aresta
• Representação Explícita
• Representação Implícita através de:
• Lista de Incidência
• Matriz de Adjacência

Byron Leite Dantas Bezerra


Vértice
public class Vertice {
// informação armazenada

Object valor;
// flag de controle usado em diversos algoritmos

boolean foiVisitado;
// ...

}
Byron Leite Dantas Bezerra
Aresta
Representação Explícita
public class Aresta {
// vértices que compõe a aresta

Vertice origem, destino;


// flag de controle usado em diversos algoritmos

boolean foiVisitada;
// ...

}
Byron Leite Dantas Bezerra
Grafo Não Direcionado
Representação Explícita
Man Rec

BSB Sal

Sao Rio

vertices Man BSB Sao Rio Sal Rec


Grafo
arestas Man BSB BSB Man BSB Rec Rec BSB Sao Rio

Rio Sao Sal Rec Rec Sal


Byron Leite Dantas Bezerra
Rio Sal ...
Grafo Direcionado
Representação Explícita
Man Rec

BSB Sal

Sao Rio

vertices Man BSB Sao Rio Sal Rec


Grafo
arestas BSB Man BSB Sao Rec BSB Sao Rec Rio Sao

Sal Rio Sal Rec


Byron Leite Dantas Bezerra
Grafo Ponderado
Representação Explícita
 Para armazenarmos os pesos nas
arestas do grafo basta definirmos um
novo atributo na classe Aresta

public class Aresta {


// vértices que compõe a aresta
Vertice origem, destino;
// flag de controle usado em diversos algoritmos
boolean foiVisitada;
// define o peso dessa aresta
double peso;
} Byron Leite Dantas Bezerra
Grafo (independente do tipo)
Representação Explícita
public class Grafo {
// coleção de vértices que compõe o grafo

List vertices;
// coleção de arestas que compõe o grafo

List arestas;
// ...

}
O fato do grafo ser direcionado ou não,
influi em boa parte dos
Byron Leite algoritmos
Dantas Bezerra de grafos!
Representação
Implícita

Lista de Incidência

Byron Leite Dantas Bezerra


Man Rec

Representação
BSB Implícita
Sal
Lista de Incidência
Sao Rio

Man BSB

BSB Man Sao Rec

Sao BSB Rio Rec

Rio Sao Sal

Sal Rio Rec

Rec BSB SaoByronSal


Leite Dantas Bezerra
Man Rec

Representação
BSB Implícita
Sal
Lista de Incidência
Sao Rio

Man BSB

BSB Sao

Sao Rio

Rio

Sal Rio

Rec BSB SaoByronSal


Leite Dantas Bezerra
Grafo Ponderado
Representação Implícita
 Para armazenarmos os pesos nas
arestas do grafo precisamos ter em
cada posição da lista de incidência
um par (vértice, peso)

public class ParVerticePeso {


// vértice incidente
Vertice v;
// define o peso dessa ligação
double peso;
}
Byron Leite Dantas Bezerra
Grafo (independente do tipo)
com Lista de Incidência
 Podemos utilizar uma Hashtable onde
a key é um dos Vértices do Grafo e o
value é uma lista de:
 vértices incidentes no caso normal;
 ou de ParVerticePeso, no caso ponderado

public class Grafo {


// tabela do tipo (V, List)

Hashtable vertices;
// ...

} Byron Leite Dantas Bezerra


Representação
Implícita

Matriz de Adjacência

Byron Leite Dantas Bezerra


Man Rec

BSB Sal

Sao Rio

vertices Man BSB Sao Rio Sal Rec


Grafo
matriz Man BSB Sao Rio Sal Rec
Man 0 1 0 0 0 0
BSB 1 0 1 0 0 1
Sao 0 1 0 1 0 1
Rio 0 0 1 0 1 0
Sal 0 0 0 1 0 1
Rec 0 1 1 0 1 0

Byron Leite Dantas Bezerra


Man Rec

Representação
BSB Implícita
Sal
Lista de Incidência
Sao Rio

vertices Man BSB Sao Rio Sal Rec


Grafo
matriz Man BSB Sao Rio Sal Rec
Man 0 1 0 0 0 0
BSB 0 0 1 0 0 0
Sao 0 0 0 1 0 0
Rio 0 0 0 0 0 0
Sal 0 0 0 1 0 0
Rec 0 1 1 0 1 0

Byron Leite Dantas Bezerra


Man 22
Rec
34
8
Representação
BSB Implícita
Sal
26

Lista de Incidência
10
Sao Rio
16
4

vertices Man BSB Sao Rio Sal Rec


Grafo
matriz Man BSB Sao Rio Sal Rec
Man 0 34 ∞ ∞ ∞ ∞
BSB ∞ 0 10 ∞ ∞ ∞
Sao ∞ ∞ 0 4 ∞ ∞
Rio ∞ ∞ ∞ 0 ∞ ∞
Sal ∞ ∞ ∞ 16 0 ∞
Rec ∞ 22 26 ∞ 8 0

Byron Leite Dantas Bezerra


Grafo (independente do tipo)
com Matriz de Adjacência
public class Grafo {
// coleção de vértices que compõe o grafo

List vertices;
// matriz de incidência do grafo

double[][] matriz;
// ...

}
Os valores iniciais da matriz de adjacência
depende doByron
tipoLeite
deDantas
grafo considerado!
Bezerra
Conceitos
 Arestas incidentes
 a,b,d são incidentes a V
 Vértices adjacentes
 U,V são adjacentes
 Grau de um vértice
 Grau(X) = 5
 Arestas paralelas
 h,i são paralelas
 Auto-loop: j

Byron Leite Dantas Bezerra


Conceitos

 Passeio
 P1= {V,X,Z}
 P2 = {U,W,X,Y,W,V}
 Passeio Simples
(Caminho)
 Todos os vértices
são distintos (P1)

Byron Leite Dantas Bezerra


Conceitos
 Ciclo (Passeio
Fechado)
 Passeio onde o vértice
final é o vértice inicial
 Exemplos: C1, C2
 Ciclo Simples
(Caminho Fechado)
 Todos os vértices do
ciclo são distintos
exceto o inicial e o final
 Exemplo: C1

Byron Leite Dantas Bezerra


Conceitos
 Um sub-grafo G’(V’, E’) de
G(V,E) é um grafo tal que:
 V’ ⊆ V
 E’ ⊆ E ∩ (V’ x V’)

F
A A
C C
G E G’
B B
D
Byron Leite Dantas Bezerra
Conceitos
 Grafo Conexo
 Existe um passeio de um vértice
para qualquer outro vértice do
grafo

F
A G
C I
G E
B H
D
G é desconexo!
Byron Leite Dantas Bezerra
Operações em Grafos
 int numVertices();
 int numArestas();
 int grau(Vertice v);
 Iterator verticesAdjacentes(Vertice v);
 Iterator arestasIncidentes(Vertice v);
 boolean saoAdjacentes(Vertice v, Vertice w);
 void insereVertice(Vertice v);
 void insereAresta(Vertice v, Vertice w);
 void removeVertice(Vertice v);
 void removeAresta(Aresta e);

Byron Leite Dantas Bezerra


Exercício (em Dupla)
Entrega: 26/04
 Implemente uma estrutura de
um grafo não direcionado e não
ponderado utilizando uma das
representações internas vistas
em sala
 Implemente os 10 métodos
padrões de grafos vistos no slide
anterior
Byron Leite Dantas Bezerra

Você também pode gostar