Escolar Documentos
Profissional Documentos
Cultura Documentos
Zenilton Patrocínio
Busca em Profundidade – Introdução
Uma busca é dita em profundidade quando o critério de escolha de vértice
marcado for:
“dentre todos os vértices marcados e incidentes a alguma aresta ainda não
explorada, escolher aquele mais recentemente alcançado na busca”.
Porém ainda são arbitrárias a escolha da raiz da busca, bem como a escolha da
aresta a ser explorada a partir do vértice marcado.
Busca em Profundidade
Durante a busca, diversos atributos são definidos para os vértices:
• Cada vértice é inicialmente desmarcado (ou branco), ele se torna marcado (ou
cinza) quando for descoberto e se torna explorado (ou preto) quando sua lista
de adjacências for completamente examinada).
v w 1ª Visita v w pai[w] = v
Vértice Vértice não Vértice Vértice
marcado explorado marcado marcado
Busca em Profundidade
em Grafo Não Direcionado
Busca em Profundidade – Grafo Não Direcionado
v w 1ª Visita v w v w Visita v w
Busca em Profundidade – Algoritmo
Inicialização / Chamada inicial
1. t 0; // Inicializar tempo global
2. para todo vértice v V(G) faça
a. TD[v] 0; // Inicializar tempo de descoberta
b. TT[v] 0; // Inicializar tempo de término
c. pai[v] null; // Inicializar predecessor ou pai
3. enquanto existir algum vértice v tal que TD[v] = 0 efetuar
a. Executar Busca_Profundidade(v); // Executar busca para raiz v
Busca em Profundidade – Algoritmo
Busca_Profundidade(v)
1. t t + 1; TD[v] t; // Definir tempo de descoberta
2. para todo vértice w (v) faça // Para toda a vizinhança de v
a. se TD[w] = 0 então // Se w é visitado pela 1ª vez
Visitar aresta {v, w}; pai[w] v; // {v, w} é aresta de árvore
Executar Busca_Profundidade(w);
b. senão se TT[w] = 0 e w pai[v] então // Se w for ancestral mas não pai
Visitar aresta {v, w}; // {v, w} é aresta de retorno
3. t t + 1; TT[v] t; // Definir tempo de término
Busca em Profundidade – Algoritmo
Busca_Profundidade(v)
1. t t + 1; TD[v] t; // Definir tempo de descoberta
2. para todo vértice w (v) faça // Para toda a vizinhança de v
a. se TD[w] = 0 então // Se w é visitado pela 1ª vez
Visitar aresta {v, w}; pai[w] v; // {v, w} é aresta de árvore
Executar Busca_Profundidade(w);
b. senão se TT[w] = 0 e w pai[v] então // Se w for ancestral mas não pai
Visitar aresta {v, w}; // {v, w} é aresta de retorno
3. t t + 1; TT[v] t; // Definir tempo de término
Busca em Profundidade – Exemplo
G a b
c d
e f
G b
a b c d e f
a
TD 0 0 0 0 0 0
c d
TT 0 0 0 0 0 0
e f
pai
G b
a b c d e f
a
TD 0 0 0 0 0 0
c d
TT 0 0 0 0 0 0
e f
pai
Raiz da
busca
G b
a b c d e f
a
e
TD 0 0 0 0 1 0
c d
TT 0 0 0 0 0 0
e f
pai
Raiz da
busca
BP(e)
G b
a b c d e f
a
e
TD 0 0 0 0 1 0
c d
TT 0 0 0 0 0 0
e f
pai
BP(e) (e) = { f, b, a, c }
G b
a b c d e f
a
e
TD 0 0 0 0 1 0
c d
TT 0 0 0 0 0 0
e f
pai
BP(e) (e) = { f, b, a, c }
G b
a b c d e f
a
e
TD 0 0 0 0 1 0
c d
TT 0 0 0 0 0 0
e f f
pai e
BP(e) (e) = { f, b, a, c }
G b
a b c d e f
a
e
TD 0 0 0 0 1 2
c d
TT 0 0 0 0 0 0
e f f
pai e
BP(e) (e) = { f, b, a, c }
BP(f)
G b
a b c d e f
a
e
TD 0 0 0 0 1 2
c d
TT 0 0 0 0 0 0
e f f
pai e
BP(e) (e) = { f, b, a, c }
BP(f) (f) = { b, d, e }
G b
a b c d e f
a
e
TD 0 0 0 0 1 2
c d
TT 0 0 0 0 0 0
e f f
pai e
BP(e) (e) = { f, b, a, c }
BP(f) (f) = { b, d, e }
G b
a b c d e f
a
e
TD 0 0 0 0 1 2
c d
TT 0 0 0 0 0 0
e f f
pai f e
b
BP(e) (e) = { f, b, a, c }
BP(f) (f) = { b, d, e }
G b
a b c d e f
a
e
TD 0 3 0 0 1 2
c d
TT 0 0 0 0 0 0
e f f
pai f e
b
BP(e) (e) = { f, b, a, c }
BP(f) (f) = { b, d, e }
BP(b)
G b
a b c d e f
a
e
TD 0 3 0 0 1 2
c d
TT 0 0 0 0 0 0
e f f
pai f e
b
BP(e) (e) = { f, b, a, c }
BP(f) (f) = { b, d, e }
BP(b) (b) = { d, e, a, f }
G b
a b c d e f
a
e
TD 0 3 0 0 1 2
c d
TT 0 0 0 0 0 0
e f f
pai f e
b
BP(e) (e) = { f, b, a, c }
BP(f) (f) = { b, d, e }
BP(b) (b) = { d, e, a, f }
G b
a b c d e f
a
e
TD 0 3 0 0 1 2
c d
TT 0 0 0 0 0 0
e f f
pai f b e
b
BP(e) (e) = { f, b, a, c }
BP(f) (f) = { b, d, e } d
BP(b) (b) = { d, e, a, f }
G b
a b c d e f
a
e
TD 0 3 0 4 1 2
c d
TT 0 0 0 0 0 0
e f f
pai f b e
b
BP(e) (e) = { f, b, a, c } BP(d)
BP(f) (f) = { b, d, e } d
BP(b) (b) = { d, e, a, f }
G b
a b c d e f
a
e
TD 0 3 0 4 1 2
c d
TT 0 0 0 0 0 0
e f f
pai f b e
BP(f) (f) = { b, d, e } d
BP(b) (b) = { d, e, a, f }
G b
a b c d e f
a
e
TD 0 3 0 4 1 2
c d
TT 0 0 0 0 0 0
e f f
pai f b e
BP(f) (f) = { b, d, e } d
BP(b) (b) = { d, e, a, f }
G b
a b c d e f
a
e
TD 0 3 0 4 1 2
c d
TT 0 0 0 0 0 0
e f f
pai f b e
BP(f) (f) = { b, d, e } d
BP(b) (b) = { d, e, a, f }
G b
a b c d e f
a
e
TD 0 3 0 4 1 2
c d
TT 0 0 0 0 0 0
e f f
pai f b e
BP(f) (f) = { b, d, e } d
BP(b) (b) = { d, e, a, f }
G b
a b c d e f
a
e
TD 0 3 0 4 1 2
c d
TT 0 0 0 5 0 0
e f f
pai f b e
BP(f) (f) = { b, d, e } d
BP(b) (b) = { d, e, a, f }
G b
a b c d e f
a
e
TD 0 3 0 4 1 2
c d
TT 0 0 0 5 0 0
e f f
pai f b e
G b
a b c d e f
a
e
TD 0 3 0 4 1 2
c d
TT 0 0 0 5 0 0
e f f
pai f b e
G b
a b c d e f
a
e
TD 0 3 0 4 1 2
c d
TT 0 0 0 5 0 0
e f f
pai f b e
BP(f) (f) = { b, d, e } d
BP(b) (b) = { d, e, a, f }
G b
a b c d e f
a
e
TD 0 3 0 4 1 2
c d
TT 0 0 0 5 0 0
e f f
pai f b e
BP(f) (f) = { b, d, e } d
BP(b) (b) = { d, e, a, f }
G b
a b c d e f
a
e
TD 0 3 0 4 1 2
c d
TT 0 0 0 5 0 0
e f f
pai b f b e
BP(f) (f) = { b, d, e } d a
BP(b) (b) = { d, e, a, f }
G b
a b c d e f
a
e
TD 6 3 0 4 1 2
c d
TT 0 0 0 5 0 0
e f f
pai b f b e
G b
a b c d e f
a
e
TD 6 3 0 4 1 2
c d
TT 0 0 0 5 0 0
e f f
pai b f b e
G b
a b c d e f
a
e
TD 6 3 0 4 1 2
c d
TT 0 0 0 5 0 0
e f f
pai b f b e
G b
a b c d e f
a
e
TD 6 3 0 4 1 2
c d
TT 0 0 0 5 0 0
e f f
pai b f a b e
G b
a b c d e f
a
e
TD 6 3 7 4 1 2
c d
TT 0 0 0 5 0 0
e f f
pai b f a b e
G b
a b c d e f
a
e
TD 6 3 7 4 1 2
c d
TT 0 0 0 5 0 0
e f f
pai b f a b e
G b
a b c d e f
a
e
TD 6 3 7 4 1 2
c d
TT 0 0 0 5 0 0
e f f
pai b f a b e
G b
a b c d e f
a
e
TD 6 3 7 4 1 2
c d
TT 0 0 0 5 0 0
e f f
pai b f a b e
G b
a b c d e f
a
e
TD 6 3 7 4 1 2
c d
TT 0 0 0 5 0 0
e f f
pai b f a b e
G b
a b c d e f
a
e
TD 6 3 7 4 1 2
c d
TT 0 0 8 5 0 0
e f f
pai b f a b e
G b
a b c d e f
a
e
TD 6 3 7 4 1 2
c d
TT 0 0 8 5 0 0
e f f
pai b f a b e
G b
a b c d e f
a
e
TD 6 3 7 4 1 2
c d
TT 0 0 8 5 0 0
e f f
pai b f a b e
G b
a b c d e f
a
e
TD 6 3 7 4 1 2
c d
TT 0 0 8 5 0 0
e f f
pai b f a b e
G b
a b c d e f
a
e
TD 6 3 7 4 1 2
c d
TT 0 0 8 5 0 0
e f f
pai b f a b e
G b
a b c d e f
a
e
TD 6 3 7 4 1 2
c d
TT 9 0 8 5 0 0
e f f
pai b f a b e
G b
a b c d e f
a
e
TD 6 3 7 4 1 2
c d
TT 9 0 8 5 0 0
e f f
pai b f a b e
G b
a b c d e f
a
e
TD 6 3 7 4 1 2
c d
TT 9 0 8 5 0 0
e f f
pai b f a b e
G b
a b c d e f
a
e
TD 6 3 7 4 1 2
c d
TT 9 10 8 5 0 0
e f f
pai b f a b e
G b
a b c d e f
a
e
TD 6 3 7 4 1 2
c d
TT 9 10 8 5 0 11
e f f
pai b f a b e
G b
a b c d e f
a
e
TD 6 3 7 4 1 2
c d
TT 9 10 8 5 12 11
e f f
pai b f a b e
G a b
Tempo
Vértice
c d 1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e f e
f
a b c d e f b
TD 6 3 7 4 1 2 d
TT 9 10 8 5 12 11 a
pai b f a b e c
Intervalos de Vida
G a b
Tempo
Vértice
c d 1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e f e
f
a b c d e f b
TD 6 3 7 4 1 2 d
TT 9 10 8 5 12 11 a
pai b f a b e c
Intervalos de Vida
G a b
Tempo
Vértice
c d 1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e f e
f
a b c d e f b
TD 6 3 7 4 1 2 d
TT 9 10 8 5 12 11 a
pai b f a b e c
Intervalos de Vida
G a b
Tempo
Vértice
c d 1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e f e
f
a b c d e f b
TD 6 3 7 4 1 2 d
TT 9 10 8 5 12 11 a
pai b f a b e c
Intervalos de Vida
G a b
Tempo
Vértice
c d 1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e f e
f
a b c d e f b
TD 6 3 7 4 1 2 d
TT 9 10 8 5 12 11 a
pai b f a b e c
Intervalos de Vida
G a b
Tempo
Vértice
c d 1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e f e
f
a b c d e f b
TD 6 3 7 4 1 2 d
TT 9 10 8 5 12 11 a
pai b f a b e c
Intervalos de Vida
G a b
Tempo
Vértice
c d 1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e f e
f
a b c d e f b
TD 6 3 7 4 1 2 d
TT 9 10 8 5 12 11 a
pai b f a b e c
Intervalos de Vida
Seja I(v) o intervalo de vida do vértice v ou I(v) = [ TD[v], TT[v] ].
e Tempo
Vértice
1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e
f
b b
d
d a
a
{v, w} é aresta de retorno
c
c
I(v) está contido em I(w) e pai[v] w
Busca em Profundidade – Propriedades
Sabendo que um grafo conexo e acíclico é
e e
denominado árvore.
G a b c b
b
c d
d a f
e f
c d
Busca em Profundidade
em Grafo Direcionado
Busca em Profundidade – Grafo Direcionado
Em grafos direcionados, a busca em profundidade pode ser feita de forma
análoga a realizada em grafo não direcionado.
G a b
c d
e f
G a b c d e f
a b
TD 0 0 0 0 0 0
c d
TT 0 0 0 0 0 0
e f pai
G a b c d e f
a b
TD 0 0 0 0 0 0
c d
TT 0 0 0 0 0 0
e f pai
Raiz da
busca
G a b c d e f
a b
TD 0 0 0 0 1 0 e
c d
TT 0 0 0 0 0 0
e f pai
Raiz da
busca
BP(e)
G a b c d e f
a b
TD 0 0 0 0 1 0 e
c d
TT 0 0 0 0 0 0
e f pai
BP(e) (e) = { f, b }
G a b c d e f
a b
TD 0 0 0 0 1 0 e
c d
TT 0 0 0 0 0 0
e f pai e f
BP(e) (e) = { f, b }
G a b c d e f
a b
TD 0 0 0 0 1 2 e
c d
TT 0 0 0 0 0 0
e f pai e f
BP(e) (e) = { f, b }
BP(f)
G a b c d e f
a b
TD 0 0 0 0 1 2 e
c d
TT 0 0 0 0 0 0
e f pai e f
BP(e) (e) = { f, b }
BP(f) (f) = { b }
G a b c d e f
a b
TD 0 0 0 0 1 2 e
c d
TT 0 0 0 0 0 0
e f pai f e f
BP(e) (e) = { f, b }
b
BP(f) (f) = { b }
G a b c d e f
a b
TD 0 3 0 0 1 2 e
c d
TT 0 0 0 0 0 0
e f pai f e f
BP(e) (e) = { f, b }
b
BP(f) (f) = { b }
BP(b)
Vértice não explorado Vértice marcado Vértice explorado
Representação da busca
Aresta não explorada Aresta de árvore Aresta de retorno
Aresta de avanço Aresta de cruzamento
Busca em Profundidade – Exemplo
G a b c d e f
a b
TD 0 3 0 0 1 2 e
c d
TT 0 0 0 0 0 0
e f pai f e f
BP(e) (e) = { f, b }
b
BP(f) (f) = { b }
BP(b) (b) = { d }
Vértice não explorado Vértice marcado Vértice explorado
Representação da busca
Aresta não explorada Aresta de árvore Aresta de retorno
Aresta de avanço Aresta de cruzamento
Busca em Profundidade – Exemplo
G a b c d e f
a b
TD 0 3 0 0 1 2 e
c d
TT 0 0 0 0 0 0
e f pai f b e f
BP(e) (e) = { f, b }
b
BP(f) (f) = { b }
BP(b) (b) = { d }
d
Vértice não explorado Vértice marcado Vértice explorado
Representação da busca
Aresta não explorada Aresta de árvore Aresta de retorno
Aresta de avanço Aresta de cruzamento
Busca em Profundidade – Exemplo
G a b c d e f
a b
TD 0 3 0 4 1 2 e
c d
TT 0 0 0 0 0 0
e f pai f b e f
G a b c d e f
a b
TD 0 3 0 4 1 2 e
c d
TT 0 0 0 0 0 0
e f pai f b e f
G a b c d e f
a b
TD 0 3 0 4 1 2 e
c d
TT 0 0 0 0 0 0
e f pai f b e f
G a b c d e f
a b
TD 0 3 0 4 1 2 e
c d
TT 0 0 0 5 0 0
e f pai f b e f
G a b c d e f
a b
TD 0 3 0 4 1 2 e
c d
TT 0 0 0 5 0 0
e f pai f b e f
Retrocede para
BP(e) (e) = { f, b } BP(d) (d) = { f } continuar a busca
b
BP(f) (f) = { b }
BP(b) (b) = { d }
d
Vértice não explorado Vértice marcado Vértice explorado
Representação da busca
Aresta não explorada Aresta de árvore Aresta de retorno
Aresta de avanço Aresta de cruzamento
Busca em Profundidade – Exemplo
G a b c d e f
a b
TD 0 3 0 4 1 2 e
c d
TT 0 6 0 5 0 0
e f pai f b e f
Retrocede para
BP(e) (e) = { f, b } BP(d) (d) = { f } continuar a busca
b
BP(f) (f) = { b }
BP(b) (b) = { d }
d
Vértice não explorado Vértice marcado Vértice explorado
Representação da busca
Aresta não explorada Aresta de árvore Aresta de retorno
Aresta de avanço Aresta de cruzamento
Busca em Profundidade – Exemplo
G a b c d e f
a b
TD 0 3 0 4 1 2 e
c d
TT 0 6 0 5 0 0 Retrocede para
continuar a busca
e f pai f b e f
G a b c d e f
a b
TD 0 3 0 4 1 2 e
c d
TT 0 6 0 5 0 7 Retrocede para
continuar a busca
e f pai f b e f
G a b c d e f
a b
TD 0 3 0 4 1 2 e
c d
TT 0 6 0 5 8 7
e f pai f b e f
G a b c d e f
a b
TD 0 3 0 4 1 2 e
c d
TT 0 6 0 5 8 7
e f pai f b e f
Raiz
BP(e) (e) = { f, b } BP(d) (d) = { f }
inicial
b
BP(f) (f) = { b }
BP(b) (b) = { d }
d
Vértice não explorado Vértice marcado Vértice explorado
Representação da busca
Aresta não explorada Aresta de árvore Aresta de retorno
Aresta de avanço Aresta de cruzamento
Busca em Profundidade – Exemplo
G a b c d e f
a b
TD 0 3 9 4 1 2 e c
c d
TT 0 6 0 5 8 7
e f pai f b e f
Nova
BP(e) (e) = { f, b } BP(d) (d) = { f }
raiz
b
BP(f) (f) = { b } BP(c)
BP(b) (b) = { d }
d
Vértice não explorado Vértice marcado Vértice explorado
Representação da busca
Aresta não explorada Aresta de árvore Aresta de retorno
Aresta de avanço Aresta de cruzamento
Busca em Profundidade – Exemplo
G a b c d e f
a b
TD 0 3 9 4 1 2 e c
c d
TT 0 6 0 5 8 7
e f pai f b e f
G a b c d e f
a b
TD 0 3 9 4 1 2 e c
c d
TT 0 6 0 5 8 7
e f pai c f b e f a
G a b c d e f
a b
TD 10 3 9 4 1 2 e c
c d
TT 0 6 0 5 8 7
e f pai c f b e f a
G a b c d e f
a b
TD 10 3 9 4 1 2 e c
c d
TT 0 6 0 5 8 7
e f pai c f b e f a
G a b c d e f
a b
TD 10 3 9 4 1 2 e c
c d
TT 0 6 0 5 8 7
e f pai c f b e f a
G a b c d e f
a b
TD 10 3 9 4 1 2 e c
c d
TT 0 6 0 5 8 7
e f pai c f b e f a
G a b c d e f
a b
TD 10 3 9 4 1 2 e c
c d
TT 11 6 0 5 8 7
e f pai c f b e f a
G a b c d e f
a b
TD 10 3 9 4 1 2 e c
c d
TT 11 6 12 5 8 7
e f pai c f b e f a
G a b
Tempo
c d Vértice
1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e f e
f
a b c d e f b
TD 10 3 9 4 1 2 d
TT 11 6 12 5 8 7 c
pai c f b e a
Intervalos de Vida
G a b
Tempo
c d Vértice
1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e f e
f
a b c d e f b
TD 10 3 9 4 1 2 d
TT 11 6 12 5 8 7 c
pai c f b e a
Intervalos de Vida
G a b
Tempo
c d Vértice
1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e f e
f
a b c d e f b
TD 10 3 9 4 1 2 d
TT 11 6 12 5 8 7 c
pai c f b e a
Intervalos de Vida
G a b
Tempo
c d Vértice
1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e f e
f
a b c d e f b
TD 10 3 9 4 1 2 d
TT 11 6 12 5 8 7 c
pai c f b e a
Intervalos de Vida
G a b
Tempo
c d Vértice
1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e f e
f
a b c d e f b
TD 10 3 9 4 1 2 d
TT 11 6 12 5 8 7 c
pai c f b e a
Intervalos de Vida
G a b
Tempo
c d Vértice
1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e f e
f
a b c d e f b
TD 10 3 9 4 1 2 d
TT 11 6 12 5 8 7 c
pai c f b e a
Intervalos de Vida
G a b
Tempo
c d Vértice
1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e f e
f
a b c d e f b
TD 10 3 9 4 1 2 d
TT 11 6 12 5 8 7 c
pai c f b e a
Intervalos de Vida
Seja I(v) o intervalo de vida do vértice v ou I(v) = [ TD[v], TT[v] ].
Tempo
e c Vértice
1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e
f a
f
b
b (v, w) é aresta de árvore
d
c
d
I(v) contém I(w) e a
TD[w] = 0 no momento da visita
ou ainda, v é pai de w
Intervalos de Vida
Seja I(v) o intervalo de vida do vértice v ou I(v) = [ TD[v], TT[v] ].
Tempo
e c Vértice
1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e
f a
f
b
b (v, w) é aresta de avanço
d
c
d
I(v) contém I(w) e a
TD[w] 0 no momento da visita
ou ainda, v não é pai de w
Intervalos de Vida
Seja I(v) o intervalo de vida do vértice v ou I(v) = [ TD[v], TT[v] ].
Tempo
e c Vértice
1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e
f a
f
b
b (v, w) é aresta de retorno
d
c
d
I(v) está contido em I(w) a
Intervalos de Vida
Seja I(v) o intervalo de vida do vértice v ou I(v) = [ TD[v], TT[v] ].
Tempo
e c Vértice
1 2 3 4 5 6 7 8 9 10 11 12
Em ordem crescente de TD
e
f a
f
b
b (v, w) é aresta de cruzamento
d
c
d
I(v) está totalmente a
a direita de I(w)