Kruskal’s algorithm construye un Minimum Spanning Tree (MST) ordenando todas las aristas por peso y añadiéndolas en orden creciente, siempre que no formen un ciclo. Es simple, elegante, y usa Union-Find para detectar ciclos en casi-constante tiempo.
A diferencia de Prim (que crece un árbol), Kruskal trata todas las aristas por igual: las más baratas ganan. Si una arista conecta dos componentes diferentes, es segura; si ya están conectados, la arista crearía un ciclo y se descarta.
Cómo Funciona
- Ordena todas las aristas por peso ascendente.
- Inicializa DSU con cada nodo como su propio componente.
- Escanea las aristas ordenadas:
- “Si
find(u) != find(v): añade la arista al MST, une los componentes.” - “Si
find(u) == find(v): descarta (ciclo).”
- “Si
- Detiene cuando el MST tiene
V-1aristas.
Idea Clave
Ordenar aristas es la clave: al considerar las más baratas primero, garantizas que cada arista añadida es la más barata posible para conectar sus dos componentes. Eso es exactamente la cut property, pero aplicada implícitamente por el orden global.
Union-Find con path compression y union by rank hace que find() y union() sean O(α(n)) (casi constante), por lo que el bottleneck es el sort: O(E log E).
Ejemplo Trabajado
Grafo con aristas:
A-B(2), A-D(4), B-C(3), B-D(1), C-D(5), D-E(2)
Ordenadas: (B-D,1), (D-E,2), (A-B,2), (B-C,3), (A-D,4), (C-D,5)
DSU inicial: {A},{B},{C},{D},{E}
- B-D(1):
find(B)≠find(D)→ MST +={B-D}. Union:{A},{B-D},{C},{E} - D-E(2):
find(D)≠find(E)→ MST +={D-E}. Union:{A},{B-D-E},{C} - A-B(2):
find(A)≠find(B)→ MST +={A-B}. Union:{A-B-D-E},{C} - B-C(3):
find(B)≠find(C)→ MST +={B-C}. Union:{A-B-C-D-E} - A-D(4):
find(A)==find(D)→ descartada (ciclo) - C-D(5):
find(C)==find(D)→ descartada (ciclo)
MST: {B-D, D-E, A-B, B-C} con peso total 1+2+2+3 = 8.
Casos Extremos y Trampas
- Grafo disperso —
O(E log E)domina; DSU es casi gratis. - Grafo denso —
E = V²,O(V² log V²) = O(V² log V). - Empates en peso — cualquier orden entre aristas iguales funciona; todas producen MST válidos.
- Grafo no conexo — Kruskal produce un Minimum Spanning Forest (un MST por componente).
Comparación con Prim
| Aspecto | Kruskal | Prim |
|---|---|---|
| Datos | Edge list | Adjacency list / matrix |
| Cycle detection | DSU | Implicit (tree property) |
| Denso | O(V² log V) | O(V²) mejor |
| Disperso | O(E log E) ≈ O(E log V) | O(E log V) |
| Natural para | Edge-centric, disperso | Vertex-centric, denso |
Aplicaciones
- Redes de computadoras — diseño de redes con costo mínimo
- Layout de circuitos — minimizar longitud total de cables
- Clusterización jerárquica — single-linkage clustering
- Enseñanza — introduce DSU y greedy en grafos
Trayectoria de Práctica
- Ejecuta Kruskal en el visualizador; registra el orden de aristas y las uniones DSU.
- Implementa DSU con path compression y union by rank; prueba en un grafo de 10 nodos.
- ¿Por qué Kruskal funciona en grafos no conexos? ¿Qué retorna?
- Compara con Prim en un grafo denso (V=50, E=1000).
- Investiga Borůvka: ¿cómo elimina el sort de aristas?