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ção | Método mais indicado | Motivo |
|---|---|---|
| Grafo esparso | Ordenação de arestas | Ordenar poucas arestas é barato |
| Grafo denso | Crescimento por vértice | Evita ordenar um número enorme de arestas |
| Entrada em lista de arestas | Ordenação de arestas | Consome o dado no formato original |
| Entrada em matriz | Crescimento por vértice | Percorre vizinhos diretamente |
| Grafo desconexo | Ordenação de arestas | Produz a floresta geradora sem ajuste |
| Memória restrita e grafo denso | Crescimento por vértice | Dispensa 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.










