Você está na página 1de 7

KRUSKAL El primero que vamos a analizar es Kruskal. En este algoritmo, empezamos considerando cada vrtice como un rbol.

En cada paso, buscamos la arista de menor peso que no hayamos utilizado y revisamos a que rbol pertenecen los vrtices de la arista. Si los dos vrtices pertenecen al mismo rbol, entonces no la utilizamos (porque formara un ciclo); si los vrtices pertenecen a rboles distintos, entonces tomamos la arista como parte del rbol mnimo generador y juntamos los dos rboles. Repetimos lo anterior hasta hayamos procesador todas las aristas. Problema ejemplo Pecas Problema En un episodio del show de Dick Van Dyke, el pequeo Richie une las pecas en la espalda de su pap para formar la Campana de la Libertad. Esto atrae la atencin de Ripleys, pero cuando se dan cuenta que una supuesta peca es en realidad una cicatriz, pierden todo inters. Considera que la espalda de Dick es un plano con varias pecas de coordenadas (x, y). Tu trabajo es decirle a Richie como conectar todas las pecas de forma que utilice la menor cantidad de tinta posible. Richie conecta las pecas utilizando lneas rectas entre los dos puntos, y puede despegar la pluma despus de dibujar una lnea. Cuando Richie termine, deber ser posible encontrar una ruta de lneas para ir de cualquier peca a otra. Entrada La entrada comienza con un solo entero positivo en una lnea, el cual indica la cantidad de casos, los cuales se describen a continuacin. A esta lnea le sigue una lnea en blanco, y tambin habr una lnea en blanco entre dos entradas consecutivas.

La primera lnea de cada caso contiene 0 < n 100, la cantidad de pecas en la espalda de Dick. Habr una lnea para describir cada peca, la cual consiste en dos nmeros reales indicando las coordenadas (x, y) de la peca. Salida Para cada caso en la entrada, la salida debe cumplir con lo siguiente. La salida de dos casos consecutivos debe estar separada por una lnea en blanco. Tu programa debe imprimir un solo nmero real con dos decimales de precisin: la longitud mnima de las lneas de tinta que conectan a las pecas. Solucin: A cada punto lo consideramos como un vrtice y a la distancia entre ellos como el peso de la arista. La cantidad mnima de tinta que necesitamos la podemos obtener mediante el rbol mnimo generador.

Cdigo

En las primeras cinco lneas definimos la estructura de las aristas, las cuales estn compuestas por dos vrtices (v1 y v2) y por su peso (w). En seguida tenemos la declaracin de variables. Para los ciclos utilizamos los enteros i, j y k, para la cantidad de casos usamos c, para la cantidad de puntos n, y para guardar el total de aristas t. Los arreglos x e y los empleamos para la lectura de las coordenadas, y el arreglo e para guardar las aristas. Como todos los vrtices estn conectados entre si y la grfica no es dirigida, la cantidad de aristas est dada por y sabemos que el valor mximo de n es 100.

A continuacin tenemos la funcin con la que ordenamos las aristas (lnea 12). La implementacin es similar a la de la seccin 3.3, pero lo modificamos ligeramente para que ordene el arreglo de aristas segn sus pesos. El rbol mnimo generador lo obtenemos en la funcin Kruskal de las lneas 14 a 34. Tenemos como parmetros n y a, que corresponden a la cantidad de vrtices y aristas, respectivamente. Declaramos las variables i y j para los ciclos, k y l para guardar la componente a la que pertenecen los dos vrtices de la arista que estamos procesando, tot para guardar el peso total del rbol, y el arreglo d para saber a que componente pertenece cada vrtice.

Empezamos inicializando el total a cero (lnea 19), ordenando las aristas por peso de menor a mayor (lnea 20) y asignndole una componente distinta a cada vrtice (lneas 21 y 22). Despus procesamos cada arista (lneas 23 a 32), tomando a que componente pertenece cada vrtice (lnea 25) y tomando como parte del rbol mnimo si son de componentes distintos (lnea 26). Una vez que sabemos que pertenecen al rbol mnimo, incrementamos el total con el valor del peso del la arista (lnea 28) y juntamos los dos rboles (lneas 29 y 30). Para juntar los rboles, buscamos todos los vrtices que pertenezcan a la segunda componente y les asignamos el valor de la primera. Al finalizar devolvemos el peso del rbol mnimo (lnea 33). Podemos recortar un poco de tiempo contando cuantas aristas hemos utilizado y salindonos una vez que esto sea igual a n-1. La parte principal del cdigo la tenemos entre las lneas 36 y 55. Empezamos leyendo la cantidad de casos y utilizamos un ciclo para procesarlos todos (lneas 37 y 38). Para cada caso, leemos la cantidad de puntos (lnea 41) y en seguida leemos las coordenadas de ellos (lneas 43 y 44). Despus calculamos los vrtices y los pesos de cada una de las aristas (lneas 45 a 52). Terminamos imprimiendo el peso del rbol mnimo generador. Las lneas 39 y 42 las utilizamos para cumplir con el formato del problema.

Caso ejemplo 1 5 7.0 5.0 0.0 7.0 3.0 1.0 9.0 7.0 8.0 5.0 e[] v1 v2 w 2 1, 7.280 3 1, 5.657 3 2, 6.708 4 1, 2.828 4 2, 9.000 4 3, 8.485 5 1, 1.000 5 2, 8.246 5 3, 6.403 5 4, 2.236 v1 v2 5 5 3 3 Salida: w d[] 1, 2, 3, 4, 5 1, 1.000; 5, 2, 3, 4, 5 4, 2.236; 5, 2, 3, 5, 5 1, 5.657; 3, 2, 3, 3, 3 2, 6.708; 3, 3, 3, 3, 3

