Vous êtes sur la page 1sur 108

BC0506 - Comunicao e Redes

Aula 04 Busca em profundidade


David Correa Martins Jr
david.martins@ufabc.edu.br

Aula passada
Algoritmo de busca em largura.

b
5

n
m

10

m
Grafo de entrada

rvore de busca em largura

Roteiro da aula

Grafos
- Definies: rvore e florestas.
Algoritmos de buscas em grafos
- Busca em profundidade
Atividade prtica

I. Definies

Definies
Uma rvore um grafo conexo e acclico (sem ciclos).
As rvores so muito teis para organizar informao.

rvore no-direcionada

rvore direcionada
5

Definies
O seguinte grafo uma rvore?

7
5

Definies
O seguinte grafo uma rvore?
0: 5,1
1: 0,2,3,4
2: 1
3: 1
4: 1
5: 0
6: 7,8
7: 6
8: 6

Definies
O seguinte grafo uma rvore?
0: 5,1
1: 0,2,3,4
2: 1
3: 1
4: 1
5: 0
6: 7,8
7: 6
8: 6

3
4

Uma floresta um conjunto de rvores.


8

Definies
Toda rvore com V vrtices tem exatamente V-1 arestas.

2
3
4

V=9

V=6

V=3
9

Definies
Toda floresta com V vrtices e C componentes conexas tem
exatamente V-C arestas.

11

12
13
14

15
3
4

Uma floresta com 14 vrtices, e 3 componentes, tem 11 arestas.


10

Definies
Folhas: vrtices de grau 1 na floresta
Tambm chamadas de ns terminais

11

12
13
14

15
3
4

11

rvore de genealogia acadmica de J. Bernoulli


Johann Bernoulli
Leonhard Euler

Samuel Konig

Grafo direccionado
Vrtices: 81.768
Arestas: 88.921
12

II. Busca em profundidade

13

Busca em profundidade
A estrategia seguida pela busca em profundidade , como seu nome
implica, procurar cada vez mais fundo no grafo.
Nessa busca as arestas so
exploradas a partir do vrtice
mais recentemente descoberto
que ainda possui arestas
inexploradas saindo dele.
Baseado em Pilha.

14

Busca em profundidade

Fila

First In, First Out

Pilha

Last In, First Out


15

Busca em profundidade

Inicialmente, parte-se de um dado vrtice {s}


Os vrtices so explorados a partir do vrtice mais recentemente
descoberto.
16

Busca em grafos

17

Busca em grafos

Busca em largura
(Breadth First Search - BFS)

Busca em profundidade
(Depth First Search - DFS)
18

Busca em profundidade
O algoritmo de busca em profundidade tambm atribui cores a
cada vrtice

19

Busca em profundidade
Grafo inicial
7

20

Busca em profundidade (origem s=4)

Pilha={4}
7

4
0
Indica tempo de visita

21

Busca em profundidade (origem s=4)

Pilha={4,1}
7

4
0

22

Busca em profundidade (origem s=4)

Pilha={4,1,2}
7

4
0

23

Busca em profundidade (origem s=4)

Pilha={4,1,2,7}

4
0

24

Busca em profundidade (origem s=4)

Pilha={4,1,2}

3/4

4
0

25

Busca em profundidade (origem s=4)

Pilha={4,1,2,5}

3/4

7
5
2

4
0

26

Busca em profundidade (origem s=4)

Pilha={4,1,2,5,3}

3/4

7
5
2

4
0

27

Busca em profundidade (origem s=4)

Pilha={4,1,2,5,3,6}

3/4

7
5
2

4
0

28

Busca em profundidade (origem s=4)

Pilha={4,1,2,5,3}

3/4

7
5
2

7/8

4
0

29

Busca em profundidade (origem s=4)

Pilha={4,1,2,5}

3/4

7
5
2

6/9

6
7/8

4
0

30

Busca em profundidade (origem s=4)

Pilha={4,1,2}

3/4

7
5/10
2

6/9

6
7/8

4
0

31

Busca em profundidade (origem s=4)

Pilha={4,1}

3/4

7
5/10
2/11

6/9

6
7/8

4
0

32

Busca em profundidade (origem s=4)

Pilha={4}

3/4

7
5/10
2/11

6/9

1/12

6
7/8

4
0

33

Busca em profundidade (origem s=4)

