Matemática Discretapara Engenheiros

Estruturas, provas e intuição

EN | PT

Busca em Largura (BFS)

Parte 3 — O Algoritmo (Pseudocódigo CLRS)

Série: Busca em Largura (BFS) Parte 3 de 8

3. O Algoritmo


Roteiro (o que você aprenderá nesta parte):
  1. Definir o modelo formal usado pelo BFS
  2. Especificar o estado armazenado em cada vértice
  3. Apresentar o pseudocódigo do CLRS
  4. Explicar por que os predecessores formam uma árvore
  5. Analisar a complexidade de tempo

Nesta seção, formalizamos a Busca em Largura (BFS) utilizando a apresentação clássica do Introduction to Algorithms (CLRS).

Saímos da intuição e entramos na estrutura: estado preciso, passos precisos e garantias formais.

3.1 Objetivo

Dado um grafo G e um vértice fonte s, o BFS explora o grafo em ordem crescente de distância a partir de s.

Em grafos não ponderados, isso significa que o BFS calcula as menores distâncias (em número de arestas) de s até cada vértice alcançável.

3.2 Modelo Formal

Seja:

  • G = (V, E) um grafo
  • s ∈ V o vértice fonte
Hipótese: O BFS utiliza lista de adjacência Adj[u] para percorrer vizinhos eficientemente.

3.3 Estado dos Vértices

Cada vértice v ∈ V armazena:

  • color[v]WHITE, GRAY, BLACK
  • d[v] → distância a partir da fonte
  • π[v] → predecessor
Cor Significado
WHITE Ainda não descoberto
GRAY Descoberto, mas ainda não totalmente explorado
BLACK Totalmente explorado

Essa coloração impõe estrutura e evita revisitar vértices.

3.4 Pseudocódigo CLRS — BFS

BFS(G, s):

    para cada vértice u em V[G]:
        color[u] = WHITE
        d[u] = ∞
        π[u] = NIL

    color[s] = GRAY
    d[s] = 0
    π[s] = NIL

    Q = fila vazia
    ENQUEUE(Q, s)

    enquanto Q não estiver vazia:
        u = DEQUEUE(Q)

        para cada v em Adj[u]:
            se color[v] == WHITE:
                color[v] = GRAY
                d[v] = d[u] + 1
                π[v] = u
                ENQUEUE(Q, v)

        color[u] = BLACK
Ideia central: O BFS é guiado por FIFO. A fila força a exploração em camadas.

3.5 Garantias Estruturais

  1. Os vértices são explorados em ordem crescente de distância.
  2. A primeira vez que alcançamos um vértice, encontramos um caminho mínimo (em grafos não ponderados).
  3. Os predecessores π[v] formam uma árvore BFS.

3.6 Por que Isso Produz uma Árvore

Cada vértice (exceto a fonte) recebe exatamente um predecessor.

  • A relação de predecessores define uma árvore.
  • Se n vértices são alcançáveis, a árvore BFS possui exatamente n − 1 arestas.

3.7 Complexidade de Tempo

O(|V| + |E|)

Cada vértice é enfileirado no máximo uma vez. Cada aresta é examinada no máximo duas vezes (caso não direcionado).

Próxima: Parte 4 — Prova de Correção

Agora que temos o algoritmo em forma precisa, o próximo passo é justificá-lo formalmente. Na Parte 4, provaremos sua correção usando invariantes: por que as distâncias são mínimas e por que a ordem de exploração é garantida.