Aprendizaje Interactivo de Teoría de Grafos
Aprendizaje Interactivo de Teoría de Grafos
Guest User
Using app without sign in
Calculadora de árbol de expansión mínima
Hace crecer un árbol de expansión mínimo desde un vértice inicial
Selecciona un algoritmo y genera pasos para comenzar la visualización
El algoritmo de Prim construye un árbol de expansión mínima (MST) de un grafo ponderado no dirigido, el subconjunto de aristas que conecta cada vértice con el menor peso total posible. Hace crecer un único árbol desde un vértice inicial arbitrario, añadiendo siempre la arista más barata que alcanza un vértice nuevo.
El algoritmo mantiene una cola de prioridad de las aristas que cruzan del árbol al resto del grafo. En cada paso extrae la arista de cruce de menor peso, añade su nuevo extremo al árbol e inserta las aristas de ese vértice en la cola. La propiedad de corte de los MST garantiza que cada arista elegida pertenece a algún árbol de expansión mínima. Con un montículo binario el tiempo es O(E log V).
El algoritmo de Prim diseña redes de bajo coste: redes eléctricas, tendidos de fibra y telecomunicaciones, tuberías de agua y cableado de chips. También sirve para agrupamiento y segmentación de imágenes. Las entrevistas suelen emparejarlo con el algoritmo de Kruskal para evaluar la comprensión de los argumentos de corrección voraz.
Prim hace crecer un único árbol desde un inicio arbitrario. En cada paso toma la arista más barata con exactamente un extremo ya dentro del árbol.
Prim(grafo, inicio):
enArbol = {inicio}
cp = cola de prioridad con las aristas que salen de inicio
mst = []
mientras enArbol no contenga todos los vértices:
(u, v, w) = cp.extraerMínimo()
si v en enArbol: continuar // obsoleta
mst.añadir((u, v, w))
enArbol.añadir(v)
para cada arista (v, x, w2):
si x no en enArbol: cp.insertar((v, x, w2))La corrección descansa en la propiedad del corte: para cualquier partición de los vértices en dos lados, la arista más barata que cruza ese corte pertenece a algún árbol de expansión mínimo. Prim la aplica con el corte "ya en el árbol" frente a "todavía no", y por eso tomar la arista más barata que cruza siempre es seguro y nunca hace falta retroceder.
Haz crecer un árbol de expansión mínimo desde A en un pequeño grafo con pesos donde la elección voraz rechaza deliberadamente una arista directa aparentemente más barata.
Grafo de ejemplo: Aristas no dirigidas A-B (2), A-C (3), B-C (1), C-D (4) y B-D (7).
El árbol de expansión mínimo es A-B, B-C y C-D con peso total 2 + 1 + 4 = 7. Fíjate en que tiene exactamente tres aristas, una menos que los cuatro vértices, como debe ocurrir en todo árbol de expansión. Fíjate también en que aquí el árbol es un camino, lo que recuerda que un árbol de expansión mínimo no es un árbol de caminos mínimos: los dos problemas optimizan cosas distintas.
Tiempo: O(E log V) · Espacio: O(V + E)
Con un montículo binario, cada arista puede insertarse una vez y extraerse una vez a O(log E), y como E es a lo sumo V al cuadrado, log E queda dentro de un factor constante de log V, lo que da O(E log V). Cada vértice se añade al árbol exactamente una vez. Un montículo de Fibonacci con reducción de clave en lugar de inserción perezosa mejora la cota a O(E + V log V), asintóticamente mejor en grafos densos aunque rara vez compense por las constantes. En un grafo muy denso gana la opción más simple: mantener un vector con la arista más barata hacia cada vértice exterior y recorrerlo cada ronda, con O(V al cuadrado), que supera a O(E log V) en cuanto E se acerca a V al cuadrado.
Prim y Kruskal producen ambos un árbol de expansión mínimo. El adecuado depende de la densidad y de cómo llegan las aristas.
| Alternativa | Prefiérela cuando | Coste |
|---|---|---|
| Algoritmo de Kruskal | Grafos dispersos, o aristas ya ordenadas por peso. Hace crecer un bosque en lugar de un solo árbol, usando Union-Find. | O(E log E) |
| Algoritmo de Boruvka | Quieres paralelismo. Cada componente elige a la vez su arista saliente más barata. | O(E log V) |
| Prim con recorrido de vector | Grafos densos donde E se acerca a V al cuadrado. Evita por completo el coste del montículo. | O(V^2) |
| Algoritmo de Dijkstra | En realidad quieres caminos mínimos desde un origen, no una estructura de expansión de peso mínimo. Forma parecida, objetivo distinto. | O((V + E) log V) |
Leer el artículo completo: Minimum Spanning Trees: Prim, Kruskal and Boruvka
Algoritmos relacionados: Algoritmo de Kruskal, Algoritmo de Boruvka, Algoritmo de Dijkstra