Você está na página 1de 90

Estructuras de Dados II

Professor: MSc. Yurisbel Vega Ortiz

Agosto 2016
Tema # 2 Grafos.

Conferência # 2 O TDA Grafo.


Objectivo
• Caracterizar o TDA Grafo com suas operações e sua
representação mediante lista de vértices-matriz de
adjancencia.
Sumário:
1. Introdução.
2. Definições e terminologia.
3. Operações sobre o TDA Grafo.
4. Algoritmos para o percurso de grafos.
Percorrido em profundidade e na largura.
5. Estruturas de dados para a implementação
do TDA Grafo.
Introdução
- As árvores só permitem armazenar elementos
cuja única relação existente entre eles é uma
relação hierárquica, por exemplo “X é pai de E”.

- Esta relação tem como limitante que não é


simétrica, isto é, se “X é pai de E” não se pode
dizer que “E é pai de X”.
Introdução
- Em problemas práticos podem existir relações
que sejam simétricas e que provoquem ciclos na
estrutura. Por exemplo “X é amigo de E”.

é amigo B

A é amigo

é amigo C
Para Facebook a relação de amizade sempre é simétrica
Definições e
terminologias da
Teoria de Grafos
Definições #1:
Um grafo Não Dirigido G é um par G = (V, A)
onde V é um conjunto finito de elementos que se
denominam Vértices e A é um conjunto de
pares não ordenados <x , y>, onde x, y  V,
denominados Arestas ou Arcos.

Quando se diz que A é um conjunto de pares


não ordenados <x , y>, significa que os pares
<x, y> e <y, x> se referirão a uma mesma
aresta.
Exemplo #1 : Grafo Não Dirigido
G = (V, A)
- V = {a, b, c, d, e}
- A = {<a, b>, <a, e>, <b, e>, <b, d>, <e, c>,
<e, d>, <c, d>}
a b

c d
Definições #2:
Um grafo dirigido G é um par G = (V, A) onde V
é um conjunto finito de elementos que se
denominam Vértices e A é um conjunto de
pares ordenados <x, y>, onde x ,y  V,
denominados Arestas ou Arcos.

Quando se diz que A é um conjunto de pares


ordenados <x, y> , significa que os pares <x, y>
y <y, x> e não se referirão a uma mesma aresta.
Exemplo #2 : Grafo Dirigido
G = (V, A)
- V = {a, b, c, d, e}
- A = {<a, b>, <a, e>, <b, e>,<b, d>, <c, e>,
<c, d>,<d, e>}
a b

c d
Definições #3:
Um grafo (dirigido / não dirigido) ponderado G
é um grafo onde à cada uma das arestas se lhe
associa um peso (um valor real positivo).
Exemplo #3 : Grafo Ponderado
G = (V, A)
- V = {a, b, c, d, e}
- A = {<a, b>, <a, e>, <b, e>, <b, d>, <e, c>,
<e, d>, <c, d>}
5
a b
8 4
10
11 e 6
3
c d
Vértices Adjacentes: Num grafo G = (V, A),
um vértice y é adjacente a outro vértice x se
o par é uma aresta do grafo G.

a
i

b c d
Vértices j
Adjacentes
e f g h

Vértices não
Adjacentes
Caminho: Num grafo G = (V, A) um caminho de
longitude n (n  0) é uma sucessão de vértices
v0 , v1, …, vn onde cada vértice vk é adjacente
vk-1 para 1  k  n. Neste caso se diz que o
caminho vai de v0 a vn.

Caminhos: a
i
(c, f, e, b, c, a, d, g)
(b, c, f, e, b) b c d
(a, d, g, h) j

e f g h
Caminho simples: Um caminho é simples se
os vértices que o compõem são diferentes
exceto possivelmente o primeiro e o último.

a
i
Caminhos simples:
b c d
(b, c, a, d, g) j
(b, c, f, e, b)
(a, d, g, h) e f g h
Longitude de um caminho: A longitude de um
caminho é o número de arcos que o
compõem.

Ciclo (ou circuito): É um caminho que


