🎁 Cadastre-se agora e ganhe até 30 minutos grátis de uso de IA online. Sem cartão de crédito.

Algoritmo de Kosaraju: Guia de componentes fortemente conectados

August 22, 2026
Aprenda o algoritmo de Kosaraju para componentes fortemente conectados com intuição, etapas, complexidade, pseudocódigo, exemplos, erros comuns e prática de entrevista.
Gráfico direcionado decomposto em componentes fortemente conectados
Algoritmo de Kosaraju
componentes fortemente conectados
algoritmo de gráfico
preparação de entrevista de codificação

TL;DR: O algoritmo de Kosaraju encontra componentes fortemente conectados em um direcionado gráfico usando duas passagens de pesquisa em profundidade. Primeiro registre os vértices diminuindo o tempo de término, transponha cada aresta e depois explore o gráfico transposto nessa ordem. O tempo de execução é O(V + E) e o armazenamento auxiliar é O(V + E) quando a transposição é armazenada.

Algoritmo de Kosaraju: Guia de componentes fortemente conectados

Aprenda o algoritmo de Kosaraju para componentes fortemente conectados com intuição, etapas, complexidade, pseudocódigo, exemplos, erros comuns e prática de entrevista.

Experimente YesToTheOffer

Qual é o algoritmo de Kosaraju?

Gráfico direcionado decomposto em componentes fortemente conectados

O algoritmo de Kosaraju particiona um gráfico direcionado em componentes fortemente conectados, ou SCCs. Dentro de um SCC, cada vértice pode alcançar todos os outros vértices. Contrair cada SCC em um nó produz um gráfico acíclico direcionado, o que torna os componentes úteis para análise de dependência, gráficos de programas, acessibilidade e condensação de gráficos.

O algoritmo usa uma propriedade estrutural de pesquisa em profundidade. Os tempos de término do gráfico original identificam uma ordem segura para explorar o gráfico transposto. A reversão de cada borda troca os relacionamentos de origem e destino entre os componentes, de modo que uma pesquisa não pode vazar para um componente não atribuído quando os vértices são processados ​​na ordem correta.

Como funciona o algoritmo de duas passagens?

  1. Crie um conjunto visitado e uma lista de ordem de término vazia.
  2. Execute a pesquisa em profundidade de cada vértice não visitado no gráfico original.
  3. Anexe cada vértice depois que todos os seus vizinhos de saída terminarem.
  4. Construa a transposta invertendo cada aresta direcionada.
  5. Limpe o conjunto visitado.
  6. Processe os vértices na ordem de acabamento inversa.
  7. Cada árvore DFS no grafo transposto é um componente fortemente conectado.

Você pode armazenar vértices em uma pilha quando a primeira chamada DFS retornar. Estourar a pilha naturalmente diminui o tempo de conclusão. O gráfico pode ser desconectado, portanto, ambos os loops externos devem considerar todos os vértices, em vez de começar apenas no vértice zero.

Por que a reversão da ordem de término encontra SCCs?

Imagine compactar cada SCC em um único nó. O gráfico de condensação resultante não possui ciclo direcionado. No primeiro DFS, o componente com o último tempo de término relevante se comporta como uma fonte nesta estrutura condensada. Após a transposição do gráfico, esse componente se comporta como um coletor, portanto um DFS ali iniciado permanece dentro dele.

A remoção desse componente revela o mesmo argumento para o próximo componente não atribuído. Esta é a ideia de prova que os entrevistadores geralmente desejam: a ordem final seleciona os componentes com segurança e a transposição evita que a segunda passagem cruze o limite de saída errado. Você não precisa reproduzir uma longa prova formal, mas deve explicar ambas as funções.

Quais são as complexidades de tempo e espaço?

Cada passagem de pesquisa em profundidade visita cada vértice e examina cada aresta uma vez, e a construção da transposta também leva tempo linear. Portanto o tempo total é O(V + E). Com listas de adjacência para o gráfico e para a transposição, o armazenamento é O(V + E), mais O(V) para estado visitado, ordem de término e recursão ou uma pilha explícita.

FaseTempoFinalidade extra
Primeiro DFSO(V + E)Registrar ordem de término
TransporO(V + E)Direção reversa da borda
Segundo DFSO(V + E)Coletar componentes
TotalO(V + E)Linear na representação gráfica

Para gráficos muito profundos, o DFS recursivo pode exceder o limite da pilha de chamadas de uma linguagem. Mencionar uma pilha iterativa mostra consciência da produção sem alterar o limite assintótico.

Fluxo de trabalho de pesquisa em profundidade de duas passagens para o algoritmo de Kosaraju

Que pseudocódigo você deve saber para uma entrevista?

fim_pedido = []
visitado = set()

para vértice no gráfico:
    se o vértice não for visitado:
        dfs_finish(vértice, gráfico, visitado, ordem_final)

