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 vizinhovque ainda não tenha sido visitado. - Aprofunda Recursivamente: Assim que um vizinho
vnã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
vtermina (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).

Implementação

