Menu
Coddy logo textTech

Algoritmo de Kruskal

Última actualización

El algoritmo de Kruskal construye un árbol de expansión mínima (MST): el conjunto de aristas más barato que conecta todos los nodos sin ciclos. Ordena todas las aristas por peso y luego añade con avidez la siguiente arista más barata siempre que una dos nodos que aún no estén conectados. Pulsa reproducir arriba para ver crecer el árbol, una arista segura y barata a la vez.

La comprobación de "¿ya conectados?" se hace con una estructura de datos union-find (conjuntos disjuntos): cada arista se descarta si sus dos extremos ya están en el mismo componente, porque añadirla formaría un ciclo. La ordenación domina el coste, dando O(E log E) en total. Kruskal destaca en grafos dispersos.

Complejidad temporal y espacial

MedidaComplejidadNotas
TiempoO(E log E)Dominado por la ordenación de las aristas
Operaciones union-find≈ O(E α(V))Casi constante por comprobación con compresión de caminos
EspacioO(V + E)Lista de aristas + estructura de conjuntos disjuntos
Mejor paraGrafos dispersosFunciona a partir de una lista global de aristas

Paso a paso

PasoQué ocurre
1Ordena cada arista por peso, de forma ascendente.
2Coloca cada nodo en su propio componente (union-find).
3Toma la siguiente arista más barata.
4Si sus extremos están en componentes distintos, añádela al árbol y únelos.
5En caso contrario, descártala (crearía un ciclo).
6Detente cuando el árbol tenga V − 1 aristas.

Ejemplo resuelto

Grafo con nodos A, B, C, D y aristas A-B(1), B-C(2), A-C(3), C-D(4), B-D(5). Aristas ordenadas: A-B(1), B-C(2), A-C(3), C-D(4), B-D(5):

Arista (peso)Componentes antesAcción
A-B(1){A} {B} {C} {D}Componentes distintos - añadir al MST, unir a {A,B}.
B-C(2){A,B} {C} {D}Componentes distintos - añadir al MST, unir a {A,B,C}.
A-C(3){A,B,C} {D}A y C ya están juntos - descartar (formaría un ciclo).
C-D(4){A,B,C} {D}Componentes distintos - añadir al MST, unir a {A,B,C,D}.
Fin{A,B,C,D}El árbol tiene V - 1 = 3 aristas. MST = A-B, B-C, C-D, peso total 7.

Cuándo usar el algoritmo de Kruskal

Úsalo cuandoEvítalo cuando
El grafo es disperso (pocas aristas respecto a los nodos).El grafo es denso - Prim con un montículo suele ser más rápido.
Las aristas ya están disponibles como una lista global que puedes ordenar.Las aristas solo llegan mediante listas de adyacencia que debes recorrer por nodo.
Quieres una implementación simple respaldada por union-find.Necesitas que el árbol crezca desde un nodo de inicio concreto.
Quieres construir un bosque de expansión de un grafo desconectado.Debes manejar aristas que llegan en flujo sin una ordenación completa.

Código de Kruskal's Algorithm

Una implementación limpia y ejecutable de Kruskal'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 Kruskal's Algorithm en 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)
Ejecuta este código en el Playground de Python

Preguntas frecuentes sobre el algoritmo de Kruskal

¿Qué es un árbol de expansión mínima?
Un árbol de expansión mínima (MST) de un grafo ponderado conexo es un subconjunto de aristas que conecta todos los nodos sin ciclos y con el menor peso total posible. Tiene exactamente V - 1 aristas para V nodos.
¿Cuál es la diferencia entre el algoritmo de Kruskal y el de Prim?
Ambos construyen un árbol de expansión mínima de forma voraz. Kruskal ordena todas las aristas globalmente y añade la más barata que no forme un ciclo, usando union-find. Prim hace crecer un único árbol hacia afuera desde un nodo inicial, añadiendo siempre la arista más barata que sale del árbol. Kruskal conviene a grafos dispersos; Prim (con un montículo) a los densos.
¿Por qué el algoritmo de Kruskal usa union-find?
Antes de añadir una arista, Kruskal debe comprobar si sus dos extremos ya están conectados - añadir tal arista crearía un ciclo. Union-find (conjuntos disjuntos) responde a "¿están en el mismo componente?" y fusiona componentes en tiempo amortizado casi constante, lo que mantiene el algoritmo eficiente.
¿Cuándo debería usar el algoritmo de Kruskal en lugar del de Prim?
Prefiere Kruskal cuando el grafo es disperso y ya tienes todas las aristas como una lista que puedes ordenar - la ordenación O(E log E) es barata cuando E es pequeño. El algoritmo de Prim con un montículo binario o de Fibonacci suele ganar en grafos densos donde E se acerca a , porque evita ordenar todas las aristas de antemano.
¿Funciona el algoritmo de Kruskal en grafos desconectados?
Sí. Si el grafo está desconectado, Kruskal simplemente no puede alcanzar V - 1 aristas y en su lugar produce un bosque de expansión mínima - un MST por cada componente conexo. Esto surge de forma natural porque union-find nunca fusiona nodos que no tienen camino entre sí.
¿Cuál es el error más común al implementar el algoritmo de Kruskal?
Omitir la compresión de caminos y la unión por rango del union-find, lo que degrada cada comprobación de conectividad de casi constante a casi lineal y puede dominar el tiempo de ejecución. Otro error frecuente es olvidar unir realmente los dos componentes tras añadir una arista, lo que permite que aristas posteriores creen ciclos.
Coddy programming languages illustration

Domina los algoritmos con Coddy

COMENZAR