Pilha={}

3/4

7
5/10
2/11

6/9

1/12

6
7/8

4
0/13
Indica tempo de visita

34

Busca em largura (Algoritmo)


Constantes:
BRANCO, CINZA, PRETO, INFINITO
Variveis:
P (Pilha) , s (vrtice de origem)
Propriedades do vrtice v:
v.cor (cor do vrtice)
v.t1 (tempo de visita inicial do vrtice v)
v.t2 (tempo de visita final do vrtice v)
Funes :
Insere(P,v): permite inserir o vrtice v na pilha P.
Remove(P): permite remover um vrtice do topo da pilha P.
Topo(P): devolve o vrtice do topo da pilha P.
35

Busca em profundidade (Depth First Search)


DFS(G,s):
Para cada vrtice v em G.V-{s} faa
v.cor = BRANCO
v.t1 = INFINITO
v.t2 = INFINITO
tempo = 0
s.cor = CINZA
s.t1 = tempo
P = VAZIO
Insere(P,s)
Enquanto P
VAZIO faa
u = Topo(P)
Se u tem pelo menos um vrtice adjacente BRANCO
v = escolhe um dos vrtices adjacentes com v.cor=BRANCO
v.cor = CINZA
tempo = tempo+1
v.t1 = tempo
Insere(P,v)
Caso-contrrio
u.cor = PRETO
tempo = tempo+1
v.t2 = tempo
Remove(P)

36

Busca em profundidade (Depth First Search)


DFS(G,s):
Para cada vrtice v em G.V-{s} faa
v.cor = BRANCO
v.t1 = INFINITO
v.t2 = INFINITO
tempo = 0
s.cor = CINZA
s.t1 = tempo
P = VAZIO
Insere(P,s)

Inicializao

Percorre o grafo
Enquanto P
VAZIO faa
u = Topo(P)
Se u tem pelo menos um vrtice adjacente BRANCO
v = escolhe um dos vrtices adjacentes com v.cor=BRANCO
v.cor = CINZA
tempo = tempo+1
v.t1 = tempo
Insere(P,v)
Caso-contrrio
u.cor = PRETO
tempo = tempo+1
v.t2 = tempo
Remove(P)

37

Busca em profundidade (Depth First Search)


Para cada vrtice v em G.V-{s} faa
v.cor = BRANCO
v.t1 = INFINITO
v.t2 = INFINITO
tempo = 0
s.cor = CINZA
s.t1 = tempo
P = VAZIO
Insere(P,s)

Inicializao

P={4}
7
5

4
0
38

Busca em profundidade (Depth First Search)


Percorre o grafo
Enquanto P
VAZIO faa
u = Topo(P)
Se u tem pelo menos um vrtice adjacente BRANCO
v = escolhe um dos vrtices adjacentes com v.cor=BRANCO
v.cor = CINZA
tempo = tempo+1
v.t1 = tempo
Insere(P,v)
Caso-contrrio
u.cor = PRETO
tempo = tempo+1
v.t2 = tempo
Remove(P)

Pilha={4}

Pilha={4,1}
5

2
6

Inicializao

Iterao 1

39

Busca em profundidade (Depth First Search)


Percorre o grafo
Enquanto P
VAZIO faa
u = Topo(P)
Se u tem pelo menos um vrtice adjacente BRANCO
v = escolhe um dos vrtices adjacentes com v.cor=BRANCO
v.cor = CINZA
tempo = tempo+1
v.t1 = tempo
Insere(P,v)
Caso-contrrio
u.cor = PRETO
tempo = tempo+1
v.t2 = tempo
Remove(P)

7
5

2
2

Iterao 2

Pilha={4,1,2}
3

4
0
40

Busca em profundidade (Depth First Search)


Percorre o grafo
Enquanto P
VAZIO faa
u = Topo(P)
Se u tem pelo menos um vrtice adjacente BRANCO
v = escolhe um dos vrtices adjacentes com v.cor=BRANCO
v.cor = CINZA
tempo = tempo+1
v.t1 = tempo
Insere(P,v)
Caso-contrrio
u.cor = PRETO
tempo = tempo+1
v.t2 = tempo
Remove(P)
3

7
5

2
2

Iterao 3

Pilha={4,1,2,7}
3

4
0
41

Busca em profundidade (Depth First Search)


