Você está na página 1de 137

BCM0506 - Comunicação e Redes

Aula 4
Algoritmos de Busca em Grafos

Prof. Alexandre Donizeti Alves


Definições
Uma árvore é um grafo conexo e acíclico (sem
ciclos)
As árvores são muito úteis para organizar
informações

Árvore não-direcionada Árvore direcionada


Definições
Uma árvore é um grafo conexo G em que existe
um e somente um caminho entre qualquer par
de vértices de G

O seguinte grafo é uma árvore?

2 5

1 3 6

4
Definições
O seguinte grafo é uma árvore?

0: 5,1
0 5 6 7

• 1: 0,2,3,4
2: 1
1 2 8

• 3: 1 3

• 4: 1 4
• 5: 0 Uma floresta é um conjunto de árvores
• 6: 7,8 sem vértices em comum
• 7: 6 Uma floresta é um grafo cujos
• 8: 6 componentes conexos são árvores
Definições

Toda árvore com V vértices tem exatamente


V-1 arestas

0 5 6 7

1 2 8

V=9 V=6 V=3


Definições
Toda floresta com V vértices e C componentes
tem exatamente V - C arestas

0 5 6 7
11 12

13 8
1 2

14 15
3

Uma florestas com 14 vértices, e 3 componentes, tem 11 arestas


Definições

Uma folha em uma floresta é qualquer vértice


de grau 1

0 5 6 7
11 12

13 8
1 2

14 15
3

4
Busca em Largura

b c

f g h k

m n p q r

Grafo de entrada
Busca em Largura

b c

f g h k

m n p q r

Grafo de entrada
Busca em Largura

1 0
b c

3 4 5
f g h k
2

m n p q r
10 6 7 8 9

Grafo de entrada
Busca em Largura

c
1 0
b c b h

3 4 5
f g h k f g k
2

n p q r
m n p q r
10 6 7 8 9
m

Grafo de entrada Árvore de busca em largura


Busca em Profundidade
A estratégia seguida pela busca em profundidade
é, como seu nome implica, procurar cada vez mais
“fundo” no grafo
Nessa busca as arestas são
exploradas a partir do vértice
mais recentemente descoberto
que ainda possui arestas
inexploradas saindo dele
Baseado em Pilha
Busca em Profundidade

Fila

Pilha
Busca em Profundidade

Inicialmente {s}

Os vértices são explorados a partir do vértice


mais recentemente descoberto
Busca em Grafos

b c

d e f g

h i j k
Busca em Grafos

a a

b c b c

d e f g d e f g

h i j k h i j k

Busca em largura Busca em profundidade


(Breadth First Search - BFS) (Depth First Search - DFS)
Busca em Profundidade
• O algoritmo de busca em profundidade também
atribuirá cores a cada vértice
Busca em Profundidade
Grafo inicial

2 5

1 3 6

4
Busca em Profundidade

Pilha
2 5

1 3 6
Origem s = 4

4
0

Indica a ordem de visita


Busca em Profundidade

Pilha
2 5 1

1 3 6

4
0
Busca em Profundidade

2
Pilha
2 2 5 1

1 3 6

4
0
Busca em Profundidade

7 7

2
Pilha
2 2 5 1

1 3 6

4
0
Busca em Profundidade

3/4

2
Pilha
2 2 5 1

1 3 6

4
0
Busca em Profundidade

3/4

7 5

5 2
Pilha
2 2 5 1

1 3 6

4
0
Busca em Profundidade

3/4 3

7 5

5 2
Pilha
2 2 5 1

1 3 6

1 6

4
0
Busca em Profundidade
6

3/4 3

7 5

5 2
Pilha
2 2 5 1

1 3 6

1 6 7

4
0
Busca em Profundidade

3/4 3

7 5

5 2
Pilha
2 2 5 1

1 3 6

1 6 7/8

4
0
Busca em Profundidade

3/4

7 5

5 2
Pilha
2 2 5 1

1 3 6

1 6/9 7/8

4
0
Busca em Profundidade

3/4

5/10 2
Pilha
2 2 5 1

1 3 6

1 6/9 7/8

4
0
Busca em Profundidade

3/4

5/10
Pilha
2/11 2 5 1

1 3 6