Entrada:

Desarrollo:

15.60

SEGUNDO ENFOQUE: PRIM

El siguiente algoritmo a considerar es Prim. En este algoritmo comenzamos con cualquier vrtice y lo tomamos como parte del rbol mnimo. En cada iteracin, buscamos la arista de menor costo que conecte el rbol mnimo con algn vrtice no utilizado. Una vez que hayamos utilizado todos los vrtices, el rbol resultante es el mnimo generador. Esto se asemeja mucho a Dijkstra, ya que en ambos casos buscamos la forma de llegar a los vrtices no utilizados mediante un costo mnimo.

Cdigo (bis)

Empezamos declarando las variables (lneas 1 a 4). La mayora de las variables estn declaradas de manera anloga al cdigo anterior, excepto m que es la matriz de adyacencia. En seguida tenemos la funcin Prim (lneas 6 a 31), que es donde calculamos el rbol mnimo generador. Las variables i y j las utilizamos para los ciclos, el peso de la arista mnima la guardamos en min y su posicin en p, para el peso total usamos tot y el arreglo vis lo empleamos para saber cuales vrtices ya utilizamos. Al principio inicializamos todos los no usados, excepto el primero que es desde el cual generaremos el rbol mnimo; tambin inicializamos el total a cero (lneas 11 y 12). A continuacin utilizamos un ciclo en el cul agregaremos un vrtice en cada iteracin. Empezamos buscando, entre los vrtice no utilizados, la arista de menor peso que una al vrtice con el rbol (lneas 15 a 20). Una vez que lo encontramos, lo marcamos como usado (lnea 21) e incrementamos el peso total del rbol en el valor de la arista (lnea 22). Proseguimos revisando si con el vrtice que agregamos existe una arista que conecte con los vrtices que no hemos utilizado y que sea de menor peso (lneas 23 a 29). Una vez obtenemos el rbol, devolvemos su peso (lnea 30). Podemos observar como la implementacin es prcticamente igual a la de Dijkstra, slo que estamos guardando en el arreglo el peso de arista ms liviana que nos conecta con el vrtice, en lugar de la distancia ms corta. La parte principal del cdigo lo tenemos entre las lneas 33 y 47. Al inicio leemos la cantidad de casos (lnea 34). Para cada caso, leemos la cantidad de puntos, seguido de las coordenadas de los mismos (lneas 38, 40 y 41). En seguida calculamos la matriz de adyacencia (lneas 42 a 44), y terminamos imprimiendo la cantidad mnima de tinta que necesitamos. Las lneas 37 y 39 las utilizamos para leer y escribir correctamente los archivos, de acuerdo a las especificaciones del problema. algoritmo de Kruskal (rbol de coste total mnimo) Dado un grafo G con nodos conectados por arcos con peso (coste o longitud): el peso o coste total de un rbol ser la suma de pesos de sus arcos. Obviamente, rboles diferentes tendrn un coste diferente. El problema es entonces cmo encontrar el rbol de coste total mnimo? Una manera de encontrar la solucin al problema del rbol de coste total mnimo, es la enumeracin completa. Aunque esta forma de resolucin es eficaz, no se puede considerar un algoritmo, y adems no es nada eficiente. Este problema fue resuelto independientemente por Dijkstra (1959), Kruskal (1956) y Prim (1957) y la existencia de un algoritmo polinomial (que todos ellos demostraron) es una grata sorpresa, debido a que un grafo con N vrtices puede llegar a contener N^N-2 subrboles. A lo largo de la historia se ha hecho un gran esfuerzo para encontrar un algoritmo rpido para este problema. El algoritmo de Kruskal es uno de los ms fciles de entender y probablemente el mejor para resolver problemas a mano. El algoritmo se basa en una propiedad clave de los rboles que permite estar seguros de si un arco debe pertenecer al rbol o no, y usar esta propiedad para seleccionar cada arco. Ntese en el algoritmo, que siempre que se aade un arco (u,v), ste ser siempre la conexin ms corta (menor coste) alcanzable desde el nodo u al resto del grafo G. As que por definicin ste deber ser parte del rbol.

Este algoritmo es de tipo greedy, ya que a cada paso, ste selecciona el arco ms barato y lo aade al subgrafo. Este tipo de algoritmos pueden no funcionar para resolver otro tipo de problemas, por ejemplo para encontrar la ruta ms corta entre los nodos a y b. Para simplificar, se asumirn que existe un nico rbol de coste total mnimo, aunque en muchos problemas puede existir ms de una solucin optima de igual valor total mnimo. A continuacin se muestra el pseudocdigo del algoritmo: Kruskal (G) E(1)=0, E(2)= todos los Arcos del grafo G Mientras E(1) contenga menos de n-1 arcos y E(2)=0 do De los arcos de E(2) seleccionar el de menor coste -->e(ij) E(2)= E(2) - {e(ij)} Si V(i), V(j) no estn en el mismo rbol entonces juntar los rboles de V(i) y de V(j) en uno slo end Si end do Fin del algoritmo

Revisin de bibliografa http://pier.guillen.com.mx/algorithms/10-graficas/10.6-prim_kruskal.htm#kruskal http://arodrigu.webs.upv.es/grafos/doku.php?id=algoritmo_kruskal http://prezi.com/b2sf4utwo0pz/algoritmo-de-kruskal-y-prim/

Você também pode gostar