Percorre o grafo
Enquanto P
VAZIO faa
u = Topo(P)
Se u tem pelo menos um vrtice adjacente BRANCO
v = escolhe um dos vrtices adjacentes com v.cor=BRANCO
v.cor = CINZA
tempo = tempo+1
v.t1 = tempo
Insere(P,v)
Caso-contrrio
u.cor = PRETO
tempo = tempo+1
v.t2 = tempo
Remove(P)
3/4

7
5

2
2

Iterao 4

Pilha={4,1,2}
3

4
0
42

Busca em profundidade

O algoritmo anterior pode ser transformado em uma verso


RECURSIVA.

O algoritmo recursivo, uma variante que simplifica o uso da


estrutura de pilha (P).

43

Recursividade

Uma funo (programa) recursivo uma funo que se chama a si


mesma.

44

Recursividade

Recursividade uma das coisas mgicas e interessantes em Programao.


45

Recursividade

Anuncio com uma


imagem recursiva.

46

Recursividade

def contagem_regressiva(n):
if n==0:
print "Fogo!"
else:
print n
contagem_regressiva(n-1)

47

Recursividade
Porque no usar Iterao ao invs de Recursividade
Depende muito do estilo de programao. Entretanto,
algumas vezes mais apropriado usar Recursividade para
resolver um problema.
Normalmente mais fcil de programar e entender um
programa recursivo
def contagem_regressiva(n):
if n==0:
print "Fogo!"
else:
print n
contagem_regressiva(n-1)

def contagem_regressiva2(n):
while n>0:
print n
n = n-1
print "Fogo!"

48

Recursividade

def fact(n):
if n==1:
return 1
else:
return n*fact(n-1)

49

Busca em profundidade (verso recursiva)


DFS(G,s):
Para cada vrtice v em G.V-{s} faa
v.cor = BRANCO
v.t1 = INFINITO
v.t2 = INFINITO
tempo = 0
VisitaDFS(G,s)

VisitaDFS(G,s):
s.t1 = tempo
s.cor = CINZA
tempo = tempo+1
Para cada v em G.Adj[s] faa
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
s.t2 = tempo
tempo = tempo+1

Inicializao

Percorre o grafo

50

Busca em profundidade (verso recursiva)


VisitaDFS(G,s):
s.t1 = tempo
s.cor = CINZA
tempo = tempo+1
Para cada v em G.Adj[s] faa
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
s.t2 = tempo
tempo = tempo+1

Percorre o grafo

7
5

s=4
tempo=0

4
0
51

Busca em profundidade (verso recursiva)


VisitaDFS(G,s):
s.t1 = tempo
s.cor = CINZA
tempo = tempo+1
Para cada v em G.Adj[s] faa
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
s.t2 = tempo
tempo = tempo+1

Percorre o grafo

7
5

s=4
tempo=0

4
0
52

Busca em profundidade (verso recursiva)


VisitaDFS(G,s):
s.t1 = tempo
s.cor = CINZA
tempo = tempo+1
Para cada v em G.Adj[s] faa
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
s.t2 = tempo
tempo = tempo+1

Percorre o grafo

7
5

s=4
tempo=1

4
0
53

Busca em profundidade (verso recursiva)


VisitaDFS(G,s):
s.t1 = tempo
s.cor = CINZA
tempo = tempo+1
Para cada v em G.Adj[s] faa
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
s.t2 = tempo
tempo = tempo+1

Percorre o grafo

v=1

s=4
tempo=2

4
0
54

Busca em profundidade (verso recursiva)


VisitaDFS(G,s):
s.t1 = tempo
s.cor = CINZA
tempo = tempo+1
Para cada v em G.Adj[s] faa
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
s.t2 = tempo
tempo = tempo+1

Percorre o grafo

v=1

s=4
tempo=3

4
0
55

Busca em profundidade (verso recursiva)


VisitaDFS(G,s):
s.t1 = tempo
s.cor = CINZA
tempo = tempo+1
Para cada v em G.Adj[s] faa
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
s.t2 = tempo
tempo = tempo+1

Percorre o grafo

7
5

2
2

s=7
tempo=4

4
Aps alguns chamados
recursivos...

0
56

Busca em profundidade (verso recursiva)


VisitaDFS(G,s):
s.t1 = tempo
s.cor = CINZA
tempo = tempo+1
Para cada v em G.Adj[s] faa
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
s.t2 = tempo
tempo = tempo+1