1 6/9 7/8

4
0
Busca em Profundidade

3/4

5/10
Pilha
2/11 2 5

1 3 6

1/12 6/9 7/8

4
0
Busca em Profundidade

3/4

5/10
Pilha = {}
2/11 2 5

1 3 6

1/12 6/9 7/8

4
0/13
Algoritmo
• Constantes:
BRANCO, CINZA, PRETO, INFINITO

• Variáveis:
P (Pilha) , s (vértice de origem)

• Propriedades do vértice v:
v.cor (cor do vértice)
v.t1 (ordem de visita inicial do vértice v) – Tempo de descoberta
v.t2 (ordem de visita final do vértice v) – Tempo de Término

• Funções :
Insere(P, v), permite inserir o vértice v na pilha P
Remove(P), permite remover um vértice da pilha P
Consulta(P), permite consultar o último vértice na pilha P
Algoritmo
DFS(G,s):
Para cada vértice v em G.V-{s} faça
v.cor = BRANCO
v.t1 = INFINITO
v.t2 = INFINITO
s.cor = CINZA
s.t1 = 0
P = VAZIO
Insere(P,s)

Enquanto P VAZIO faça


u = Consulta(P)
Se u tem vértices adjacentes na cor BRANCO
v = escolhe um vértice adjacente v.cor = BRANCO
v.cor = CINZA
tempo = tempo + 1
v.t1 = tempo
Insere(P,v)
Caso-contrário
u.cor = PRETO
tempo = tempo + 1
v.t2 = tempo
Remove(P)
Algoritmo
DFS(G,s):
Para cada vértice v em G.V-{s} faça Inicialização
v.cor = BRANCO
v.t1 = INFINITO
v.t2 = INFINITO
s.cor = CINZA
s.t1 = 0
P = VAZIO
Insere(P,s)

Enquanto P VAZIO faça Percorre o grafo


u = Consulta(P)
Se u tem vértices adjacentes na cor BRANCO
v = escolhe um vértice adjacente v.cor = BRANCO
v.cor = CINZA
tempo = tempo + 1
v.t1 = tempo
Insere(P,v)
Caso-contrário
u.cor = PRETO
tempo = tempo + 1
v.t2 = tempo
Remove(P)
Algoritmo
Para cada vértice v em G.V-{s} faça Inicialização
v.cor = BRANCO
v.t1 = INFINITO
v.t2 = INFINITO
s.cor = CINZA
s.t1 = 0
P = VAZIO
Insere(P,s)

P = {4}
7

2 5

1 3 6

4
0
Algoritmo
Enquanto P VAZIO faça Percorre o grafo
u = Consulta(P)
Se u tem vértices adjacentes na cor BRANCO
v = escolhe um vértice adjacente v.cor = BRANCO
v.cor = CINZA
tempo = tempo + 1
v.t1 = tempo
Insere(P,v)
Caso-contrário
u.cor = PRETO
tempo = tempo + 1
v.t2 = tempo
Remove(P)

Pilha = {4} Pilha = {4,1}


7 7

2 5 2 5

1 3 6 1 3 6
1
4 4
0 0
Inicialização Iteração 1
Algoritmo
Enquanto P VAZIO faça Percorre o grafo
u = Consulta(P)
Se u tem vértices adjacentes na cor BRANCO
v = escolhe um vértice adjacente v.cor = BRANCO
v.cor = CINZA
tempo = tempo + 1
v.t1 = tempo
Insere(P,v)
Caso-contrário
u.cor = PRETO
tempo = tempo + 1
v.t2 = tempo
Remove(P)
Pilha = {4,1,2}
7

2 5
2

1 3 6
1

4
0 Iteração 2
Algoritmo
Enquanto P VAZIO faça Percorre o grafo
u = Consulta(P)
Se u tem vértices adjacentes na cor BRANCO
v = escolhe um vértice adjacente v.cor = BRANCO
v.cor = CINZA
tempo = tempo + 1
v.t1 = tempo
Insere(P,v)
Caso-contrário
u.cor = PRETO
tempo = tempo + 1
v.t2 = tempo
Remove(P) 3 Pilha = {4,1,2,7}
7

2 5
2

1 3 6
1