começa e acaba no mesmo vértice. Os
ciclos de longitude 1 se denominam bucles.
a
i
Ciclo: (c, f, e, b, c)
b c d
j
Bucle: (i, i)
e f g h
Grafo conexo (conectado): Um grafo é
conexo se existe ao menos um caminho
de qualquer vértice a qualquer outro.

a a
i
b c d c d
b
j
e f g h e f g h

Grafo conexo Grafo Não conexo


Responsabilidades do
TDA Grafo
1. Criar()
Constrói um grafo vazio, isto é, um
grafo sem vértices nem arestas.
2. EVazio()
Retorna verdadeiro se o grafo é vazio,
retorna falso em caso contrário.
3. CopiarEm( NuevoGrafo)
Realiza uma cópia do grafo na instância
NuevoGrafo.
4. NumeroDeVertices()
Retorna o número de vértices do grafo.

5. NumeroDeArcos()
Retorna o número de arestas do grafo.

6. EstaOVertice(Vertice)
Retorna verdadeiro se existe um vértice no
grafo igual a Vertice, isto é, se existe um
vértice no grafo cuja informação é igual à
informação armazenada em Vertice.
Retorna falso em caso contrário.
7. EstaOArco( Vertice1, Vertice2)
Retorna verdadeiro se o grafo contém um
par de vértices V1 e V2 tal que:

- V1 é igual a Vértice1
- V2 é igual a Vértice2
- <V1, V2> é um arco

em caso contrário retorna falso.


8. InserirVertice(Vertice)
Insere no grafo um novo vértice com a
informação contida em Vertice.

9. InserirArco(Vertice1, Vertice2)
Pré condição: O grafo contém um par de vértices
tal que:
_ V1 é igual a Vértice1
– V2 é igual a Vértice2
–<V1, V2> não é um arco de G.

Pos condição : <V1, V2> passa a ser um arco de G.


10. EliminarVertice( Vertice)
Pré condição: O grafo possui um vértice V
que é igual a Vertice.
Pos condição: Vertice e todos os arcos em
que ele intervém são eliminados do grafo.
11. EliminarArco(Vertice1, Vertice2)
Pré condição: O grafo contém um par de
vértices tal que:
_ V1 é igual a Vértice1
– V2 é igual a Vértice2
– <V1, V2> é um arco
Pos condição: <V1, V2> deixa de ser um
arco no grafo G.
12. AdyacentesA(Vertice): ListaDeAyacentes
Pré condição: O grafo inclui um vértice V que
é Igual a Vertice
Pos condição: ListaDeAdyacente contém a
todos os vértices adjacentes a Vertice.

13. Substituir(VerticeVelho, VerticeNovo).


Pré condição: O grafo contém um vértice V1
que é igual a VérticeVelho e nenhum vértice
V do grafo é igual a VérticeNovo.
Pos condição: V1 é substituído por
VérticeNovo.
14. PercorridoEmProfundidade(): ListaDeVertices
Pos condição: ListaDeVertices é uma lista que
contém todos os vértices do grafo no ordem em
que foram visitados segundo a estratégia de
percurso em profundidade.

15. PercorridoNaLargura(): ListaDeVertices