transpor=reverse_all_edges(gráfico)
visitado.clear()
componentes = []

para vértice em reverso (finish_order):
    se o vértice não for visitado:
        componente = []
        dfs_collect(vértice, transposição, visitado, componente)
        componentes.append(componente)

Em dfs_finish, anexe o vértice após visitar os vizinhos. Em dfs_collect, adicione o vértice quando ele for descoberto. Mantenha essas duas responsabilidades separadas; usar a pré-encomenda na primeira passagem é um erro comum.

Quais erros comumente interrompem uma implementação do Kosaraju?

Os erros mais comuns são registrar a ordem de descoberta em vez da ordem de término, esquecer de reverter a ordem da segunda passagem, reverter apenas algumas arestas, reutilizar o estado visitado sem limpá-lo e pular vértices isolados ou desconectados. Outro erro é tratar um gráfico não direcionado como se os SCCs fossem significativos da mesma maneira; componentes conectados são o conceito mais simples.

Teste um único vértice, um vértice isolado, um ciclo direcionado, uma cadeia unidirecional, dois ciclos unidos por uma aresta, auto-loops e um grafo desconectado. Verifique a partição em vez de confiar na ordem de saída dos componentes, porque diferentes ordens válidas de passagem do DFS podem listar componentes ou vértices de maneira diferente.

Como Kosaraju se compara ao algoritmo de Tarjan?

Ambos os algoritmos encontram SCCs em O(V + E). Kosaraju usa duas passagens DFS e geralmente armazena um gráfico transposto, o que pode simplificar o raciocínio e a implementação. Tarjan usa um DFS com índices de descoberta, valores de link baixo e uma pilha; evita uma transposição explícita, mas tem mais estado para manter corretamente.

Em uma entrevista, escolha o algoritmo que você pode explicar e implementar de forma confiável, a menos que haja restrições que o favoreçam. Se o entrevistador solicitar uma passagem ou nenhuma transposição, Tarjan pode ser mais adequado. Se a clareza e a prova direta são prioridades, Kosaraju costuma ser uma excelente escolha.

Como a IA pode apoiar a prática de algoritmos gráficos de forma responsável?

AI pode gerar pequenos contra-exemplos, rastrear o estado DFS, comparar implementações e desafiar uma explicação de complexidade. A assistência de codificação pode ajudar a localizar um bug de pedido ou de estado visitado, enquanto a revisão da transcrição pode mostrar se você explicou claramente a ideia da prova.

Sempre desenhe e trace pelo menos um gráfico, execute testes e verifique as afirmações geradas. Siga as regras de avaliação e não utilize assistência proibida. YesToTheOffer oferece suporte à preparação de codificação, raciocínio em tempo real permitido, notas privadas e revisão pós-entrevista.

Perguntas frequentes

FAQ

Para que é usado o algoritmo de Kosaraju?

O algoritmo de Kosaraju encontra componentes fortemente conectados em um gráfico direcionado. Os SCCs ajudam a simplificar as estruturas de acessibilidade e dependência porque cada componente pode ser contraído em um nó, produzindo um gráfico de condensação acíclico direcionado.

Por que o algoritmo de Kosaraju precisa de duas passagens DFS?

A primeira passagem calcula uma ordem de tempo de término que identifica qual componente é seguro para explorar em seguida. A segunda passagem é executada no gráfico transposto, onde as arestas invertidas evitam que a pesquisa escape para um componente diferente não atribuído.

Qual é a complexidade do algoritmo de Kosaraju?

A complexidade de tempo é O(V + E): duas passagens DFS e reversão de borda são lineares em um gráfico de lista de adjacências. As listas de adjacências armazenadas para os gráficos originais e transpostos usam espaço O(V + E), com estado de passagem O(V) adicional.

A ordem de saída dos componentes é importante?

Geralmente não. Ordenações de adjacência diferentes podem alterar a travessia do DFS e a ordem dos vértices ou componentes enquanto produzem a mesma partição válida. Os testes devem comparar a associação de componentes como conjuntos, a menos que um problema exija explicitamente uma ordem específica.

O algoritmo de Tarjan é melhor que o algoritmo de Kosaraju?

Nenhum dos dois é universalmente melhor. Ambos são executados em O (V + E). Tarjan usa um DFS e nenhuma transposição explícita, mas mantém o estado de link baixo; Kosaraju usa duas passagens conceitualmente simples e normalmente armazena o gráfico invertido. Escolha com base nas restrições e na confiabilidade da implementação.

Transforme a prática em um sistema repetível

Crie um plano de prática baseado em evidências, use suporte responsável quando permitido e revise a conversa enquanto ela estiver atualizada.

Transforme a prática em um sistema repetível

Prepare-se com suas próprias evidências e revise cada resposta com um contexto mais claro.

Experimente YesToTheOffer
Algoritmo de Kosaraju: Guia de entrevista SCC | yestotheoffer