Menu
Coddy logo textTech

Algoritmo de Prim

Última actualización

El algoritmo de Prim construye un árbol de expansión mínima (MST) - el conjunto de aristas más barato que conecta todos los nodos sin ciclos - haciendo crecer un único árbol hacia afuera desde un nodo inicial. En cada paso observa todas las aristas que cruzan del árbol a un nodo fuera de él y añade la más barata. Pulsa reproducir arriba para ver cómo se expande el árbol, tomando siempre la arista de menor peso que alcanza un nuevo nodo.

Como siempre elige la arista de cruce mínima, cada adición es segura (garantizada como parte de algún MST). Con una cola de prioridad basada en un montículo binario indexada por la arista más barata hacia cada nodo exterior, Prim se ejecuta en O(E log V). Contrasta con Kruskal, que ordena todas las aristas globalmente en lugar de hacer crecer un único árbol conexo.

Complejidad temporal y espacial

ImplementaciónComplejidadNotas
Montículo binarioO(E log V)Cola de prioridad de aristas de cruce
Matriz de adyacenciaO(V²)Más simple; buena para grafos densos
EspacioO(V + E)Pertenencia al árbol + cola de prioridad
Mejor paraGrafos densosCrece desde un único nodo inicial

Paso a paso

PasoQué ocurre
1Inicia el árbol con cualquier nodo único.
2Observa todas las aristas que cruzan del árbol a un nodo fuera de él.
3Elige la arista de cruce con el menor peso.
4Añade esa arista y su nuevo nodo al árbol.
5Repite hasta que todos los nodos estén en el árbol.

Ejemplo resuelto

Construyendo el MST de un grafo de 4 nodos con aristas A-B=1, A-C=3, B-C=2, B-D=4, C-D=5, comenzando desde A:

PasoÁrbolAristas de cruceArista elegida
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}ninguna - todos los nodos en el árbollisto: peso del MST 1+2+4 = 7

Cuándo usar el algoritmo de Prim

Úsalo cuandoEvítalo cuando
Necesitas un árbol de expansión mínima de un grafo conexo, no dirigido y ponderado.El grafo es dirigido o necesitas caminos más cortos - usa Dijkstra o Bellman-Ford en su lugar.
El grafo es denso (E cercano a ); la forma matricial O(V²) es simple y rápida.El grafo es disperso y las aristas ya están ordenadas o son fáciles de ordenar - Kruskal suele ser más simple.
Quieres que el árbol crezca desde una región hacia afuera (p. ej., diseño incremental de una red).El grafo está desconectado - Prim solo abarca un componente; necesitas un bosque de expansión mínima.
Ya tienes una estructura de adyacencia y una cola de prioridad disponibles.Necesitas detectar ciclos en un conjunto global de aristas - union-find (Kruskal) encaja mejor con esa forma.

Código de Prim's Algorithm

Una implementación limpia y ejecutable de Prim's Algorithm en Python, JavaScript, Java, C++, C. Elige un lenguaje, copia el código o ábrelo ya cargado en el Playground de Coddy.

Código de Prim's Algorithm en 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)
Ejecuta este código en el Playground de Python

Preguntas frecuentes sobre el algoritmo de Prim

¿Cuál es la complejidad temporal del algoritmo de Prim?
Con una cola de prioridad basada en un montículo binario, Prim se ejecuta en O(E log V). Una versión más simple con matriz de adyacencia que busca la arista de cruce mínima en cada paso es O(V²), que puede ser más rápida en grafos densos. Ambas usan espacio O(V + E).
¿Cuál es la diferencia entre los algoritmos de Prim y Kruskal?
Ambos encuentran un árbol de expansión mínima de forma voraz. Prim hace crecer un único árbol conexo desde un nodo inicial, añadiendo repetidamente la arista más barata que sale del árbol (usando una cola de prioridad). Kruskal considera todas las aristas ordenadas por peso y añade la más barata que no forma un ciclo (usando union-find). Prim suele preferirse en grafos densos, Kruskal en dispersos.
¿El algoritmo de Prim siempre encuentra el MST óptimo?
Sí. En cada paso la arista más barata que cruza el árbol actual es segura de añadir - pertenece a algún árbol de expansión mínima (la propiedad del corte). Añadir repetidamente aristas seguras produce un verdadero árbol de expansión mínima, siempre que el grafo sea conexo.
¿Cuándo debería usar el algoritmo de Prim en lugar del de Kruskal?
Recurre a Prim cuando el grafo es denso, porque su forma matricial O(V²) evita ordenar las E aristas y hace crecer un único árbol desde un nodo inicial. Kruskal destaca en grafos dispersos donde ordenar la lista de aristas es barato y union-find mantiene rápidas las comprobaciones de ciclos. Ambos producen un MST correcto, así que la elección depende sobre todo de la densidad de aristas y de qué estructuras de datos ya tienes.
¿El nodo inicial afecta al MST resultante?
No - el peso total del MST es el mismo sin importar desde qué nodo empieces, porque el peso del árbol de expansión mínima de un grafo conexo es único. Las aristas concretas solo pueden diferir cuando varias aristas comparten el mismo peso y existen múltiples MST. De lo contrario, Prim alcanza exactamente el mismo árbol independientemente del nodo inicial.
¿Puede el algoritmo de Prim manejar grafos desconectados?
No directamente. Prim hace crecer un único árbol, así que solo abarca el componente conexo que contiene el nodo inicial y deja el resto sin tocar. Para cubrir cada componente ejecutarías Prim repetidamente desde un nodo no visitado, produciendo un bosque de expansión mínima en lugar de un solo árbol.
Coddy programming languages illustration

Domina los algoritmos con Coddy

COMENZAR