Menu
Coddy logo textTech

Algoritmo de Prim

Última atualização

O algoritmo de Prim constrói uma árvore geradora mínima (MST) - o conjunto de arestas mais barato que conecta todos os nós sem ciclos - fazendo crescer uma única árvore para fora a partir de um nó inicial. A cada passo ele observa todas as arestas que cruzam da árvore para um nó fora dela e adiciona a mais barata. Pressione reproduzir acima para ver a árvore se expandir, sempre pegando a aresta de menor peso que alcança um novo nó.

Como sempre escolhe a aresta de cruzamento mínima, cada adição é segura (garantida como parte de alguma MST). Com uma fila de prioridade baseada em heap binário indexada pela aresta mais barata até cada nó externo, Prim é executado em O(E log V). Contrasta com Kruskal, que ordena todas as arestas globalmente em vez de fazer crescer uma única árvore conexa.

Complexidade de tempo e espaço

ImplementaçãoComplexidadeNotas
Heap binárioO(E log V)Fila de prioridade de arestas de cruzamento
Matriz de adjacênciaO(V²)Mais simples; boa para grafos densos
EspaçoO(V + E)Pertencimento à árvore + fila de prioridade
Melhor paraGrafos densosCresce a partir de um único nó inicial

Passo a passo

PassoO que acontece
1Inicie a árvore com qualquer nó único.
2Observe todas as arestas que cruzam da árvore para um nó fora dela.
3Escolha a aresta de cruzamento com o menor peso.
4Adicione essa aresta e seu novo nó à árvore.
5Repita até que todos os nós estejam na árvore.

Exemplo resolvido

Construindo a MST de um grafo de 4 nós com arestas A-B=1, A-C=3, B-C=2, B-D=4, C-D=5, começando de A:

PassoÁrvoreArestas de cruzamentoAresta escolhida
1{A}A-B=1, A-C=3A-B (peso 1)
2{A, B}A-C=3, B-C=2, B-D=4B-C (peso 2)
3{A, B, C}B-D=4, C-D=5B-D (peso 4)
4{A, B, C, D}nenhuma - todos os nós na árvoreconcluído: peso da MST 1+2+4 = 7

Quando usar o algoritmo de Prim

Use quandoEvite quando
Você precisa de uma árvore geradora mínima de um grafo conexo, não direcionado e ponderado.O grafo é direcionado ou você precisa de caminhos mais curtos - use Dijkstra ou Bellman-Ford.
O grafo é denso (E próximo de ); a forma matricial O(V²) é simples e rápida.O grafo é esparso e as arestas já estão ordenadas ou são fáceis de ordenar - Kruskal costuma ser mais simples.
Você quer que a árvore cresça de uma região para fora (por exemplo, layout incremental de rede).O grafo está desconectado - Prim abrange apenas um componente; você precisa de uma floresta geradora mínima.
Você já tem uma estrutura de adjacência e uma fila de prioridade disponíveis.Você precisa detectar ciclos em um conjunto global de arestas - union-find (Kruskal) se encaixa melhor.

Código de Prim's Algorithm

Uma implementação limpa e executável de Prim'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 Prim's Algorithm em Python

Python
1import heapq2
3
4def prim(graph, start):5    visited = {start}6    heap = [(w, start, v) for v, w in graph[start]]7    heapq.heapify(heap)8    mst, total = [], 09    while heap and len(visited) < len(graph):10        w, u, v = heapq.heappop(heap)11        if v in visited:12            continue13        visited.add(v)14        mst.append((u, v, w))15        total += w16        # Offer the new node's edges to the frontier17        for neighbor, weight in graph[v]:18            if neighbor not in visited:19                heapq.heappush(heap, (weight, v, neighbor))20    return mst, total21
22
23graph = {24    "A": [("B", 4), ("C", 1)],25    "B": [("A", 4), ("C", 3), ("D", 2)],26    "C": [("A", 1), ("B", 3), ("D", 5)],27    "D": [("B", 2), ("C", 5), ("E", 7)],28    "E": [("D", 7)],29}30
31mst, total = prim(graph, "A")32for u, v, w in mst:33    print(f"{u} - {v} (weight {w})")34print("Total MST weight:", total)
Execute este código no Playground de Python

Perguntas frequentes sobre o algoritmo de Prim

Qual é a complexidade de tempo do algoritmo de Prim?
Com uma fila de prioridade baseada em heap binário, Prim é executado em O(E log V). Uma versão mais simples com matriz de adjacência que busca a aresta de cruzamento mínima a cada passo é O(V²), que pode ser mais rápida em grafos densos. Ambas usam espaço O(V + E).
Qual é a diferença entre os algoritmos de Prim e Kruskal?
Ambos encontram uma árvore geradora mínima de forma gulosa. Prim faz crescer uma única árvore conexa a partir de um nó inicial, adicionando repetidamente a aresta mais barata que sai da árvore (usando uma fila de prioridade). Kruskal considera todas as arestas ordenadas por peso e adiciona a mais barata que não forma ciclo (usando union-find). Prim costuma ser preferido em grafos densos, Kruskal em esparsos.
O algoritmo de Prim sempre encontra a MST ótima?
Sim. A cada passo, a aresta mais barata que cruza a árvore atual é segura para adicionar - ela pertence a alguma árvore geradora mínima (a propriedade do corte). Adicionar repetidamente arestas seguras produz uma verdadeira árvore geradora mínima, desde que o grafo seja conexo.
Quando devo usar o algoritmo de Prim em vez do de Kruskal?
Recorra ao Prim quando o grafo é denso, porque sua forma matricial O(V²) evita ordenar todas as E arestas e faz crescer uma única árvore a partir de um nó inicial. Kruskal se destaca em grafos esparsos onde ordenar a lista de arestas é barato e union-find mantém as verificações de ciclo rápidas. Ambos produzem uma MST correta, então a escolha depende principalmente da densidade de arestas e de quais estruturas de dados você já tem.
O nó inicial afeta a MST resultante?
Não - o peso total da MST é o mesmo independentemente de qual nó você começa, porque o peso da árvore geradora mínima de um grafo conexo é único. As arestas específicas só podem diferir quando várias arestas compartilham o mesmo peso e existem múltiplas MSTs. Caso contrário, Prim alcança exatamente a mesma árvore independentemente do nó inicial.
O algoritmo de Prim consegue lidar com grafos desconectados?
Não diretamente. Prim faz crescer uma única árvore, então abrange apenas o componente conexo que contém o nó inicial e deixa o resto intocado. Para cobrir cada componente, você executaria Prim repetidamente a partir de um nó não visitado, produzindo uma floresta geradora mínima em vez de uma única árvore.
Coddy programming languages illustration

Domine algoritmos com a Coddy

COMEÇAR