Pos condição: ListaDeVertices é uma lista que
contém todos os vértices do grafo no ordem em
que foram visitados segundo a estratégia de
percurso na largura.
Descrição dos
algoritmos de
percursos
Percorrido em
profundidade
PercorridoEmProfundidade
• Para a cada vєV marcar v
como não visitado
• Para cada vєV fazer
– Se v não está visitado
então BPP(v)
BPP(v) /*o vértice v não está visitado
• Marcar v como visitado
• Para a cada w adjacente a v
fazer
– Se w não está visitado então
BPP(w)
A I

B C D J

E F G H

Marcar todos como não visitados


A I

B C D J

E F G H

BPP(v)
1BPP(A) A I

B C D J

E F G H

Percurso
A,
1BPP(A) A I

1.1BPP(B) D J
B C

E F G H

Percurso
A,B,
1BPP(A) A I
1.1BPP(B)
B C D J
1.1.1BPP(C)

E F G H

Percurso
A,B,C
1BPP(A) A I

1.1BPP(B)
B C D J
1.1.1BPP(C)
1.1.1.1BPP(F)
E F G H

Percurso
A,B,C,F,
1BPP(A) A I

1.1BPP(B)
B C D J
1.1.1BPP(C)
1.1.1.1BPP(F)
E F G H
1.1.1.1.1BPP(E)

Percurso
A,B,C,F,E,
1BPP(A) A I

1.1BPP(B)
B C D J
1.1.1BPP(C)
1.1.1.1BPP(F)
E F G H
1.1.1.1.1BPP(E)

Todos os adjacentes a E estão visitados

Percurso
A,B,C,F,E,
A I
1BPP(A)
1.1BPP(B) J
B C D
1.1.1BPP(C)
1.1.1.1BPP(F)
E F G H
1.1.1.1.1BPP(E)

Percurso
A,B,C,F,E,
1BPP(A) A I

1.1BPP(B)
B C D J
1.1.1BPP(C)
1.1.1.1BPP(F)
E F G H
1.1.1.1.1BPP(E)

Todos os adjacentes a F estão visitados

Percurso
A,B,C,F,E,
1BPP(A) A
I
1.1BPP(B)
B C D J
1.1.1BPP(C)
1.1.1.1BPP(F)
E F G H
1.1.1.1.1BPP(E)

Percurso
A,B,C,F,E,
A I
1BPP(A)
1.1BPP(B) B C D J
1.1.1BPP(C)
1.1.1.1BPP(F) E F G H
1.1.1.1.1BPP(E)

Todos os adjacentes a C estão visitados

Percurso
A,B,C,F,E,
A
1BPP(A) I

1.1BPP(B)
B C D J
1.1.1BPP(C)
1.1.1.1BPP(F) H
E P
F G
1.1.1.1.1BPP(E)

Percurso
A,B,C,F,E,
1BPP(A) A I

1.1BPP(B)
J
B C D
1.1.1BPP(C)
1.1.1.1BPP(F)
E F G H
1.1.1.1.1BPP(E)

Todos os adjacentes a B [ E,C y A] estão visitados

Percurso
A,B,C,F,E,
1BPP(A) A I

1.1BPP(B)
B C D J
1.1.1BPP(C)
1.1.1.1BPP(F)
E F G H
1.1.1.1.1BPP(E)

Percurso
A,B,C,F,E,
1BPP(A) A I

1.1BPP(B)
B C D J
1.1.1BPP(C)
1.1.1.1BPP(F)
E F G H
1.1.1.1.1BPP(E)

Há um adjacentes A não visitado

Percurso
A,B,C,F,E,
A I
1BPP(A)
1.1BPP(B) J
B C D
1.1.1BPP(C)
1.1.1.1BPP(F) H
E F G
1.1.1.1.1BPP(E)
1.2BPP(D)

Percurso
A,B,C,F,E,D,
A
1BPP(A) I

1.1BPP(B)
B C D J
1.1.1BPP(C)
1.1.1.1BPP(F) H
E F G
1.1.1.1.1BPP(E)
1.2BPP(D)
1.2.1BPP(G)

Percurso
A,B,C,F,E,D,G,
A I
1BPP(A)
1.1BPP(B) J
B C D
1.1.1BPP(C)
1.1.1.1BPP(F) H
E F G
1.1.1.1.1BPP(E)
1.2BPP(D)
1.2.1BPP(G)
1.2.1.1BPP(H)
Percurso
A,B,C,F,E,D,G,H,
1BPP(A) A I

1.1BPP(B)
B C D J
1.1.1BPP(C)
1.1.1.1BPP(F)
E F G H
1.1.1.1.1BPP(E)
1.2BPP(D)
1.2.1BPP(G)
1.2.1.1BPP(H)
Todos os adjacentes a H estão visitados
Percurso
A,B,C,F,E,D,G,H,
1BPP(A) A I

1.1BPP(B)
B C D J
1.1.1BPP(C)
1.1.1.1BPP(F)
E F G H
1.1.1.1.1BPP(E)
1.2BPP(D)
1.2.1BPP(G)
1.2.1.1BPP(H)

Percurso
A,B,C,F,E,D,G,H,
A
1BPP(A) I

1.1BPP(B)
B C D J
1.1.1BPP(C)
1.1.1.1BPP(F) H
E F G
1.1.1.1.1BPP(E)
1.2BPP(D)
1.2.1BPP(G)
1.2.1.1BPP(H)
Todos os adjacentes a G estão visitados
Percurso
A,B,C,F,E,D,G,H,
A
1BPP(A) I

1.1BPP(B)
B C D J
1.1.1BPP(C)
1.1.1.1BPP(F) H
E F G
1.1.1.1.1BPP(E)
1.2BPP(D)
1.2.1BPP(G)
1.2.1.1BPP(H)
Percurso
A,B,C,F,E,D,G,H,
A
1BPP(A) I

1.1BPP(B)
B C D J
1.1.1BPP(C)
1.1.1.1BPP(F) H
E F G
1.1.1.1.1BPP(E)
1.2BPP(D)
1.2.1BPP(G)
1.2.1.1BPP(H)
Todos os adjacentes a D estão visitados

Percurso
A,B,C,F,E,D,G,H,
A I
1BPP(A)
1.1BPP(B) B C D J
1.1.1BPP(C)
1.1.1.1BPP(F) E F G H
1.1.1.1.1BPP(E)
1.2BPP(D)
1.2.1BPP(G)
1.2.1.1BPP(H)
Percurso
A,B,C,F,E,D,G,H,
1BPP(A) A
I
1.1BPP(B)
B C D J
1.1.1BPP(C)
1.1.1.1BPP(F)
E F G H
1.1.1.1.1BPP(E)
1.2BPP(D)
1.2.1BPP(G)
1.2.1.1BPP(H)
Todos os adjacentes a A estão visitados
Percurso
A,B,C,F,E,D,G,H,
PercursoProfundidade
• Para a cada vєV fazer
– Se v não esta visitado então BPP(v)
BPP(A) BPP(I)
A
I

B C D J

E F G H
A
1BPP(A) I

1.1BPP(B) B C D J
1.1.1BPP(C)
1.1.1.1BPP(F) E F G H

1.1.1.1.1BPP(E)
1.2BPP(D)
1.2.1BPP(G)
1.2.1.1BPP(H)
Percurso
2BPP(I) A,B,C,F,E,D,G,H,I,
A
1BPP(A) I

1.1BPP(B) B C D J
1.1.1BPP(C)
1.1.1.1BPP(F) E F G H

1.1.1.1.1BPP(E)
1.2BPP(D)
1.2.1BPP(G)
1.2.1.1BPP(H)
Percurso
2BPP(I) A,B,C,F,E,D,G,H,I,J
2.1BPP(j)
A
1BPP(A) I

1.1BPP(B) B C D J
1.1.1BPP(C)
1.1.1.1BPP(F) E F G H

1.1.1.1.1BPP(E)
1.2BPP(D)
1.2.1BPP(G) Todos os adjacentes a
1.2.1.1BPP(H) J estão visitados
2BPP(I)
Percurso
2.1BPP(j) A,B,C,F,E,D,G,H,I,J
A
1BPP(A) I

1.1BPP(B) B C D J
1.1.1BPP(C)
1.1.1.1BPP(F) E F G H

1.1.1.1.1BPP(E)
1.2BPP(D)
1.2.1BPP(G)
1.2.1.1BPP(H)
2BPP(I)
Percurso
2.1BPP(j) A,B,C,F,E,D,G,H,I,J
A
1BPP(A) I

1.1BPP(B) B C D J
1.1.1BPP(C)
1.1.1.1BPP(F) E F G H

1.1.1.1.1BPP(E)
1.2BPP(D)
1.2.1BPP(G)
Todos os adjacentes a I
1.2.1.1BPP(H) estão visitados
2BPP(I)
Percurso
2.1BPP(j) A,B,C,F,E,D,G,H,I,J
PercursoProfundidade
• Para a cada vєV fazer
– Si v não esta visitado então BPP(v)
A
I

B C D J

E F G H

Como todos os vértices foram


visitados o algoritmo termina.
Percurso na largura
PercorridoNaLargura
• Para a cada vєV marcar v como
não visitado
• Para a cada vєV fazer
- Se v não está visitado
então BPL(v)
BPL(v) /* o vértice v não está visitado
• Fila ← Ø
• Marcar v como visitado
• Inserir v na Fila
• Enquanto Fila não é vazia fazer
– u← Frente da Fila e elimino u da Fila
– Para a cada w adjacente a u fazer
• Se w não está visitado então
Marcar w como visitado
Inserir w na Fila
A

B C D

E F G H

Marcar todos como não visitados


A

B C D

E F G H

BPL(v)
BPL(A) IF
• Fila ← Ø
• Marca-se A como
visitado A
I F
• Insere-se A na Fila

A
A

B C D

H
Percurso
E F G
A,
I F
Como a fila não é vazia
u← A
A
I F
elimino A da Fila
A

B C D

E F G H

Adj(A)={ B,C,D}
FI
A Cada Adj(A)={ B,C,D}
Marca-se como visitado

I F

Inserem-se na Fila
B C D
A

B C D

Percurso,
E F G H
A,B,C,D,
I F
Como a fila não é vazia
u← B e
B C D
elimino B da Fila I F

A
C D
B C D

E F G H

Para a cada Adj(B)={A,C,E}


I F
Para Adj(B)={ A,E,C}
O não visitado E se marca
como visitado C D
I F
Insere-se E na Fila
C D E
A

B C D

Percurso,
E F G H
A,B,C,D,E,
Como a fila não é vazia I F
u← C
C D E
elimino C da Fila
I F
A

D E
B C D

E F G H

Para a cada Adj(C)={A,B,F}


I F
Para Adj(C)={ A,B,F}
O não visitado F se marca
como visitado D E

I F
Insere-se F na Fila

A D E F

B C D

Percurso,
E F G H
A,B,C,D,E,F,
I F
Como a fila não é vazia
u← D
D E F

elimino D da Fila I F
A

E F
B C D

E F G H

Para a cada Adj(D)={A,G,H}


I F
Para Adj(D)={ A,G,H}
Os não visitados G y H E F
se marcan como visitados
I F

Inserem-se G e H na Fila
E F GH
A

B C D

H
Percurso,
E F G
A,B,C,D,E,F,G,H
Como a fila não é vazia
I F
u← E

elimino E da Fila E F G H
A
I F

B C D
F G H
E F G H

Como os Adj(E)={B,F}
foram visitados não se faz
nada
Como a fila não é vazia I F
u← F
F G H
Elimino F da Fila I F
A

D
G H
B C

E F G H

Como os Adj(F)={C,E}
foram visitados não se faz
nada
I F
Como a fila não é vazia
u← G
G H
Elimino G da Fila
A
IF

B C D
H
E F G H

Como os Adj(G)={D,H}
foram visitados não se faz
nada
Como a fila não é vazia I F
u← H
H
Elimino H da Fila
I F
A

B C D

E F G H
Como os Adj(H)={D,G}
foram visitados não se faz
nada
PercorridoNaLargura
• …..
• Enquanto Fila não é vazia fazer
• // um conjunto de instruções //
FI

Como a fila é vazia o algoritmo termina


Percurso,
A,B,C,D,E,F,G,H
Estruturas de dados
para a representação
de grafos
Lista de vértices
e
Matriz de adjacencia
Para o grafo G=(V,A) a A B
representação de Lista
de vértices e matriz de E
adjacencia é:
C D
0 1 2 3 4
A B C D E

0 1 2 3 4
0 0 1 0 0 1
1 1 0 0 1 1 1 si i adj j
G= 2 0 0 0 1 1 Gi,j =
3 0 1 1 0 1 0 si i não adj j
4 1 1 1 1 0
Lista de vértices
e
Lista de adjacencia
Para o grafo G=(V,E) a B
representação de Lista
de vértices e Listas de A D
adyacencia é:
C
0 1 2 3 V
A B C D

0 1 2 3 E
1 0 3

2 0
3 0 1
Bibliografia
-Estructuras de Datos, Algoritmos y
Programación Orientada a Objetos,
Gregory L. Heileman, Universidad de
Nuevo México, Capítulo 14.
-Estructuras de Datos y Algoritmos,
A. V. Aho, J. E. Hopcroft, J. D.
Ullman, Capítulos 6 y 7

Você também pode gostar