4
0 Iteração 3
Algoritmo
Enquanto P VAZIO faça Percorre o grafo
u = Consulta(P)
Se u tem vértices adjacentes na cor BRANCO
v = escolhe um vértice adjacente v.cor = BRANCO
v.cor = CINZA
tempo = tempo + 1
v.t1 = tempo
Insere(P,v)
Caso-contrário
u.cor = PRETO
tempo = tempo + 1
v.t2 = tempo
Remove(P) 3/4 Pilha = {4,1,2}
7

2 5
2

1 3 6
1

4
0 Iteração 4 ...
Busca em Profundidade
O algoritmo anterior pode ser transformado a
uma versão RECURSIVA

• Dado um grafo G e um vértice v, seja percorrido


todo o grafo G usando a busca em profundidade

O algoritmo recursivo, é uma variante que


simplifica o uso da estrutura de pilha (P)
Recursividade

• Uma função (programa) recursiva é uma função


que “chama a si mesma”
Recursividade

Anúncio com uma


imagem recursiva
Recursividade
• Porque não usar Iteração ao invés de
Recursividade?
• Depende muito do estilo de programação. Entretanto,
algumas vezes é mais apropriado usar Recursividade
para resolver um problema

def contagem_regressiva(n): def contagem_regressiva2(n):


if n == 0: while n > 0:
print "Fogo!" print n
else: n=n-1
print n print "Fogo!"
contagem_regressiva(n-1)
Algoritmo (Recursivo)
DFS(G,s):
Para cada vértice v em G.V-{s} faça Inicialização
v.cor = BRANCO
v.t1 = INFINITO
v.t2 = INFINITO
tempo = 0
VisitaDFS(G,s)

VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo
7

2 5
s=4
1 3 6
tempo = 0

4
0
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo+1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo
7

2 5
s=4
1 3 6
tempo = 0

4
0
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo
7

2 5
s=4
1 3 6
tempo = 0

4
0
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo
7

v=1
2 5
s=4
1 3 6
tempo = 0

4
0
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo
7

v=1
2 5
s=4
1 3 6
tempo = 0

4
0
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo 3
7

2 5
2
s=7
1 3 6
tempo = 3
1

4
Após algumas chamadas 0
recursivas...
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo 3
7

2 5
2
s=7
1 3 6
tempo = 3
1

4
Após algumas chamadas 0
recursivas...
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo 3
7

2 5
2
s=7
1 3 6
tempo = 4
1

4
Após algumas chamadas 0
recursivas...
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo 3/4
7

2 5
2
s=7
1 3 6
tempo = 4
1

4
Após algumas chamadas 0
recursivas...
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo 3/4
7

2 5
2
s=7
1 3 6
tempo = 4
1

4
Após algumas chamadas 0
recursivas...
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo 3/4
7

2 5
2
s=5
1 3 6
tempo = 4
1

4
Após algumas chamadas 0
recursivas...
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo 3/4
7

2 5
2
s=5
1 3 6
tempo = 5
1

4
Após algumas chamadas 0
recursivas...
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo 3/4
7

2 5 5
2
s=5
1 3 6
tempo = 4
1

4
Após algumas chamadas 0
recursivas...
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo 3/4
7

2 5 5
2
s=5
1 3 6
tempo = 5
1

4
Após algumas chamadas 0
recursivas...
Grafos Direcionados
Grafos Direcionados
Grafos Direcionados
Algoritmo (Recursivo)
// Esta função permite percorrer os elementos do grafo, começando em s
DFS(G,s):
Para cada vértice v em G.V-{s} faça Inicialização
v.cor = BRANCO
v.t1 = INFINITO
v.t2 = INFINITO
tempo = 0
VisitaDFS(G,s)

// Esta nova função permite percorrer todos os elementos da componente conexa


DFS(G):
Para cada vértice v em G.V faça Inicialização
v.cor = BRANCO
v.t1 = INFINITO
v.t2 = INFINITO
tempo = 0
Para cada vértice u em G.V faça
se u.cor == BRANCO
VisitaDFS(G,u)
Grafos Direcionados
Grafos Direcionados
Classificação de Arestas
Ao explorar um grafo G conexo usando a busca em
profundidade, podemos categorizar as arestas:
Arestas de Árvore: levam à exploração de vértices ainda não
visitados

