Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Índice
[ocultar]
1Descripción conceptual
2Pseudocódigo del algoritmo
3Código en Haskell (Lenguaje funcional)
4Código en JAVA (Lista de Adyacencia)
5Código en C++
6Código en JAVA
7Otra versión sin usar Colas
8Demostración
9Ejemplo de ejecución del algoritmo
10Referencias
11Enlaces externos
Descripción conceptual[editar]
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.
El árbol recubridor mínimo está completamente construido cuando no quedan más vértices
por agregar.
Prim (Grafo G)
/* Inicializamos todos los nodos del grafo.
La distancia la ponemos a infinito y el padre de cada nodo a
NULL
Encolamos, en una cola de prioridad
donde la prioridad es la distancia,
todas las parejas <nodo,distancia> del grafo*/
por cada u en V[G] hacer
distancia[u] = INFINITO
padre[u] = NULL
Añadir(cola,<u,distancia[u]>)
distancia[u]=0
mientras !esta_vacia(cola) hacer
// OJO: Se entiende por mayor prioridad aquel nodo cuya
distancia[u] es menor.
u = extraer_minimo(cola) //devuelve el minimo y lo elimina
de la cola.
por cada v adyacente a 'u' hacer
si ((v ∈ cola) && (distancia[v] > peso(u, v)) entonces
padre[v] = u
distancia[v] = peso(u, v)
Actualizar(cola,<v,distancia[v]>)
Código en C++[editar]
Grafo::Grafo()
{
Grafo::Grafo(int nodos)
{
this->cn = nodos;
this->ady = vector< vector<int> > (cn);
int padre = 0;
int hijo = 0;
while(markedLines.size() + 1 < cn){
padre = hijo;
// Marco la fila y elimino la columna del nodo padre.
markedLines.push_back(padre);
for(int i = 0; i < cn; i++)
adyacencia[i][padre] = INF;
arbol[padre][hijo] = min;
arbol[hijo][padre] = min;
}
return arbol;
}
PriorityQueue queue =
new BinaryHeap (g.getNumberOfEdges());
queue.enqueue (
new Association (new Int (0), g.getVertex (s)));
Demostración[editar]
Sea un grafo conexo y ponderado.
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.
Ya que es conexo, siempre habrá un camino para todo nodo.
La salida del algoritmo de Prim es un árbol porque las aristas y los nodos agregados
a están conectados.
Sea el árbol recubridor mínimo de .
Si es el árbol recubridor mínimo.
Si no, sea la primera arista agregada durante la construcción de , que no está en y sea el
conjunto de nodos conectados por las aristas agregadas antes que . Entonces un extremo
de está en y el otro no. Ya que es el árbol recubridor mínimo de hay un camino en que
une los dos extremos. Mientras que uno se mueve por el camino, se debe encontrar una
arista uniendo un nodo en a uno que no está en . En la iteración que se agrega
a , también se podría haber agregado y se hubiese agregado en vez de si su peso fuera
menor que el de . Ya que no se agregó se concluye:
Sea el grafo obtenido al remover y agregando . Es fácil mostrar que conexo tiene la
misma cantidad de aristas que , y el peso total de sus aristas no es mayor que el de ,
entonces también es un árbol recubridor mínimo de y contiene a 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 que es igual a .
Esto demuestra que es el árbol recubridor mínimo de .
El algoritmo continua. El
vértice B, que está a una
distancia de 7 de A, es el
siguiente marcado. En este punto C, E, A, D,
null
la arista DB es marcada en rojo G F, B
porque sus dos extremos ya
están en el árbol y por lo tanto
no podrá ser utilizado.
Sólo quedan
disponibles C y G. C está a 5 de
distancia de E, y G a 9 de A, D,
distancia de E. Se elige C, y se null G F, B,
marca con el arco EC. El E, C
arco BC también se marca con
rojo.
G es el único vértice pendiente,
y está más cerca de E que de F,
A, D,
así que se agrega EG al árbol.
F, B,
Todos los vértices están ya null null
E, C,
marcados, el árbol de expansión
G
mínimo se muestra en verde. En
este caso con un peso de 39.
PRESENTACION
La utilidad académica de una monografía nunca está de más, el uso de esta es una gran ayuda para
estudiantes en este caso universitarios es por eso que con esta recopilación de fuentes científicas
impresas mas las conclusiones llegadas al tomar opinión de varios profesionales del área hacen de
esta monografía consistente en "el algoritmo de Prim" una fuente de información más para fines
académicos.
En estos tiempos el estudiantado opta por recurrir a fuentes sin sustento científico como el internet o
simplemente dar por hecho algún comentario sin sustentación, ya sea con fines de curiosidad o
estudiantes trabajando en algún proyecto. El uso de los libros se está perdiendo y con ello los libros
mismos.
En esta monografía tocaremos el tema principal que es "El Algoritmo de Prim", dando a conocer y a
repasar algunos puntos importantes en el área, como son los grafos, los arboles, y los diferentes tipos de
términos que se usan en la teoría de grafos, también veremos cómo influye tal algoritmo en la vida
cotidiana y cuan útil nos es…
INTRODUCCION
El hombre siempre ha tenido la necesidad de recorrer muchos lugares, utilizando caminos estratégicos y
cortos buscando hallar la ruta optima con el mayor ahorro de tiempo, energía, distancia, etc. recorriendo
todos los puntos designados.
En la actualidad podemos apreciar muchas cosas que nos pueden parecer de lo más habitual, caminos,
líneas de comunicación telefónica, televisión por cable, el transporte ferroviario, líneas
aéreas, circuitos eléctricos de nuestras casas, automóviles, etc. ; lo que no pensamos frecuentemente es
que estos forman parte de algo que en matemáticas se denomina como grafos.
En esta monografía se explicara el Algoritmo de Prim, buscando aplicarlo en problemas reales y
cotidianos, utilizando en general la Teoría de Grafos.
RESUMEN
Un grafo o grafica es un conjunto finito de nodos o vértices conectados a través de aristas, los cuales
pueden ser conexos, es decir existe algún enlace con cada nodo a través de algún camino formando así
un grafo entero; O los grafos no conexos, que tienen la particularidad de que un segmento de grafo no
este enlazado a través de algún vértice al grafo principal. En la teoría de grafos existen grafos dirigidos y
grafos no dirigidos , lo grafos dirigidos son aquellos donde sus aristas tienen un sentido , quiere decir que
tienen un principio especifico en algún nodo y un destino en algún otro a diferencia de los no dirigidos que
son solo grafos simples (puede tomar ambas direcciones).
Arboles, un árbol es un grafo que no contiene ciclos y que conecta todos los nodos utilizando el menor
número de aristas posibles.
Árbol recubridor mínimo, dentro de un grafo se tiene que cubrir todos los nodos formando un árbol (sub
grafo) y utilizando el menor coste posible (menor costo, tiempo, distancia, precio, etc.)
El algoritmo de Prim es un algoritmo de la teoría de grafos que encuentra un árbol de expansión mínima
para un grafo ponderado conexo. Esto significa que se encuentra un subconjunto de las aristas que forma
un árbol que incluye todos los nodos, donde el total peso de todas las aristas en el árbol se reduce al
mínimo. Si el gráfico no está conectado, entonces sólo se encuentra un mínimo árbol de expansión para
uno de los componentes conectados
ABSTRACT A graph or chart is a finite set of nodes or vertices connected by edges, which can be related,
ie there is a link to each node through some path thus forming a whole graph, or graphs are not related to
are unique in that a segment of the graph is not bound by a vertex to the main graph. In graph theory there
are directed graphs and undirected graphs, the directed graphs are where its edges have a sense, means
they have a specific principle in a node and a destination unlike any other non-target are only simple
graphs (can take both directions.) Trees, a tree is a graph that contains no cycles and connecting all the
nodes using the fewest possible edges.
Minimum spanning tree within a graph has to cover all the nodes forming a tree (sub graph) and using the
lowest possible cost (less cost, time, distance, price, etc) Prim's algorithm is an algorithm of graph theory
that finds a minimum spanning tree related to a weighted graph. This means that there is a subset of
edges forms a tree with all nodes, where the total weight of all edges in the tree is minimized. If the graph
is not connected, then it is only a minimum spanning tree for a connected component
PROLOGO
Mediante esta monografía tenemos como objetivo principal que los lectores cuenten en forma integra con
los alcances más relevantes del Algoritmo de Prim considerando la teoría de grafos teniendo en cuenta
que el estudio de los diferentes tipos de algoritmos cada vez tiene más importancia en la medida que
avanza la era de las computadoras, caminos, líneas de comunicación telefónica, televisión por cable,
el transporte ferroviario, líneas aéreas, circuitos eléctricos de nuestras casas, automóviles Y que se puede
resolver diferentes tipos de problemas utilizando dicho algoritmo. Teniendo la ventaja de ahorrar tiempo
y costos al resolver un problema determinado.
El trabajo, ha sido elaborado siguiendo una metodología dinámica, propia del grupo, lo cual garantiza a
nuestros lectores un ágil manejo y acceso a la información que desee consultar.
CAPITULO I
CONCEPTOS PREVIOS
Grafos.
ELIAS MICHA (2003)[1], En su libro Matemáticas Discretas este autor:
"Un grafo es un conjunto no vacio de objetos llamados vértices y de un conjunto de parejas no ordenadas
de vértices llamadas Aristas."
SEYMOUR LIPSCHUTZ – MARC LIPSON (2007)[2], En su libro Matemáticas Discretas Indica:
"Un grafo tiene un numero finito de vértices y de aristas."
BERNARD KOLMAN – ROBERT C. BUSBY – SHARON ROSS (1995)[3], En su
libro Estructuras Matemáticas Discretas nos dice:
"Un grafo G consta de un conjunto V de objetos llamados vértices, un conjunto finito E de objetos
llamados aristas y una función "y" que asigna a cada arista un subconjunto {v, w}, donde "v, w" son
vértices (que podrían ser iguales)."
Conectividad
ELIAS MICHA (2003), ""Un Grafo es conexo si consiste de una sola pieza. Es decir que los vértices están
unidos a través de aristas."
SEYMOUR LIPSCHUTZ – MARC LIPSON (2007), "Un Grafo de conectividad consta de una secuencia
alternada de vértices y aristas de la forma donde cada arista contiene a los vértices."
Por lo tanto concluimos que la conectividad de un grafo es el enlace que puede tener 2 nodos a travez
de uno o más aristas.
Grafos Dirigidos y no dirigidos.
Arboles.
Es un grafo que no tiene ciclos y que conecta a todos los puntos,. En un grafo con n vértices,
los árboles tienen exactamente n - 1 aristas, y hay nn-2 árboles posibles. Su importancia radica en que los
árboles son grafos que conectan todos los vértices utilizando el menor número posible de aristas.
Árbol Recubridor Mínimo.
BERNARD KOLMAN – ROBERT C. BUSBY – SHARON ROSS (1995)[6], En su libro Estructuras
Matemáticas Discretas para la computación señala:
"Dado un grafo conexo, un árbol recubridor mínimo de ese 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. Un árbol recubridor mínimo o un árbol expandido mínimo es un árbol recubridor que pesa
menos o igual que otros árboles recubridores. Todo grafo tiene un bosque recubridor mínimo."
CONCLUSION
Grafo. Es el conjunto de vértices y aristas, los cuales, se representa gráficamente como un conjunto de
puntos llamados nodos y las aristas se representan por líneas o puentes que unen dichos nodos
La teoría de grafos sirve como un modelo matemático para estructuras en cualquier campo , pero una de
las mas importante en las aéreas de ciencias de la computación .
Árbol. Un árbol se define como un tipo de grafo que no contiene ciclos, es decir es un grafo acíclico y a su
vez es conexo. Quiere deciry que conecta a todos los puntos,. En un grafo con n vértices, los árboles
tienen exactamente n - 1 aristas, y hay nn-2 árboles posibles. Su importancia radica en que los árboles
son grafos que conectan todos los vértices utilizando el menor número posible de aristas.
CAPITULO II
ALGORITMO DE PRIM
ROSA GUEREQUETA GARCIA – ANTONIO VALLECILLO MORENO (2004)[7], En su libro Técnicas de
Desarrollos de Algoritmos nos dice:
"El algoritmo de Prim es tal vez el algoritmo de MST (Arboles Generadores Mínimos) más sencillo de
implementar y el mejor método para grafos densos. Este algoritmo puede encontrar el MST de cualquier
grafo conexo pesado.
Sea V el conjunto de nodos de un grafo pesado no dirigido. El algoritmo de Prim comienza cuando se
asigna a un conjunto U de nodos un nodo inicial Perteneciente a V, en el cual "crece" un árbol de
expansión, arista por arista. En cada paso se localiza la arista más corta (u, v) que conecta a U con V-U, y
después se agrega v, el vértice en V-U, a U. Este paso se repite hasta que V=U. El algoritmo de Prim es
de O(N2), donde | V | = N.
El siguiente ejemplo ilustra el funcionamiento del algoritmo.
La secuencia de ilustraciones va de izquierda a derecha y de arriba hacia abajo. La
primera imagen muestra el grafo pesado y las siguientes muestran el funcionamiento del algoritmo de
Prim y como va cambiando el conjunto U durante la ejecución.
Figura 1
En la figura 5 Aplicamos el Algoritmo de Prim en el grafo para hallar el árbol recubrir mínimo o en otras
palabras la ruta optima para ahorra la distancia del cableado.
Figura 5
BIBLIOGRAFÍA
Alfredo Caicedo Barrero, Graciela Wagner De García, Rosa María Méndez Parra (2010)
Introducción a la Teoría de Grafos (2da ED)
Bernard Kolman – Robert c. Busby – Sharon Rross (1997) Estructura
Matematicas Discretas (2da ED). Francia.
ELIAS MICHA (2003).Matematicas Discretas (2ta ED). Mexico.
Jirí Matoušek,Jaroslav Nešetril(1998) Invitation to Discrete Mathematics (1ra ED) EE:UU.
Rosa Guerequeta Garcia – Antonio Vallecillo Moreno (2004) Tecnicas de Desarrollos de
Algoritmos (1ra ED)
Robert Sedgewick (1992) Algoritmos en C++ (1ra ED) EE.UU
Seymour Lipschutz – Marc Lipson (2007). Matematicas Discretas (3ra Ed)
Autor:
Alexander Flores Mamani
[1] ELIAS MICHA (2003).Matematicas Discretas (2ta ED). Mexico. PAG. 22, 19
[2] Seymour Lipschutz – Marc Lipson (2007). Matematicas Discretas (3ra Ed) PAG 158, 159
[3] Bernard Kolman – Robert c. Busby – Sharon Rross (1997) Estructura Matematicas Discretas (2da ED).
Francia. PAG. 198
[4] Jirí Matoušek,Jaroslav Nešetril(1998) Invitation to Discrete Mathematics (1ra ED) EE:UU. PAG. 124,
[5] Robert Sedgewick (1992) Algoritmos en C++ (1ra ED) EE.UU PAG 277
[6] Bernard Kolman – Robert C. Busby – Sharon Ross (1995) Estructuras de Matemáticas Discretas para
la Computación (3ra ED) Pag 321
[7] Rosa Guerequeta García – Antonio Vallecillo Moreno (2004) Técnicas de Desarrollos de Algoritmos
(1ra ED) Cap 4 Pag 10
[8] Alfredo Caicedo Barrero, Graciela Wagner De García, Rosa María Méndez Parra (2010) Introducción a
la Teoría de Grafos (2da ED) Pág. 109
Leer más: http://www.monografias.com/trabajos87/monografia-algoritmo-prim/monografia-algoritmo-
prim.shtml#ixzz4Z2ZppfNG
Algoritmo de Kruskal
El algoritmo de Kruskal es un algoritmo de la teoría de grafos para encontrar un árbol
recubridor mínimo en un grafo conexo y ponderado. Es decir, busca un subconjunto de
aristas que, formando un árbol, incluyen todos los vértices y donde el valor total de todas
las aristas del árbol es el mínimo. Si el grafo no es conexo, entonces busca un bosque
expandido mínimo (un árbol expandido mínimo para cada componente conexa). El
algoritmo de Kruskal es un ejemplo de algoritmo voraz.
Un ejemplo de árbol expandido mínimo. Cada punto representa un vértice, el cual puede ser un
árbol por sí mismo. Se usa el Algoritmo para buscar las distancias más cortas (árbol expandido) que
conectan todos los puntos o vértices.
Índice
[ocultar]
1Pseudocódigo
2Código en C++
3Complejidad del algoritmo
4Demostración de la correctitud
5Ejemplo
6Referencias
7Enlaces externos
Pseudocódigo[editar]
función Kruskal(G)
Para cada v en V[G] hacer
Nuevo conjunto C(v) ← {v}.
Nuevo heap Q que contiene todas las aristas de G, ordenando por su
peso.
Defino un arbol T ← Ø
// n es el número total de vértices
Mientras T tenga menos de n-1 aristas y !Q.vacío() hacer
(u,v) ← Q.sacarMin()
// previene ciclos en T. agrega (u,v) si u y v están diferentes
componentes en el conjunto.
// Nótese que C(u) devuelve la componente a la que pertenece u.
Si C(v) ≠ C(u) hacer
Agregar arista (v,u) a T.
Merge C(v) y C(u) en el conjunto
Responder arbol T
Código en C++[editar]
// Declaraciones en el archivo .h
int cn; //cantidad de nodos
vector< vector<int> > ady; //matriz de adyacencia
int nodoA;
int nodoB;
int arcos = 1;
while(arcos < cn){
// Encontrar el arco mínimo que no forma ciclo y guardar los
nodos y la distancia.
int min = INF;
for(int i = 0; i < cn; i++)
for(int j = 0; j < cn; j++)
if(min > adyacencia[i][j] && adyacencia[i][j]!=0 &&
pertenece[i] != pertenece[j]){
min = adyacencia[i][j];
nodoA = i;
nodoB = j;
}
// Si los nodos no pertenecen al mismo árbol agrego el arco al
árbol mínimo.
if(pertenece[nodoA] != pertenece[nodoB]){
arbol[nodoA][nodoB] = min;
arbol[nodoB][nodoA] = min;
arcos++;
}
}
return arbol;
}
Demostración de la correctitud[editar]
Sea P un grafo conexo y valuado y sea Y el subgrafo de P producido por el algoritmo. Y no
puede tener ciclos porque cada vez que se añade una arista, ésta debe conectar vértices
de dos árboles diferentes y no vértices dentro de un subárbol. Y no puede ser disconexa
ya que la primera arista que une dos componentes de Y debería haber sido añadida por el
algoritmo. Por tanto, Y es un árbol expandido de P.
Sea Y1 el árbol expandido de peso mínimo de P, el cual tiene el mayor número de aristas
en común con Y. Si Y1=Y entonces Y es un árbol de expansión mínimo. Por otro lado,
sea e la primera arista considerada por el algoritmo que está en Y y que no está en Y1.
Sean C1 y C2 las componentes de P que conecta la arista e. Ya que Y1 es un
árbol, Y1+e tiene un ciclo y existe una arista diferente f en ese ciclo que también
conecta C1 y C2. Entonces Y2=Y1+e-f es también un árbol expandido. Ya que e fue
considerada por el algoritmo antes que f, el peso de e es al menos igual que el peso de f y
ya que Y1 es un árbol expandido mínimo, los pesos de esas dos aristas deben ser de
hecho iguales. Por tanto, Y2 es un árbol expandido mínimo con más aristas en común
con Y que las que tiene Y1, contradiciendo las hipótesis que se habían establecido antes
para Y1. Esto prueba que Y debe ser un árbol expandido de peso mínimo.
Otros algoritmos para este problema son el algoritmo de Prim y el algoritmo de Boruvka.
Ejemplo[editar]