Pular para o conteúdo
Desenvolvimento & DevOps

Árvore geradora mínima: quando ordenar arestas vence crescer por vértice

Caco AltzhbergPorCaco Altzhberg Atualizado em 6 min de leitura
Algoritmo de Kruskal: Como Encontrar a Árvore Geradora Mínima?
Algoritmo de Kruskal: Como Encontrar a Árvore Geradora Mínima?
Compartilhe

Na hora de montar uma árvore geradora mínima, a dúvida prática quase nunca é o que cada método faz, e sim Kruskal ou Prim: qual usar naquele grafo específico. Os dois são gulosos, os dois chegam ao mesmo custo total e ambos são corretos. A escolha se decide pela estrutura do grafo e pelo formato em que os dados chegam até você.

A regra geral cabe em uma frase: grafos esparsos favorecem o método que ordena arestas; grafos densos favorecem o que cresce a partir de um vértice. Este texto detalha o porquê disso, mostra os casos em que a regra não vale e dá um critério de decisão que você pode aplicar antes de escrever a primeira linha. Se precisar revisar o funcionamento passo a passo de um deles, o guia completo sobre o método de ordenação de arestas cobre esse terreno.

A pergunta Kruskal ou Prim: qual usar começa pela densidade

Densidade é a relação entre o número de arestas e o número de vértices. Um grafo esparso tem poucas ligações por nó; um denso se aproxima de ter todos os pares conectados.

O método de Kruskal ordena todas as arestas uma vez e depois as percorre. Seu custo é dominado por essa ordenação, na casa de Complexidade O(ElogE). O de Prim cresce uma única componente a partir de um vértice inicial, escolhendo sempre a aresta mais barata que sai do conjunto já formado; com uma fila de prioridade eficiente, seu custo se aproxima de E + V log V.

Quando o número de arestas é próximo do de vértices, ordenar é barato e Kruskal leva vantagem. Quando o grafo é quase completo, a ordenação passa a dominar o tempo e Prim, apoiado em uma estrutura de heap, sai na frente.

Como os dados chegam até você importa mais do que parece

Esse é o critério que costuma decidir a questão na prática, e raramente aparece nas aulas.

Se o grafo já veio como uma lista de arestas em um arquivo, Kruskal é quase gratuito: o dado está no formato que ele consome. Se veio como matriz de adjacência ou como lista de vizinhos, Prim caminha naturalmente pela estrutura, enquanto Kruskal exigiria montar a lista de arestas antes de começar.

  • Lista de arestas em arquivo. Ordenar e varrer é direto; prefira o método de arestas.
  • Matriz de adjacência. A varredura por vértice é natural; prefira o método de crescimento.
  • Grafo gerado sob demanda. Quando as arestas são calculadas na hora, como distâncias entre pontos, Prim evita materializar todas elas na memória.
  • Grafo já parcialmente conectado. Se algumas ligações são obrigatórias, é mais simples inseri-las primeiro na estrutura de conjuntos disjuntos e deixar o método de arestas completar o resto.

Memória disponível

Kruskal precisa ter todas as arestas acessíveis para ordená-las. Em grafos muito densos, isso significa guardar uma quantidade de arestas proporcional ao quadrado do número de vértices. Prim com matriz não precisa dessa lista, e em cenários de memória apertada essa diferença pesa mais que qualquer ganho assintótico.

Tabela de decisão rápida

SituaçãoMétodo mais indicadoMotivo
Grafo esparsoOrdenação de arestasOrdenar poucas arestas é barato
Grafo densoCrescimento por vérticeEvita ordenar um número enorme de arestas
Entrada em lista de arestasOrdenação de arestasConsome o dado no formato original
Entrada em matrizCrescimento por vérticePercorre vizinhos diretamente
Grafo desconexoOrdenação de arestasProduz a floresta geradora sem ajuste
Memória restrita e grafo densoCrescimento por vérticeDispensa a lista completa de arestas

O caso do grafo desconexo

