8 min

DFS (Depth-First Search)

Algoritmo de busca em profundidade que explora o grafo indo o mais fundo possível antes de retroceder.

MédiaO(V + E) / O(V)GrafoBuscaRecursãoStack

Visualizador Interativo

DFS - Busca em ProfundidadeInicio: APasso 1 / 24
Atual
Visitado
Na pilha
Explorando
Pilha: [A](topo a direita)
Ordem de Visitacao
Nenhum vertice visitado ainda
Velocidade:800ms
Historico de Passos
#0Iniciando DFS a partir de A. Pilha: [A]

Como Funciona

DFS (Depth-First Search) explora um grafo indo o mais fundo possível em cada ramo antes de retroceder. Imagine explorar um labirinto: você segue um corredor até o fim, depois volta e tenta outro caminho. A ideia é simples: visite um vértice, marque como visitado, e recursivamente visite todos os vizinhos não visitados. Quando não houver mais vizinhos para explorar, retroceda (backtrack) para o vértice anterior. DFS pode ser implementado de duas formas: - Recursivo: usa a pilha de chamadas do sistema - Iterativo: usa uma pilha explícita A versão recursiva é mais elegante, mas pode causar stack overflow em grafos muito profundos. A versão iterativa é mais segura para grafos grandes.

DFS usa uma pilha (implícita na recursão ou explícita) para lembrar de onde veio, permitindo explorar profundamente e depois retroceder.

Passo a Passo

  1. Comece pelo vértice inicial e marque como visitado
  2. Para cada vizinho não visitado, vá recursivamente mais fundo
  3. Quando todos os vizinhos forem visitados, retroceda
  4. Continue até visitar todos os vértices alcançáveis

Análise de Complexidade

⏱️Tempo
O(V + E)

Cada vértice é visitado uma vez, e cada aresta é examinada uma vez.

Ver prova

O conjunto visited garante que cada vértice entra no processamento apenas uma vez. Para cada vértice, iteramos sobre suas arestas adjacentes.

💾Espaco
O(V)

No pior caso, a pilha de recursão pode ter todos os vértices (grafo linear).

🎯Melhor Caso
O(V + E)

Mesmo no melhor caso, precisamos verificar todas as arestas.

⚠️Pior Caso
O(V + E)

Visitamos todos os vértices e examinamos todas as arestas.

Comparação com Outros Algoritmos

AlgoritmoTempoEspacoMelhor Para
DFS(atual)O(V + E)O(V)Detecção de ciclos, ordenação topológica, componentes conexos
BFSO(V + E)O(V)Caminho mais curto em grafos sem peso, níveis de distância
DijkstraO((V+E) log V)O(V)Caminho mais curto com pesos positivos

Dicas e Erros Comuns

  • Esquecer de marcar vértices como visitados (causa loop infinito em grafos com ciclos)
  • Confundir ordem de visitação com ordem de finalização
  • Não tratar grafos desconexos (DFS só visita vértices alcançáveis do início)
  • Usar recursão em grafos muito profundos sem considerar limite de pilha

Perguntas de Entrevista

Pratique respondendo a perguntas comuns de entrevistas tecnicas. Clique em uma pergunta para iniciar uma sessao de pratica com IA.

Implementacao

python
1def dfs_recursive(graph, start, visited=None):Definição
2 if visited is None:Conjunto Visitados
3 visited = set()Conjunto Visitados
4
5 if start in visited:Caso Base
6 returnCaso Base
7
8 visited.add(start)Marcar Visitado
9 print(start)Processar Vértice
10
11 for neighbor in graph[start]:Recursão
12 dfs_recursive(graph, neighbor, visited)Recursão
13
14
15def dfs_iterative(graph, start):Definição
16 visited = set()Conjunto Visitados
17 stack = [start]Empilhar
18
19 while stack:Loop Principal
20 vertex = stack.pop()Desempilhar
21
22 if vertex in visited:Caso Base
23 continueCaso Base
24
25 visited.add(vertex)Marcar Visitado
26 print(vertex)Processar Vértice
27
28 for neighbor in graph[vertex]:Recursão
29 if neighbor not in visited:Recursão
30 stack.append(neighbor)Empilhar
31