Algoritmos e estruturas de dados · Grafos · 7 min de leitura
Grafos: busca em largura (BFS) e em profundidade (DFS)
Redes sociais, mapas, dependências de build: tudo é grafo. A BFS acha o caminho com menos arestas usando uma fila; a DFS explora até o fim usando uma pilha ou recursão.
Arraste para o lado para ver o diagrama inteiro.
Como representar
Um grafo tem vértices (pessoas, cidades, módulos) e arestas (amizade, estrada, dependência), com ou sem direção e peso. A forma mais comum é a lista de adjacência: um mapa de cada vértice para seus vizinhos. Matriz de adjacência (V × V) só compensa em grafos densos.
BFS: em largura
Usa uma fila e um conjunto de visitados. Visita todos os vizinhos antes de ir mais longe, então a primeira vez que alcança um vértice é pelo menor número de arestas — caminho mais curto em grafo sem peso (labirintos, "graus de separação"). Com pesos, use Dijkstra (heap) no lugar.
DFS: em profundidade
Usa uma pilha (ou recursão) e vai até o fim de um caminho antes de voltar. Serve para achar ciclos, componentes conectados, ordenação topológica (em que ordem compilar módulos ou rodar migrations) e resolver labirintos. Em grafos grandes, prefira a pilha explícita para não estourar a pilha de chamadas.
No código
// Menor número de passos de 'origem' até 'destino' (ou -1 se não há caminho)
fun distancia(grafo: Map<String, List<String>>, origem: String, destino: String): Int {
val fila = ArrayDeque(listOf(origem))
val dist = hashMapOf(origem to 0) // também serve de "visitados"
while (fila.isNotEmpty()) {
val v = fila.removeFirst()
if (v == destino) return dist.getValue(v)
for (viz in grafo[v].orEmpty()) {
if (viz !in dist) {
dist[viz] = dist.getValue(v) + 1
fila.addLast(viz)
}
}
}
return -1
} Marcar o vértice ao enfileirar (e não ao tirar da fila) evita que ele entre duas vezes. Cada vértice e cada aresta são vistos uma vez: O(V + E).
Em resumo
- Lista de adjacência: mapa de vértice para vizinhos.
- BFS = fila: menor número de arestas.
- DFS = pilha/recursão: ciclos, ordem topológica.
- Marque visitados para não entrar em laço.
- Ambas são O(V + E).
Exercícios
Responda e confira na hora. Complexidades valem com ou sem espaços, como O(n log n).
-
Qual busca encontra o caminho com menos arestas num grafo sem pesos: BFS ou DFS?
Ver a solução
Resposta: BFS. A BFS visita por níveis, então chega a cada vértice pela menor quantidade de arestas.
-
Qual estrutura auxiliar a BFS usa: pilha ou fila?
Ver a solução
Resposta: fila. A fila garante que os vértices mais próximos (descobertos antes) sejam visitados primeiro.
-
Qual a complexidade da BFS com lista de adjacência, para V vértices e E arestas?
Ver a solução
Resposta: O(V + E). Cada vértice entra na fila uma vez (V) e cada aresta é examinada uma vez (E, ou 2E se não dirigido).
Vantagens e custos
- BFS garante o caminho mais curto em arestas.
- DFS usa pouca memória em grafos profundos e estreitos.
- As duas são simples e lineares no tamanho do grafo.
- BFS guarda um nível inteiro na fila (muita memória em grafos largos).
- DFS recursiva pode estourar a pilha.
- Nenhuma das duas considera pesos: aí entra Dijkstra.
Perguntar à IA
Monte um prompt pronto sobre Grafos: busca em largura (BFS) e em profundidade (DFS) na sua linguagem e no seu caso, e abra num chat gratuito.
O prompt vai para o site que você escolher. Não cole senhas, tokens nem dados reais de clientes. Para Gemini e outros, copie e cole.