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

Visitados e ciclos: como não andar em círculos

8 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 o conjunto de visitados é indispensável em grafos com ciclo.
  • Reconhecer que uma aresta para um vértice já visitado indica um ciclo.
  • Diferenciar grafo com ciclo de grafo sem ciclo (acíclico).
  • Ligar a marcação de visitados à detecção de ciclos.

O herói silencioso das buscas

Nas duas aulas de busca, o conjunto de visitados apareceu quase de passagem, mas é ele que separa um algoritmo que termina de um que trava. A árvore, que você estudou antes, tem uma propriedade cômoda: não há ciclos, então nunca se chega ao mesmo nó por dois caminhos, e uma busca pode até dispensar a marcação. O grafo geral não dá esse conforto. Como ele pode ter ciclos, dois vértices podem se ligar por várias rotas, e sem marcar quem já foi visto a busca redescobre os mesmos vértices repetidamente. Num grafo com ciclo, isso vira um loop sem fim: a busca dá voltas eternas na mesma região.

Pense em explorar um prédio com corredores que se conectam em anel. Se você não marca as portas por onde já passou, corre o risco de dar voltas no mesmo circuito para sempre, sem nunca cobrir o prédio inteiro. Marcar cada sala visitada com um giz é o que garante que você olhe cada sala uma vez e termine. O conjunto de visitados é esse giz. Ele custa pouco, uma anotação por vértice, e em troca torna a busca finita e eficiente em qualquer grafo, tenha ele ciclos ou não. É o tipo de detalhe que não chama atenção quando está lá e derruba tudo quando falta.

Dois grafos lado a lado. À esquerda, um grafo acíclico em forma de árvore, com um vértice raiz descendo para filhos, sem nenhuma volta. À direita, um grafo com um ciclo: os vértices A, B e C ligados em triângulo, e uma seta destacada de C de volta para A rotulada aresta para um visitado, indicando o ciclo. Setas mostram a busca girando no triângulo se não houvesse marcação de visitados.
À esquerda, um grafo sem ciclos (árvore). À direita, o ciclo A, B, C: a aresta que volta a um vértice já visitado o revela.

A aresta que volta revela o ciclo

O mesmo conjunto que evita o loop serve para uma pergunta importante: este grafo tem ciclo? A ideia é direta. Durante a busca, cada vez que você olha um vizinho, verifica se ele já está no conjunto de visitados. Num grafo sem ciclos, todo vizinho novo é inédito. Mas se a busca encontra uma aresta que leva a um vértice já visitado, e que não é simplesmente o vértice de onde ela acabou de vir, isso significa que existe outra rota até aquele vértice, ou seja, um ciclo. Detectar ciclos é essencial em muitos sistemas: descobrir dependências circulares entre tarefas, tabelas de banco de dados que se referenciam em anel, ou impasses em que A espera B que espera A.

visitados <- {}
tem_ciclo <- falso
função visita(atual, anterior):
  adiciona atual em visitados
  para cada vizinho de atual faça
    se vizinho não está em visitados então
      visita(vizinho, atual)
    senão se vizinho é diferente de anterior então
      tem_ciclo <- verdadeiro   // aresta para um já visitado: ciclo
    fim
  fim

Numa DFS, achar um vizinho já visitado que não seja o de onde viemos denuncia um ciclo no grafo.

🎮 Jogo da aula

Visitados e ciclos: verdadeiro ou falso

Decida se cada afirmação sobre o conjunto de visitados e os ciclos é verdadeira ou falsa.

Grafos com e sem ciclo no dia a dia

Saber se um grafo tem ciclo muda como você raciocina sobre ele. Grafos acíclicos aparecem sempre que existe uma ordem natural sem voltas: a hierarquia de pastas, a sequência de pré-requisitos de matérias, os passos de uma receita, as dependências de um projeto que precisam ser feitas numa ordem. Nesses casos, um ciclo seria um problema: uma matéria que exige a si mesma como pré-requisito, uma tarefa que depende de outra que depende dela. Detectar esse ciclo cedo evita impasses. Já grafos com ciclo são a regra em redes livres: mapas de ruas têm quarteirões que se fecham, redes sociais têm grupos de amigos que se conhecem entre si, a web tem páginas que se linkam em círculo. Nesses, o conjunto de visitados não é um luxo, é o que permite qualquer exploração terminar.

Teste rápido

Por que uma busca num grafo com ciclo pode nunca terminar se você não usar o conjunto de visitados?

Perguntas frequentes

O que exatamente é um ciclo num grafo?
É um caminho que sai de um vértice e retorna a ele passando por arestas diferentes, sem repetir. Onde há ciclo, dá para dar uma volta e voltar ao ponto de partida. Um grafo sem nenhum ciclo é chamado de acíclico, e a árvore é o exemplo mais conhecido: entre dois nós existe um único caminho.
Por que a árvore não precisa tanto do conjunto de visitados?
Porque a árvore é acíclica: nunca se chega ao mesmo nó por dois caminhos, então a busca não corre o risco de reencontrar um vértice e entrar em loop. No grafo geral, que pode ter ciclos, a marcação passa a ser indispensável. Ainda assim, manter o conjunto de visitados na árvore não atrapalha e evita surpresas.
Como a busca detecta que há um ciclo?
Enquanto percorre, ela verifica cada vizinho. Se encontra um vizinho que já está no conjunto de visitados, e que não é apenas o vértice de onde acabou de vir, isso significa que existe outra rota até aquele vértice, ou seja, um ciclo. Essa aresta que volta a um já visitado é a assinatura do ciclo.
Detectar ciclos serve para quê no mundo real?
Para muita coisa: descobrir dependências circulares entre tarefas de um projeto, pré-requisitos de matérias que se exigem em anel, tabelas de banco que se referenciam mutuamente, ou impasses em que um processo espera outro que espera o primeiro. Achar o ciclo cedo evita travamentos e ordens impossíveis de cumprir.
O conjunto de visitados serve para as duas buscas?
Sim, tanto a busca em largura quanto a em profundidade dependem dele pelo mesmo motivo. Sem marcar quem já foi visto, um grafo com ciclo faz ambas rodarem para sempre. Na profundidade recursiva, o esquecimento vira recursão infinita, que estoura a pilha de chamadas. É uma peça comum e obrigatória das duas.
Marcar visitados deixa a busca mais lenta?
Ao contrário, deixa mais rápida e segura. Cada vértice é marcado uma vez e consultado com custo pequeno, o que evita reprocessar vértices repetidos e impede o loop infinito. O ganho de nunca refazer trabalho supera de longe o custo mínimo da marcação. Sem ela, além do risco de travar, a busca faria trabalho repetido à toa.

Fontes

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