Percorre o grafo

7
5

2
2

s=7
tempo=4

4
Aps alguns chamados
recursivos...

0
57

Busca em profundidade (verso recursiva)


VisitaDFS(G,s):
s.t1 = tempo
s.cor = CINZA
tempo = tempo+1
Para cada v em G.Adj[s] faa
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
s.t2 = tempo
tempo = tempo+1

Percorre o grafo

7
5

2
2

s=7
tempo=4

4
Aps alguns chamados
recursivos...

0
58

Busca em profundidade (verso recursiva)


VisitaDFS(G,s):
s.t1 = tempo
s.cor = CINZA
tempo = tempo+1
Para cada v em G.Adj[s] faa
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
s.t2 = tempo
tempo = tempo+1

Percorre o grafo

3/4

7
5

2
2

s=7
tempo=5

4
Aps alguns chamados
recursivos...

0
59

Busca em profundidade (verso recursiva)


VisitaDFS(G,s):
s.t1 = tempo
s.cor = CINZA
tempo = tempo+1
Para cada v em G.Adj[s] faa
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
s.t2 = tempo
tempo = tempo+1

Percorre o grafo

3/4

7
5

2
2

s=7
tempo=5

4
Aps alguns chamados
recursivos...

0
60

Busca em profundidade (verso recursiva)


VisitaDFS(G,s):
s.t1 = tempo
s.cor = CINZA
tempo = tempo+1
Para cada v em G.Adj[s] faa
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
s.t2 = tempo
tempo = tempo+1

Percorre o grafo

3/4

7
5

2
2

s=5
tempo=5

4
Aps alguns chamados
recursivos...

0
61

Busca em profundidade (verso recursiva)


VisitaDFS(G,s):
s.t1 = tempo
s.cor = CINZA
tempo = tempo+1
Para cada v em G.Adj[s] faa
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
s.t2 = tempo
tempo = tempo+1

Percorre o grafo

3/4

7
5

2
2

s=5
tempo=5

4
Aps alguns chamados
recursivos...

0
62

Busca em profundidade (verso recursiva)


VisitaDFS(G,s):
s.t1 = tempo
s.cor = CINZA
tempo = tempo+1
Para cada v em G.Adj[s] faa
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
s.t2 = tempo
tempo = tempo+1

Percorre o grafo

3/4

7
5

2
2

s=5
tempo=5

4
Aps alguns chamados
recursivos...

0
63

Busca em profundidade (verso recursiva)


VisitaDFS(G,s):
s.t1 = tempo
s.cor = CINZA
tempo = tempo+1
Para cada v em G.Adj[s] faa
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
s.t2 = tempo
tempo = tempo+1

Percorre o grafo

3/4

7
2

s=5
tempo=6

4
Aps alguns chamados
recursivos...

0
64

Para grafos direcionados

65

Para grafos direcionados

66

Para grafos direcionados

67

Para grafos direcionados

68

Para grafos direcionados

69

Para grafos direcionados

70

Para grafos direcionados

71

Para grafos direcionados

72

Para grafos direcionados

73

Para grafos direcionados

74

Para grafos direcionados

75

Para grafos direcionados

76

Busca em profundidade (verso recursiva)


// Esta funo permite percorrer os elementos da componente conexa contendo s.

DFS(G,s):
Para cada vrtice v em G.V-{s} faa
v.cor = BRANCO
v.t1 = INFINITO
v.t2 = INFINITO
tempo = 0
VisitaDFS(G,s)

Inicializao

// Esta nova funo permite percorrer todos os elementos do grafo.

DFS(G):
Para cada vrtice v em G.V faa
v.cor = BRANCO
v.t1 = INFINITO
v.t2 = INFINITO
tempo = 0
Para cada vrtice u em G.V faa
se u.cor==BRANCO
VisitaDFS(G,u)

Inicializao

77

Para grafos direcionados

78

Para grafos direcionados

79

Para grafos direcionados

80

Para grafos direcionados

81

Para grafos direcionados

82

Para grafos direcionados

83

Ordenao 'topologica'

84

Ordenao 'topologica'

85

