Módulo 7 - Percursos em grafos: largura, profundidade e caminho

Achar o caminho mais curto com a busca em largura

9 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 12/07/2026

O que você vai aprender

  • Usar a busca em largura para achar o caminho mais curto em passos.
  • Guardar de onde cada vértice foi descoberto para reconstruir a rota.
  • Reconstruir o caminho seguindo as anotações de trás para frente.
  • Aplicar a ideia a labirintos e ao grau de separação.

A primeira vez que se chega é a mais curta

A aula da busca em largura já deixou a pista: como ela explora camada por camada, a primeira vez que toca um vértice é sempre pelo caminho com o menor número de passos. Falta transformar essa propriedade num caminho concreto que você possa mostrar. O truque é simples e elegante: toda vez que a busca descobre um vértice novo através de um vizinho, ela anota quem foi esse vizinho. É como deixar uma trilha de migalhas. Cada vértice passa a saber de onde veio, e essa anotação, feita uma única vez no momento da descoberta, é tudo que você precisa para refazer o trajeto depois.

Pense num carteiro que espalha a notícia de casa em casa. Cada casa que recebe o recado anota de qual vizinha ouviu primeiro. Quando você quer saber o caminho da casa de origem até uma casa qualquer, basta perguntar a essa casa quem lhe contou, depois perguntar à casa anterior a mesma coisa, e assim por diante, até chegar na origem. Você anda de trás para frente pela trilha de migalhas. Como cada casa ouviu primeiro pela rota mais curta (a notícia se espalha em ondas, como na busca em largura), o caminho reconstruído é o mais curto possível em número de passos.

Um grafo com vértices em forma de mapa. O vértice de início é S e o destino é T. Cada vértice tem uma pequena etiqueta com uma seta apontando para o vértice de onde ele foi descoberto (o predecessor). Uma linha grossa destacada segue as etiquetas de T de volta até S, mostrando o caminho mais curto reconstruído: S, A, C, T. Vértices fora desse caminho aparecem em tom apagado.
Cada vértice guarda de onde veio. Seguindo essas setas de T até S e invertendo, reconstrói-se o caminho mais curto.

Guardar de onde cada um veio

Na prática, você acrescenta à busca em largura uma tabela que associa cada vértice ao seu predecessor, o vértice de onde ele foi descoberto. O início não tem predecessor, ele é o ponto de partida. A cada vizinho novo que entra na fila, você grava nessa tabela: o predecessor deste vizinho é o vértice atual. Quando a busca termina, ou quando ela alcança o destino, você reconstrói o caminho começando no destino, olhando seu predecessor, depois o predecessor do predecessor, até cair no início. Essa sequência sai de trás para frente, então basta invertê-la para ter o caminho na ordem natural, do começo ao fim.

fila <- [inicio]
visitados <- {inicio}
veio_de <- {}         // predecessor de cada vértice
enquanto fila não está vazia faça
  atual <- tira da frente da fila
  para cada vizinho de atual faça
    se vizinho não está em visitados então
      adiciona vizinho em visitados
      veio_de[vizinho] <- atual   // anota a migalha
      coloca vizinho no fim da fila
    fim
  fim
fim
// reconstruir do destino até o início:
caminho <- []
passo <- destino
enquanto passo existe faça
  coloca passo no início de caminho
  passo <- veio_de[passo]
fim
escreva(caminho)

A tabela veio_de guarda o predecessor de cada vértice. No fim, seguir de destino até início e inverter dá o caminho mais curto.

🎮 Jogo da aula

Ache a saída pelo menor caminho

O robô está no canto de cima e a estrela no canto de baixo. Existe um caminho livre em volta das paredes. Guie o robô até a estrela, pensando como a busca em largura: cada passo troca uma linha ou uma coluna.

Um labirinto é só um grafo disfarçado: cada casa livre é um vértice, e há uma aresta entre casas vizinhas que não têm parede entre elas. Rodar a busca em largura a partir da casa inicial encontra o menor número de passos até a saída, e a trilha de predecessores devolve o caminho exato. É assim que aplicativos de rota calculam trajetos em grades e que jogos movem inimigos até o jogador. O mesmo raciocínio responde o grau de separação: numa rede de amizades, a busca em largura a partir de uma pessoa acha em quantos apertos de mão você chega a outra, e por qual sequência de amigos.

Cuidados ao reconstruir o caminho

Dois cuidados evitam a maioria dos erros. O primeiro é lembrar que o caminho sai invertido: você o monta do destino para o início, então precisa virá-lo antes de mostrar, ou ir colocando cada passo no começo da lista, como no exemplo. Esquecer de inverter é um deslize comum e faz o programa dizer que a rota começa no destino. O segundo é tratar o caso de não existir caminho: se o destino nunca aparece no conjunto de visitados, ele é inalcançável, e a reconstrução deve avisar isso em vez de tentar seguir uma trilha que não existe. Vale ainda lembrar que essa técnica dá o menor caminho em passos iguais; quando as arestas têm pesos diferentes (distâncias, tempos), a busca em largura simples não basta e entram algoritmos de caminho mínimo ponderado, um assunto mais avançado.

Teste rápido

Para a busca em largura conseguir devolver o caminho mais curto, e não só a distância, o que ela precisa guardar?

Perguntas frequentes

Por que a busca em largura acha o caminho mais curto e a profundidade não?
Porque a largura explora em camadas: ela só chega aos vértices a dois passos depois de esgotar os que estão a um passo. Assim, a primeira vez que alcança um vértice é sempre pela rota mais curta. A profundidade mergulha fundo antes de olhar os vizinhos próximos, então o primeiro caminho que encontra pode ser longo e cheio de voltas.
O que é a trilha de predecessores?
É uma tabela em que cada vértice guarda de onde foi descoberto durante a busca. Como uma trilha de migalhas: seguindo de vértice em vértice, do destino de volta ao início, você reconstrói o caminho inteiro. Sem ela, a busca sabe a que distância está o destino, mas não consegue mostrar por onde passar.
Por que o caminho sai invertido?
Porque você o reconstrói a partir do destino: pergunta ao destino quem foi seu predecessor, depois ao predecessor dele, e assim por diante até o início. Essa sequência nasce de trás para frente. Basta invertê-la, ou ir inserindo cada passo no começo da lista, para tê-la na ordem natural, do início ao destino.
E se não existir caminho entre os dois pontos?
Se o destino nunca entra no conjunto de visitados, ele é inalcançável a partir do início, e não há caminho. O programa deve verificar isso antes de reconstruir e avisar que a rota não existe, em vez de tentar seguir uma trilha de predecessores que não foi criada. É o caso de partes desconectadas do grafo.
Essa técnica serve para o mapa de um aplicativo de trânsito?
Serve para o caminho mais curto em passos iguais, como uma grade de quarteirões sem considerar distância ou tempo. Quando as ruas têm comprimentos diferentes, ou o trânsito muda o custo de cada trecho, entram algoritmos de caminho mínimo ponderado. A busca em largura é a base, e esses algoritmos são a evolução dela para arestas com peso.
O que é o grau de separação e como a BFS o calcula?
É o menor número de intermediários entre duas pessoas numa rede. Modelando pessoas como vértices e amizades como arestas, uma busca em largura a partir de alguém descobre, camada por camada, a quantos passos estão as outras pessoas. A camada em que alguém aparece é o grau de separação, e a trilha de predecessores mostra por qual corrente de amigos se chega até lá.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.