Algoritmo de buscam em profundidade - DFS
A Busca em Profundidade, ou DFS (Depth-First Search), é um algoritmo para percorrer ou pesquisar em um grafo.
A ideia central do DFS é explorar o mais “fundo” possível ao longo de cada ramo antes de retroceder (o que é chamado de backtracking).
Algoritmo
Este algoritmo, em sua essência, é um processo recursivo e o seu funcionamento a partir de um vértice u
segue estes passos:
- Atinge um Vértice: A busca atingiu em um vértice
u
. - Escolhe um Vizinho: A partir de
u
, o algoritmo procura por um vizinhov
que ainda não tenha sido visitado. - Aprofunda Recursivamente: Assim que um vizinho
v
não visitado é encontrado, a busca em profundidade é chamada recursivamente para começar a partir dev
. - Retorna da Recursão: Quando a busca recursiva que começou em
v
termina (ou seja, explorou todos os caminhos possíveis a partir dev
), o algoritmo retorna para o vérticeu
. - Tenta Outro Vizinho: De volta a
u
, o algoritmo tenta encontrar outro vizinho que ainda não foi visitado para repetir o processo. - Retrocede (Backtracking): Se não houver mais vizinhos não visitados a partir de
u
, a busca a partir deu
é considerada completa. O algoritmo então retorna ao nível anterior da recursão (o vértice que o levou au
), um processo conhecido como backtracking.
Mecanismo de Controle (Cores)
Para controlar quais vértices já foram visitados, o algoritmo utiliza um sistema de três cores:
- BRANCO: O vértice ainda não foi descoberto.
- CINZA: O vértice foi descoberto, mas está aguardado encerrar a visita em todos os seus descendentes.
- PRETO: O vértice e todos os seus descendentes já foram completamente explorados.
Classificação de Arestas
Os arcos de retorno (back), avanço (forward) e cruzado (cross) são classificações dadas às arestas de um grafo durante a execução de uma Busca em Profundidade (DFS).
Arco de Retorno (Back Edge)
É um arco que conecta um vértice a um de seus ancestrais.
Note
A presença de um arco de retorno indica a existência de um ciclo no grafo.
Arco de Avanço (Forward Edge)
É um arco que conecta um vértice a um de seus descendentes, mas que não é uma aresta do caminho principal.
Arco Cruzado (Cross Edge)
É um arco que conecta dois vértices que não têm relação de ancestralidade (não são nem ancestrais nem descendentes um do outro).