Você está na página 1de 4

Organizao

Algoritmos e Estruturas de Dados II


Algoritmos & Estruturas de Dados II

Definio e Motivao Algoritmo DFS


Pseudo-cdigo Anlise de Complexidade Implementao simples em C

Grafos IV:
Busca em Profundidade
Ricardo J. G. B. Campello
Parte deste material baseado em adaptaes e extenses de slides disponveis em http://ww3.datastructures.net (Goodrich & Tamassia).

Exemplo de Execuo DFS Propriedades do Percurso DFS Busca por Ciclos via DFS

Busca em Profundidade
Busca em Profundidade (DFS) uma estratgia geral de caminhamento em grafos DFS em um grafo G:
Visita todos os vrtices e arestas de G
Algoritmos & Estruturas de Dados II

Busca em Profundidade
Um algoritmo do tipo DFS usa marcadores para direcionar o percurso (caminhamento) A forma mais geral marcar ambos vrtices e arestas As arestas so marcadas como de descoberta ou retorno
Arestas de descoberta levam a vrtices no descobertos
so tambm chamadas arestas de rvore (tree edges) B A

DFS pode ser estendida para resolver outros problemas em grafos:


Encontrar um caminho entre um dado par de vrtices, caso exista
Algoritmos & Estruturas de Dados II

Alternativamente, pode-se marcar apenas os vrtices, como no descobertos, descobertos e explorados


Adota-se aqui esta abordagem

Descobre os componentes conexos de G


logo, se G conexo ou no

Encontrar um ciclo simples, caso exista Encontrar uma floresta geradora de G


rvore geradora para G conexo

Para percorrer todo um grafo no conexo, DFS deve ser executada mltiplas vezes, sempre a partir de um vrtice no visitado nas anteriores

Encontrar uma ordenao topolgica em um digrafo acclico, caso exista


3

As demais so de retorno:
levam a vrtices antecessores no parentesco de descobrimento C

Algoritmo DFS
Algoritmo DFS(G, v) v.label DESCOBERTO process_vertex(v) para todo e incidentEdges(G, v) y opposite(G, v, e) se y.label = NO-DESCOBERTO y.parent v DFS(G, y) seno se ( y.label = EXPLORADO ) process_edge(e) v.label EXPLORADO
Assume-se que inicialmente os vrtices de G so rotulados como no descobertos.

Implementao C (Skiena & Revilla, 2003)


Garante que cada aresta no ser processada duas vezes. Em particular, cada aresta (v,y) s ser processada se y tiver sido descoberto, mas ainda no explorado, ou seja: - Na 2 avaliao desta aresta ou - Quando ciclo encontrado

Algoritmos & Estruturas de Dados II

Tempo O(n+m): lista de adjacncias ou estrutura alternativa

Algoritmos & Estruturas de Dados II

Exemplo
vrtice no descoberto vrtice descoberto vrtice explorado arestas no processadas aresta de descoberta aresta de retorno
A B C D E

B C A B C A B C

Exemplo (cont.)
A B C
Algoritmos & Estruturas de Dados II

A D E B C D E

Algoritmos & Estruturas de Dados II

A B C D E B

A D C
8

Exemplo (cont.)
B A B C B
Algoritmos & Estruturas de Dados II

A D C E

Propriedades
Propriedade 1:

B C

E A D C E
Algoritmos & Estruturas de Dados II

DFS(G,v) explora todos os vrtices e arestas de um componente conexo de v:


Por construo, todos os vrtices adjacentes a um vrtice explorado e as arestas correspondentes sero necessariamente explorados. Se o vrtice (aresta) est na parte conexa do grafo, ento necessariamente adjacente (incidente) a um vrtice explorado ou a um vrtice adjacente a um vrtice explorado, ou assim por diante, e portanto ser necessariamente explorado.

A A B C C
9

Propriedade 2:
As arestas de descoberta de DFS(G,v) formam uma rvore geradora do componente conexo de v:
Uma aresta nunca considerada como de descoberta se conecta dois vrtices j descobertos, portanto um ciclo nunca formado com esse tipo de aresta.
10

E B D E

Busca por Ciclos


Vimos que cada aresta (v,y) s processada:
Na 2 avaliao desta aresta, ou Quando ciclo encontrado (aresta de retorno)

B C

Busca por Ciclos (cont.)

Isso sugere as seguintes especializaes de DFS para buscar ciclos:

Algoritmos & Estruturas de Dados II

Algoritmos & Estruturas de Dados II

A parent D C
3 4

E
2

0 0
0 1 2

5
3 4

1
5

11

12

V
a b d c

Exerccios
1.

X
h e g f

Referncias
M. T. Goodrich and R. Tamassia, Data Structures and Algorithms in C++/Java, John Wiley & Sons, 2002/2005. N. Ziviani, Projeto de Algoritmos, Thomson, 2a. Edio, 2004. T. H. Cormen, C. E. Leiserson, and R. L. Rivest, Introduction to Algorithms, MIT Press, 2nd Edition, 2001.
Algoritmos & Estruturas de Dados II

Ilustre graficamente, conforme o exemplo dado em aula, as execues passo a passo do algoritmo DFS com incio em cada um dos vrtices do grafo acima. Nota: Destaque, em cada execuo, quais as arestas de cruzamento, as arestas de retorno, a rvore geradora resultante e a relao (vetor) de parentesco entre os vrtices: Elabore outros grafos e repita o Exerccio 1 para exercitar a busca DFS. Explique porque a complexidade O(n+m) do tempo de execuo de DFS no vlida para grafos implementados com estrutura de dados matriz de adjacncias. Analise a complexidade nesse caso. Reescreva o pseudo-cdigo da busca DFS de forma no recursiva. Utilize uma pilha para eliminar a recursividade.

Algoritmos & Estruturas de Dados II

2. 3.

S. Skiena e M. Revilla, Programming Challenges: The Programming Contest Training Manual, Springer-Verlag, 2003.

4.

13

14

Você também pode gostar