Menu
Coddy logo textTech

Algoritmo de Kruskal

Última atualização

O algoritmo de Kruskal constrói uma árvore geradora mínima (MST): o conjunto de arestas mais barato que conecta todos os nós sem ciclos. Ele ordena todas as arestas por peso e depois adiciona gulosamente a próxima aresta mais barata desde que ela una dois nós que ainda não estejam conectados. Pressione reproduzir acima para ver a árvore crescer, uma aresta segura e barata de cada vez.

A verificação de "já conectados?" é feita com uma estrutura de dados union-find (conjuntos disjuntos): cada aresta é descartada se seus dois extremos já estiverem no mesmo componente, porque adicioná-la formaria um ciclo. A ordenação domina o custo, resultando em O(E log E) no total. Kruskal se destaca em grafos esparsos.

Complexidade de tempo e espaço

MedidaComplexidadeNotas
TempoO(E log E)Dominado pela ordenação das arestas
Operações union-find≈ O(E α(V))Quase constante por verificação com compressão de caminhos
EspaçoO(V + E)Lista de arestas + estrutura de conjuntos disjuntos
Melhor paraGrafos esparsosFunciona a partir de uma lista global de arestas

Passo a passo

PassoO que acontece
1Ordene cada aresta por peso, de forma crescente.
2Coloque cada nó em seu próprio componente (union-find).
3Pegue a próxima aresta mais barata.
4Se seus extremos estiverem em componentes diferentes, adicione-a à árvore e una-os.
5Caso contrário, descarte-a (criaria um ciclo).
6Pare quando a árvore tiver V − 1 arestas.

Exemplo resolvido

Grafo com nós A, B, C, D e arestas A-B(1), B-C(2), A-C(3), C-D(4), B-D(5). Arestas ordenadas: A-B(1), B-C(2), A-C(3), C-D(4), B-D(5):

Aresta (peso)Componentes antesAção
A-B(1){A} {B} {C} {D}Componentes diferentes - adicionar à MST, unir em {A,B}.
B-C(2){A,B} {C} {D}Componentes diferentes - adicionar à MST, unir em {A,B,C}.
A-C(3){A,B,C} {D}A e C já estão juntos - descartar (formaria um ciclo).
C-D(4){A,B,C} {D}Componentes diferentes - adicionar à MST, unir em {A,B,C,D}.
Parar{A,B,C,D}A árvore tem V - 1 = 3 arestas. MST = A-B, B-C, C-D, peso total 7.

Quando usar o algoritmo de Kruskal

Use quandoEvite quando
O grafo é esparso (poucas arestas em relação aos nós).O grafo é denso - Prim com um heap costuma ser mais rápido.
As arestas já estão disponíveis como uma lista global que você pode ordenar.As arestas só chegam por listas de adjacência que você precisa percorrer por nó.
Você quer uma implementação simples apoiada em union-find.Você precisa que a árvore cresça a partir de um nó inicial específico.
Você quer construir uma floresta geradora de um grafo desconexo.Você precisa lidar com arestas chegando em fluxo sem uma ordenação completa.

Código de Kruskal's Algorithm

Uma implementação limpa e executável de Kruskal's Algorithm em Python, JavaScript, Java, C++, C. Escolha uma linguagem, copie o código ou abra-o já carregado no Playground da Coddy.

Código de Kruskal's Algorithm em Python

Python
1def find(parent, x):2    while parent[x] != x:3        parent[x] = parent[parent[x]]  # path compression4        x = parent[x]5    return x6
7
8def kruskal(vertices, edges):9    # Take the cheapest edge that does not close a cycle10    parent = {v: v for v in vertices}11    mst, total = [], 012    for w, u, v in sorted(edges):13        root_u, root_v = find(parent, u), find(parent, v)14        if root_u != root_v:15            parent[root_u] = root_v16            mst.append((u, v, w))17            total += w18    return mst, total19
20
21vertices = ["A", "B", "C", "D", "E"]22edges = [23    (4, "A", "B"), (1, "A", "C"), (3, "B", "C"), (2, "B", "D"),24    (5, "C", "D"), (6, "C", "E"), (7, "D", "E"),25]26
27mst, total = kruskal(vertices, edges)28for u, v, w in mst:29    print(f"{u} - {v} (weight {w})")30print("Total MST weight:", total)
Execute este código no Playground de Python

Perguntas frequentes sobre o algoritmo de Kruskal

O que é uma árvore geradora mínima?
Uma árvore geradora mínima (MST) de um grafo ponderado conexo é um subconjunto de arestas que conecta todos os nós sem ciclos e com o menor peso total possível. Ela tem exatamente V - 1 arestas para V nós.
Qual é a diferença entre o algoritmo de Kruskal e o de Prim?
Ambos constroem uma árvore geradora mínima de forma gulosa. Kruskal ordena todas as arestas globalmente e adiciona a mais barata que não forme um ciclo, usando union-find. Prim faz uma única árvore crescer para fora a partir de um nó inicial, sempre adicionando a aresta mais barata que sai da árvore. Kruskal serve para grafos esparsos; Prim (com um heap) para os densos.
Por que o algoritmo de Kruskal usa union-find?
Antes de adicionar uma aresta, Kruskal precisa verificar se seus dois extremos já estão conectados - adicionar tal aresta criaria um ciclo. O union-find (conjuntos disjuntos) responde a "estão no mesmo componente?" e funde componentes em tempo amortizado quase constante, o que mantém o algoritmo eficiente.
Quando devo usar o algoritmo de Kruskal em vez do de Prim?
Prefira Kruskal quando o grafo é esparso e você já tem todas as arestas como uma lista que pode ordenar - a ordenação O(E log E) é barata quando E é pequeno. O algoritmo de Prim com um heap binário ou de Fibonacci tende a vencer em grafos densos onde E se aproxima de , porque evita ordenar todas as arestas de antemão.
O algoritmo de Kruskal funciona em grafos desconexos?
Sim. Se o grafo é desconexo, Kruskal simplesmente não consegue alcançar V - 1 arestas e, em vez disso, produz uma floresta geradora mínima - uma MST por componente conexo. Isso surge naturalmente porque o union-find nunca funde nós que não têm caminho entre si.
Qual é o erro mais comum ao implementar o algoritmo de Kruskal?
Omitir a compressão de caminhos e a união por rank do union-find, o que degrada cada verificação de conectividade de quase constante para quase linear e pode dominar o tempo de execução. Outro erro frequente é esquecer de realmente unir os dois componentes após adicionar uma aresta, o que permite que arestas posteriores criem ciclos.
Coddy programming languages illustration

Domine algoritmos com a Coddy

COMEÇAR