Ordenao 'topologica'
A ordenao topologica (de um grafo direcionado) uma ordem
linear de seus vrtices em que:
Cada aresta direcionada uv (do vrtice u ao vrtice v), o vrtice u
vem antes do vrtice v na ordenao.
Podem existir uma ou mais ordenaes topolgicas.

v
86

Ordenao 'topologica'
BCC
BMat

PI

NI

CR

BExp

Optat

TQui

Obrig

87

Ordenao 'topologica'
BCC
BMat

PI

NI

CR

BExp

Optat

TQui

Obrig

88

Ordenao 'topologica'
BCC
BMat

PI

NI

CR

BExp

Optat

TQui

Obrig

89

Ordenao 'topologica'
BCC
BMat

PI

NI

2/3

CR

BExp

Optat

TQui

Obrig

90

Ordenao 'topologica'
BCC
BMat

1/4

PI

NI

2/3

CR

BExp

Optat

TQui

Obrig

91

Ordenao 'topologica'
5

BCC
BMat

1/4

PI

NI

2/3

CR

BExp

Optat

TQui

Obrig

92

Ordenao 'topologica'
5

BCC
BMat

1/4

PI

NI

2/3

CR

BExp

Optat

TQui

Obrig

93

Ordenao 'topologica'
5

BCC
BMat

1/4

2/3

PI

NI

CR

BExp

Optat

TQui

Obrig

94

Ordenao 'topologica'
5

BCC
BMat

1/4

2/3

PI

NI

CR

BExp

Optat

TQui

Obrig

95

Ordenao 'topologica'
5

BCC
BMat

1/4

2/3

PI

NI

CR

BExp

Optat

TQui

Obrig

8/9

96

Ordenao 'topologica'
5

BCC
BMat

1/4

2/3

PI

NI

7/10

CR

BExp

Optat

TQui

Obrig

8/9

97

Ordenao 'topologica'
5

BCC
BMat

1/4

2/3

6/11

PI

NI

7/10

CR

BExp

Optat

TQui

Obrig

8/9

98

Ordenao 'topologica'
5/12

BCC
BMat

1/4

2/3

6/11

PI

NI

7/10

CR

BExp

Optat

TQui

Obrig

8/9

99

Ordenao 'topologica'
5/12

BCC
BMat

1/4

2/3

6/11

PI

NI

7/10

CR

BExp

Optat

13

TQui

Obrig

8/9

100

Ordenao 'topologica'
5/12

BCC
BMat

1/4

2/3

6/11

PI

NI

7/10

CR

BExp

Optat

13/14

TQui

Obrig

8/9

101

Ordenao 'topologica'
5/12

BCC
BMat

1/4

6/11

PI

NI

2/3

7/10

CR

BExp

15

Optat

13/14

TQui

Obrig

8/9

102

Ordenao 'topologica'
5/12

BCC
BMat

1/4

6/11

PI

NI

2/3

7/10

CR

BExp

15

TQui

16

Obrig

8/9

Optat

13/14

103

Ordenao 'topologica'
5/12

BCC
BMat

1/4

6/11

PI

NI

2/3

7/10

CR

BExp

15

TQui

16/17

Obrig

8/9

Optat

13/14

104

Ordenao 'topologica'
5/12

BCC
BMat

1/4

6/11

PI

NI

2/3

7/10

CR

BExp

15/18

TQui

16/17

Obrig

8/9

Ordenado pelo tempo de visita 2


(ordem descendente)

Optat

13/14

BExp

TQui

Optat

BCC

PI

CR

Obrig

BMat

15/18

16/17

13/14

5/12

6/11

7/10

8/9

1/4

NI

2/3105

III. Atividade Prtica

106

Atividade Prtica
Para os grafos G e H abaixo, execute a busca em profundidade a
partir do vrtice 1:
(a) Dando preferncia para vrtices de menor ndice.
(b) Dando preferncia para vrtices de maior ndice.
Para cada exerccio indique a sequncia de vrtices visitados.

H
107

Atividade Prtica: Gabarito


Grafo G:
(a) Dando preferncia para vrtices de menor ndice.
<1,2,3,4,5>
(b) Dando preferncia para vrtices de maior ndice.
<1,4,5,2,3>
Grafo H:
(a) Dando preferncia para vrtices de menor ndice.
<1,2,3,4,5>
(b) Dando preferncia para vrtices de maior ndice.
<1,2,5,3,4>
108

Vous aimerez peut-être aussi