Arestas de Retorno: Demais arestas. Formam ciclos, pois levam a


vértices já visitados

A subárvore de G formada pelas arestas de árvore


é chamada de Árvore de Profundidade de G
Exemplo

Grafo não-direcionado
Exemplo

(1) Aresta {1,2}


Exemplo

(2) Aresta {2,3}


Exemplo

(3) Aresta {3,1}


Exemplo

(4) Aresta {3,4}


Exemplo

(5) Aresta {4,5}


Exemplo

(6) Aresta {5,3}


Exemplo

(7) Aresta {3,6}


Exemplo

(8) Aresta {3,7}


Exemplo

Grafo original e Árvore de Profundidade


Complexidade
Para cada vértice v do grafo o algoritmo percorre
toda a lista de adjacentes a v

Cada aresta do grafo é examinada duas vezes,


sendo que na primeira vez a aresta é explorada

Portanto, se uma lista de adjacência for usada na


representação do grafo, o algoritmo de busca em
profundidade terá complexidade O(n+m)
Classificação de Arestas
Ao explorar um grafo G direcionado usando a
busca em profundidade, podemos categorizar
as arestas. Sejam o vértice v a origem da
aresta e o vértice w o destino da mesma (v,w):
Arestas de árvore: (v,w) é arco de árvore se v foi visitado
devido ao arco (v,w) ser visitado
Arestas de Avanço: Caso w seja descendente de v na
floresta
Arestas de Retorno: Caso v seja descendente de w na
floresta. Inclui laços
Arestas de Cruzamento: Na mesma árvore, caso w não seja
descendente de v e v não seja descendente de w. Entre
árvores diferentes
Classificação de Arestas
Na busca em profundidade cada aresta (v,w) pode ser
classificada pela cor do vértice que é alcançado pela primeira
vez:
Cor de w = branco indica uma aresta de árvore
Cor de w = cinza indica uma aresta de retorno
Cor de w = preto indica uma aresta de avanço quando v é descoberto
antes de w (tempoDescoberta(v) < tempoDescoberta(w)) ou uma aresta
de cruzamento caso contrário, ou seja, (tempoDescoberta(v) >
tempoDescoberta(w))
Exemplo

Grafo direcionado
Exemplo

(1) Arco {1,2}


Exemplo

(2) Arco {2,3}


Exemplo

(3) Arco {3,6}


Exemplo

(4) Arco {6,2}


Exemplo

(5) Arco {1,3}


Exemplo

(6) Arco {4,3}


Exemplo

(7) Arco {4,5}


Exemplo

(8) Arco {5,3}


Exemplo

Grafo original e Floresta de Profundidade


Ordenação Topológica
• A ordenação topológica (de um grafo
direcionado) é uma ordem linear de seus vértices
em que:
Ordenação dos vértices ao longo de uma linha horizontal de tal
forma que todas as arestas estão direcionadas da esquerda para a
direita
Cada arco vw (do vértice v ao vértice w), o vértice v vem antes do
vértice w na ordenação

• Podem existir uma ou mais ordenações topológicas


• Podem ser utilizados, por exemplo, para indicar
precedência entre eventos
Ordenação Topológica

• Pode ser obtida por busca em


profundidade

• Algoritmo
1. Faça uma busca em profundidade

2. Quando um vértice for pintado de preto, insira-o


na cabeça de uma lista de vértices

3. Retorne a lista de vértices


Exemplo 1
Exemplo 1
Exemplo 1
Exemplo 1
Exemplo 1
Exemplo 1
Exemplo 1
Exemplo 1
Exemplo 1
Exemplo 1
Exemplo 1
Exemplo 1
Exemplo 1
Exemplo 1
Exemplo 2
Exemplo 2

v w
Exemplo 3
BCC

BMat

PI NI

CR BExp Optat

TQui

Obrig
Exemplo 3
BCC

BMat 1

PI NI

CR BExp Optat

TQui

Obrig
Exemplo 3
BCC

BMat 1

PI NI 2

CR BExp Optat

TQui

Obrig
Exemplo 3
BCC

BMat 1

PI NI 2/3

CR BExp Optat

TQui

Obrig
Exemplo 3
BCC

