Matemática Discretapara Engenheiros

Estruturas, provas e intuição

EN | PT

Busca em Profundidade (DFS)

Parte 7 — Aplicações II (SCC & Estruturas Avançadas)

Série: Busca em Profundidade (DFS) Parte 7 de 8

7. Aplicações II


Roteiro (o que você aprenderá nesta parte):
  1. O que são componentes fortemente conexas (SCC)
  2. Por que os tempos de finalização voltam a ser importantes
  3. A intuição do grafo transposto
  4. O algoritmo de Kosaraju
  5. Por que o algoritmo funciona
  6. Estruturas avançadas baseadas em DFS

A Busca em Profundidade se torna especialmente poderosa quando passamos da simples travessia para a decomposição estrutural do grafo.

Nesta parte estudamos as componentes fortemente conexas (SCC) e como a DFS revela a estrutura global de grafos direcionados.

7.1 Componentes Fortemente Conexas

Em um grafo direcionado, dois vértices u e v são fortemente conectados se:

\( u \leadsto v \quad \text{e} \quad v \leadsto u \)

Ou seja, cada vértice consegue alcançar o outro.

Uma componente fortemente conexa é um conjunto máximo de vértices que são mutuamente alcançáveis.

Interpretação: dentro de uma SCC, qualquer vértice pode alcançar qualquer outro.

7.2 SCC como Estrutura de Alto Nível

Se colapsarmos cada SCC em um único vértice, obtemos o chamado grafo de condensação.

Teorema. O grafo de condensação de um grafo direcionado é um DAG.

Assim, a decomposição em SCC transforma um grafo arbitrário em uma estrutura acíclica entre componentes.

7.3 Por que os Tempos de Finalização Importam

Os tempos de finalização da DFS revelam a ordem estrutural entre componentes.

Se uma SCC alcança outra SCC, a primeira tende a terminar depois na DFS.

7.4 O Grafo Transposto

O grafo transposto de um grafo direcionado G = (V,E) é o grafo G^T = (V,E^T) obtido invertendo todas as arestas.

\( (u,v) \in E \iff (v,u) \in E^{T} \)

As SCCs permanecem as mesmas, mas a direção entre componentes é invertida.

7.5 Algoritmo de Kosaraju

  1. Executar DFS em G e registrar tempos de finalização.
  2. Construir o grafo transposto G^T.
  3. Executar DFS em G^T na ordem decrescente de tempos de finalização.
  4. Cada árvore DFS corresponde a uma SCC.

7.6 Pseudocódigo de Kosaraju

KOSARAJU(G):

    execute DFS(G)

    ordenar vértices por tempo de finalização decrescente

    construir G^T

    marcar todos os vértices como WHITE

    para cada vértice u na ordem calculada:
        se color[u] == WHITE:
            DFS-VISIT(G^T, u)
            os vértices visitados formam uma SCC

7.7 Por que Kosaraju Funciona

A primeira DFS calcula uma ordem que respeita a estrutura entre componentes.

No grafo transposto, iniciar DFS pelo maior tempo de finalização garante que exploramos exatamente uma SCC por vez.

7.8 Complexidade

O(|V| + |E|)
  • DFS inicial
  • Construção do grafo transposto
  • Segunda DFS

7.9 Estruturas Avançadas Baseadas em DFS

  • Algoritmo de Tarjan para SCC
  • Pontes em grafos
  • Pontos de articulação
  • Componentes biconexas
  • Valores low-link

7.10 Aplicações em Engenharia

  • análise de dependências entre módulos
  • detecção de ciclos em sistemas
  • otimizações de compiladores
  • análise de grafos de serviços

7.11 Mini Resumo

  • SCC são conjuntos máximos de vértices mutuamente alcançáveis.
  • Colapsar SCC produz um DAG.
  • Kosaraju usa duas DFS.
  • DFS revela estruturas profundas do grafo.

Próximo: Parte 8 — DFS vs BFS

Agora que exploramos profundamente a DFS, finalizamos a série comparando as duas estratégias fundamentais de busca em grafos.