Aqui a diferença deixa de ser de desempenho e vira de comportamento. Se o grafo não é conexo, não existe árvore geradora única, e sim uma floresta com uma árvore por componente.

O método de arestas produz essa floresta naturalmente: ele simplesmente termina com mais de uma componente na estrutura de conjuntos disjuntos. O método de crescimento, partindo de um único vértice, encontra apenas a componente daquele vértice e precisa ser reiniciado manualmente para cada componente restante. Se você não sabe de antemão se o grafo é conexo, isso é um argumento forte a favor do primeiro.

Pesos repetidos e resultados diferentes

Quando várias arestas têm o mesmo peso, pode existir mais de uma árvore geradora mínima válida. Os dois métodos podem devolver árvores diferentes, ambas corretas, com o mesmo custo total. Isso costuma assustar quem compara a saída do próprio código com um gabarito. Se o requisito exige uma resposta determinística, defina um critério de desempate explícito, como a ordem dos índices dos vértices.

Detalhes de implementação que mudam o resultado prático

Escolher o método é metade do trabalho; a outra metade está na estrutura de apoio.

No método de arestas, o desempenho depende quase inteiramente da Estrutura Union-Find. Sem compressão de caminho e união por tamanho ou posto, a verificação de ciclo degrada e o ganho teórico desaparece. É o erro mais comum em implementações de estudante.

No método de crescimento, o ponto crítico é a fila de prioridade. Com busca linear pelo menor peso, o custo vira quadrático; com heap binário, cai para o patamar esperado. Em grafos densos, curiosamente, a versão quadrática pode ser competitiva, porque evita a sobrecarga de manter o heap.

Uma explicação didática da lógica geral está no material sobre o Algoritmo de Kruskal do Simplilearn, e a Diferença Kruskal vs Prim aparece em vários materiais comparativos, entre eles este comparativo detalhado. Para quem prefere acompanhar em vídeo, há boas Videoaulas sobre Kruskal disponíveis, e quem quer profundidade acadêmica pode consultar este Trabalho sobre Kruskal ou o trabalho acadêmico sobre Kruskal da mesma origem.

Perguntas frequentes

Os dois sempre dão o mesmo custo total?

Sim. Ambos são corretos e produzem uma árvore geradora de custo mínimo. O conjunto de arestas pode diferir quando há pesos empatados, mas a soma dos pesos é sempre a mesma.

Algum dos dois funciona com pesos negativos?

Funcionam. Diferente de algoritmos de caminho mínimo, a construção de árvore geradora mínima não se quebra com pesos negativos, porque a escolha gulosa depende apenas da ordem relativa dos pesos.

Qual é mais fácil de implementar do zero?

O de crescimento por vértice, se você aceitar a versão com busca linear, porque dispensa estrutura auxiliar. O de arestas fica mais simples quando você já tem uma implementação de conjuntos disjuntos pronta.

Existe uma terceira opção?

Sim, o algoritmo de Borůvka, que cresce várias componentes em paralelo. Ele é menos ensinado, mas se presta bem a execução paralela e aparece como base de abordagens mais modernas.

E se o grafo mudar com frequência?

Recalcular do zero a cada alteração é caro. Para grafos que recebem inserções e remoções constantes, o caminho é usar estruturas dinâmicas de árvore geradora, que atualizam apenas a parte afetada.

O que levar dessa leitura

Decidir entre Kruskal ou Prim: qual usar deixa de ser difícil quando você olha para dois números e um detalhe. Os números são a densidade do grafo e a memória disponível; o detalhe é o formato em que a entrada chega. Grafo esparso ou lista de arestas puxa para a ordenação; grafo denso, matriz ou memória curta puxa para o crescimento por vértice. E se houver chance de o grafo ser desconexo, o método de arestas resolve sem ajuste extra.

Mais em Desenvolvimento & DevOps

Compartilhe
Próxima leituraSubnet Calculator: Simplifique Redes em 20267 min de leitura

Mapa do site