El algoritmo de Prim es un algoritmo perteneciente a la teoría de los grafos para encontrar un árbol recubridor mínimo en un grafo conexo, no dirigido y cuyas aristas están etiquetadas.
En otras palabras, el algoritmo encuentra un subconjunto de aristas que forman un árbol con todos los vértices, donde el peso total de todas las aristas en el árbol es el mínimo posible.
Si el grafo no es conexo, entonces el algoritmo encontrará el árbol recubridor mínimo para uno de los componentes conexos que forman dicho grafo no conexo.
El algoritmo fue diseñado en 1930 por el matemático Vojtech Jarnik y luego de manera independiente por el científico computacional Robert C. Prim en 1957 y redescubierto por Dijkstra en 1959.
El algoritmo incrementa continuamente el tamaño de un árbol, comenzando por un vértice inicial al que se le van agregando sucesivamente vértices cuya distancia a los anteriores es mínima.
Esto significa que en cada paso, las aristas a considerar son aquellas que inciden en vértices que ya pertenecen al árbol.
Siempre se seleciona una arista luego el numero mas pequeño para pasar de una arista a otra.
El árbol recubridor mínimo está completamente construido cuando no quedan más vértices por agregar.
El algoritmo podría ser informalmente descrito siguiendo los siguientes pasos: Para hacerlo más en detalle, debe ser implementado el pseudocódigo siguiente.
Como se ha descrito arriba, el vértice inicial para el algoritmo será elegido arbitrariamente, porque la primera iteración del bucle principal del algoritmo tendrá un número de vértices en Q que tendrán todos el mismo tamaño, y el algoritmo empezará automáticamente un nuevo árbol en F cuando complete un árbol de expansión a partir de cada vértice conectado del grafo.
El algoritmo debe ser modificado para empezar con cualquier vértice particular s para configurar C[s] para que sea un número más pequeño que los otros valores de C (por norma, cero), y debe ser modificado para solo encontrar un único árbol de expansión y no un bosque entero de expansión, parando cuando encuentre otro vértice con "flag" que no tiene ningún lado asociado.
Hay diferentes variaciones del algoritmo que difieren unas de otras en cómo implementar Q: Como una única Lista enlazada o un vector de vértices, o como una estructura de datos organizada con una cola de prioridades, más compleja.
Esta elección lidera las diferencias en complejidad de tiempo del algoritmo.
En general, una cola de prioridades será más rápida encontrando el vértice v con el mínimo coste, pero ello conllevará actualizaciones más costosas cuando el valor de C[w] cambie.
//Se utiliza una clase Graph previamente implementada (no existe en Java) Sea
En toda iteración del algoritmo de Prim, se debe encontrar una arista que conecte un nodo del subgrafo a otro nodo fuera del subgrafo.
es conexo, siempre habrá un camino para todo nodo.
del algoritmo de Prim es un árbol porque las aristas y los nodos agregados a
la primera arista agregada durante la construcción de
el conjunto de nodos conectados por las aristas agregadas antes que
también se podría haber agregado y se hubiese agregado en vez de
si su peso fuera menor que el de
conexo tiene la misma cantidad de aristas que
y todas las aristas agregadas anteriormente durante la construcción de
Si se repiten los pasos mencionados anteriormente, eventualmente se obtendrá el árbol recubridor mínimo de
es el árbol recubridor mínimo de