El algoritmo de Prim es un algoritmo para encontrar un árbol recubridor mínimo en un grafo conexo y no dirigido. Un árbol recubridor mínimo conecta todos los vértices del grafo usando aristas cuyo peso total es el mínimo posible. El algoritmo de Prim encuentra este subconjunto de aristas de forma eficiente en O(n3) tiempo.
2. Algoritmo de Prim 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.
3. Arbol recubridor minimo un árbol recubridor mínimo de un grafo es un subgrafo que tiene que ser un árbol y contener todos los vértices del grafo inicial. Cada arista tiene asignado un peso proporcional entre ellos, que es un número representativo de algún objeto, distancia, etc.. , y se usa para asignar un peso total al árbol recubridor mínimo computando la suma de todos los pesos de las aristas del árbol en cuestión.
5. 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. La complejidad asintótica de este algoritmo es O(n3).
6. Código en JAVA publicclassAlgorithms{publicstaticGraphPrimsAlgorithm (Graph g, int s){int n = g.getNumberOfVertices ();Entry[] table = new Entry [n];for (int v = 0; v < n; ++v)table [v] = new Entry ();table [s].distance = 0;PriorityQueuequeue =new BinaryHeap (g.getNumberOfEdges());queue.enqueue (new Association (new Int (0), g.getVertex (s)));while (!queue.isEmpty ()){Associationassoc = (Association) queue.dequeueMin();Vertex v0 = (Vertex) assoc.getValue ();int n0 = v0.getNumber ();if (!table [n0].known)
7. {table [n0].known = true;Enumeration p = v0.getEmanatingEdges ();while (p.hasMoreElements ()){Edgeedge = (Edge) p.nextElement ();Vertex v1 = edge.getMate (v0);int n1 = v1.getNumber ();Intwt = (Int) edge.getWeight ();int d = wt.intValue ();if (!table[n1].known && table[n1].distance>d){ table [n1].distance = d;table [n1].predecessor = n0;queue.enqueue (new Association (new Int (d), v1));}}}}Graphresult = new GraphAsLists (n);for (int v = 0; v < n; ++v)result.addVertex (v);for (int v = 0; v < n; ++v)if (v != s)result.addEdge (v, table [v].predecessor);returnresult;}}