BMat 1/4

PI NI 2/3

CR BExp Optat

TQui

Obrig
Exemplo 3
5 BCC

BMat 1/4

PI NI 2/3

CR BExp Optat

TQui

Obrig
Exemplo 3
5 BCC

BMat 1/4

6 PI NI 2/3

CR BExp Optat

TQui

Obrig
Exemplo 3
5 BCC

BMat 1/4

6 PI NI 2/3

7 CR BExp Optat

TQui

Obrig
Exemplo 3
5 BCC

BMat 1/4

6 PI NI 2/3

7 CR BExp Optat

TQui

Obrig 8
Exemplo 3
5 BCC

BMat 1/4

6 PI NI 2/3

7 CR BExp Optat

TQui

Obrig 8/9
Exemplo 3
5 BCC

BMat 1/4

6 PI NI 2/3

7/10 CR BExp Optat

TQui

Obrig 8/9
Exemplo 3
5 BCC

BMat 1/4

6/11 PI NI 2/3

7/10 CR BExp Optat

TQui

Obrig 8/9
Exemplo 3
5/12 BCC

BMat 1/4

6/11 PI NI 2/3

7/10 CR BExp Optat

TQui

Obrig 8/9
Exemplo 3
5/12 BCC

BMat 1/4

6/11 PI NI 2/3

7/10 CR BExp Optat 13

TQui

Obrig 8/9
Exemplo 3
5/12 BCC

BMat 1/4

6/11 PI NI 2/3

7/10 CR BExp Optat 13/14

TQui

Obrig 8/9
Exemplo 3
5/12 BCC

BMat 1/4

6/11 PI NI 2/3

7/10 CR BExp 15 Optat 13/14

TQui

Obrig 8/9
Exemplo 3
5/12 BCC

BMat 1/4

6/11 PI NI 2/3

7/10 CR BExp 15 Optat 13/14

TQui 16

Obrig 8/9
Exemplo 3
5/12 BCC

BMat 1/4

6/11 PI NI 2/3

7/10 CR BExp 15 Optat 13/14

TQui 16/17

Obrig 8/9
Exemplo 3
5/12 BCC

BMat 1/4

6/11 PI NI 2/3

7/10 CR BExp 15/18 Optat 13/14

TQui 16/17

Ordenado pelo tempo de término (t2)


(ordem descendente) Obrig 8/9

BExp TQui Optat BCC PI CR Obrig BMat NI

15/18 16/17 13/14 5/12 6/11 7/10 8/9 1/4 2/3


Teste Grafo Cíclico/Acíclico
Busca em profundidade pode ser usada para
verificar se um grafo é acíclico ou contém um
ou mais ciclos

Grafo G é acíclico
se e somente se a busca em profundidade em G não
apresentar arestas de retorno

Em termos de algoritmo
verificar se um vértice w adjacente a v possuir cor cinza na
primeira vez que o arco(v, w) é percorrido
Teste Grafo Cíclico/Acíclico
Exemplo

Árvore de Profundidade
Exemplo

Árvore de Profundidade
Exemplo

Árvore de Profundidade
Exemplo

Árvore de Profundidade

GRAFO CÍCLICO
Eliminação de Vértices
O algoritmo descrito originalmente
por Kahn tem a seguinte estratégia:
Passo 1: Encontrar os vértices com grau de entrada zero e
os inserir em uma fila
Ao menos um vértice desses deve existir se o grafo é acíclico
Passo 2: Selecionar um dos vértices e remover todos os
seus arcos de saída
Partindo do princípio que, se esses vértices e seus arcos de saída
forem removidos, o grafo remanescente é também um grafo
direcionado acíclico
O vértice removido deve ser inserido na fila
Passo 3: Repetir os Passos 1 e 2
Exemplo

Fila
Simulação

https://www.cs.usfca.edu/~galles/visualization/DFS.html
Bibliografia

Capítulos 1 e 3 Capítulo 22
Atividade
• Para os grafos G e H abaixo, execute a busca em
profundidade a partir do vértice 1:
(a) Dando preferência para vértices de menor índice
(b) Dando preferência para vértices de maior índice

• Para cada exercício indique a sequência de vértices


visitados

G H

Você também pode gostar