Módulo 15 - Projeto final: Mapa de Rotas

Achar o menor caminho com 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

  • Entender por que a busca em largura acha o menor caminho em passos.
  • Usar uma fila para controlar a ordem de visita dos vértices.
  • Usar um conjunto de visitados para não repetir pontos nem entrar em loop.
  • Seguir a busca em largura camada por camada sobre um grafo.

Explorar por camadas

Imagine jogar uma pedra na origem e ver as ondas se espalharem. A primeira onda toca os vizinhos diretos, a onda seguinte toca os vizinhos deles, e cada onda está sempre a um passo além da anterior. A busca em largura é essa onda. Ela visita a origem, depois todos que estão a um passo, depois todos que estão a dois passos, sem pular ninguém. Por avançar de forma tão organizada, quando a onda finalmente toca o destino, ela chegou pelo caminho mais curto em passos. É por isso que a busca em largura é a ferramenta certa para o Mapa de Rotas: queremos a rota com menos trechos, e a busca em largura entrega exatamente isso.

Duas estruturas fazem a onda funcionar. A fila controla a ordem de visita: quem é descoberto primeiro é visitado primeiro, o que mantém a exploração camada por camada. O conjunto de visitados guarda quem a busca já alcançou, para não voltar a lugares já vistos. Sem ele, num grafo com ciclos (e o metrô tem vários), a busca daria voltas eternas, visitando Centro, Norte, Centro, Norte, para sempre. Juntas, a fila e o conjunto de visitados são o coração da busca em largura.

Um grafo com a origem no centro e anéis concêntricos ao redor. O vértice de origem está pintado como camada 0. Os vizinhos diretos formam o anel da camada 1. Os vizinhos deles formam o anel da camada 2. Uma fila é desenhada ao lado, mostrando os vértices entrando pela direita e saindo pela esquerda, e um conjunto de visitados lista os vértices já pintados.
A busca em largura avança em camadas: a fila dá a ordem, o conjunto de visitados marca quem já foi alcançado.

A lógica, passo a passo

O algoritmo é um laço curto que repete quatro ideias. Começa colocando a origem na fila e marcando a origem como visitada. Enquanto a fila tiver alguém, tira o próximo da frente da fila (esse é o vértice atual), olha cada vizinho dele e, para todo vizinho ainda não visitado, marca como visitado e coloca na fila. A busca termina quando a fila esvazia (visitou tudo que dava para alcançar) ou quando o atual é o destino (achou). Repare que marcar o vizinho como visitado acontece no momento em que ele entra na fila, não quando sai. Marcar cedo é o que impede o mesmo ponto de entrar na fila várias vezes.

funcao busca_largura(grafo, origem, destino)
  fila <- [origem]
  visitados <- {origem}
  enquanto fila nao vazia faca
    atual <- desenfileirar(fila)   // tira da frente
    se atual = destino entao
      retorne "achou o destino"
    para cada vizinho de grafo[atual] faca
      se vizinho nao esta em visitados entao
        adicionar(visitados, vizinho)
        enfileirar(fila, vizinho)   // poe no fim
      fim
    fim
  fim
  retorne "sem caminho"
fim

A fila dá a ordem de visita; o conjunto de visitados garante que cada vértice entra uma vez só.

🎮 Jogo da aula

A ordem da busca em largura

Coloque os passos de uma iteração da busca em largura na ordem certa. Eles aparecem embaralhados.

    Por que ela dá o menor caminho

    A garantia do menor caminho vem da disciplina da fila. Como a busca sempre tira da fila quem entrou primeiro, ela esgota toda a camada de distância um antes de tocar em qualquer ponto de distância dois, e assim por diante. Logo, a primeira vez que um vértice é alcançado é sempre pela rota mais curta em passos, porque uma rota mais longa chegaria numa camada posterior, quando o ponto já estaria marcado como visitado e seria ignorado. Vale lembrar o limite: a busca em largura conta passos, não distância física nem tempo. Se cada trecho tivesse um peso diferente (uns longos, outros curtos), o menor caminho em quilômetros exigiria outro algoritmo. Para contar trechos, baldeações ou apertos de mão, a busca em largura é exata.

    Teste rápido

    Por que a busca em largura encontra o menor caminho em número de passos?

    Perguntas frequentes

    Por que a fila, e não uma pilha?
    A fila atende quem chegou primeiro, o que faz a busca avançar camada por camada e garante o menor caminho em passos. Uma pilha atende quem chegou por último, e leva à busca em profundidade, que mergulha fundo num ramo antes de olhar os outros. Para achar o caminho mais curto em passos, a ordem da fila é essencial.
    O que acontece se eu esquecer o conjunto de visitados?
    Num grafo com ciclos, a busca entra em loop: visita Centro, vai para Norte, volta para Centro, e assim para sempre, enchendo a fila sem parar. O conjunto de visitados corta isso: antes de enfileirar um vizinho, o algoritmo confere se ele já foi visto. Sem esse controle, a busca em largura simplesmente não termina.
    Devo marcar o vizinho como visitado ao enfileirar ou ao desenfileirar?
    Ao enfileirar, no momento em que ele é descoberto. Se você esperar até desenfileirar, o mesmo vértice pode ser descoberto por vários vizinhos e entrar na fila várias vezes, desperdiçando trabalho e podendo causar repetições. Marcar cedo, na descoberta, é a versão correta e enxuta da busca em largura.
    A busca em largura sempre acha um caminho?
    Só se existir um. Ela alcança todos os vértices acessíveis a partir da origem. Se o destino estiver nesse alcance, ela o encontra; se estiver numa parte desconectada do grafo, a fila esvazia sem achar, e o programa responde que não há caminho. Essa resposta negativa é correta, não um erro.
    E se houver vários caminhos mais curtos com o mesmo tamanho?
    A busca em largura encontra um deles, aquele que a ordem da fila e a ordem dos vizinhos fizerem aparecer primeiro. Todos têm o mesmo número de passos, então qualquer um serve como menor caminho. Se você precisar de um critério de desempate específico, ajusta a ordem em que os vizinhos são visitados.
    Dá para achar não só se existe, mas qual é o caminho?
    Dá, e é o assunto da próxima aula. A ideia é anotar, para cada vértice visitado, de quem ele foi descoberto (o pai). No fim, seguindo os pais do destino de volta até a origem, você reconstrói a rota. A busca em largura acha a distância; guardar os pais permite recuperar o caminho inteiro.

    Fontes

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