Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Algoritmos de Grafos
Algoritmos de Grafos
MANUAL DE ALGORTMICA
Proyecto fin de carrera Escuela Tcnica Superior de Ingeniera Informtica Departamento Matemticas Aplicadas I Tutor: Alberto Mrquez Prez
1 de 248
Manual de algortmica
2 de 248
Manual de algortmica
1.- Introduccin................................................................................................... 6 2.- Conceptos generales. ................................................................................... 8 Grafos, tipos, ejemplos................................................................................ 8 Algunas definiciones. ................................................................................ 12 Algunos grafos bsicos. ............................................................................ 17 Tipos de rutas ........................................................................................... 46 Grafo complementario............................................................................... 48 Grafo de lnea. .......................................................................................... 50 3.- Algoritmos implementados. ......................................................................... 54 3.1.- Algoritmos sobre caminos mnimos. ..................................................... 54 Algoritmo de Dijkstra. ................................................................................ 54 Algoritmo de Floyd. ................................................................................... 61 3.2.- Algoritmos de distancias....................................................................... 65 Excentricidad de un vrtice. ...................................................................... 65 Radio de un grafo...................................................................................... 67 Dimetro de un grafo................................................................................. 69 Distancia de un vrtice. ............................................................................. 70 Algoritmo de la mediana............................................................................ 72 Algoritmo del centro. ................................................................................. 73 3.3.- Conectividad......................................................................................... 75 Algoritmo de componentes conexas. ........................................................ 75 Vrtices de corte. ...................................................................................... 77 Aristas puente. .......................................................................................... 78 Bloques. .................................................................................................... 79 3.4.- Algoritmos de bsquedas. .................................................................... 88 Bsqueda en profundidad (DFS) .............................................................. 88 Bsqueda en anchura (BFS) .................................................................... 90 3.5.- rboles recubridores de peso mnimo. ................................................. 92 Algoritmo de Boruvka. ............................................................................... 92 Algoritmo de Prim...................................................................................... 98 Algoritmo de Kruskal. .............................................................................. 100 3.6.- Prufer.................................................................................................. 103 Algoritmo de codificacin. ....................................................................... 103 Algoritmo de decodificacin. ................................................................... 110 3.7.- Algoritmo de emparejamientos ........................................................... 120 Algoritmo de emparejamiento maximal simple........................................ 121 Algoritmo de Kuhn-Munkres.................................................................... 128 Algoritmo de Kuhn-Munkres con preprocesamiento (peso mnimo)........ 142 Algoritmo de emparejamiento maximal de peso ptimo.......................... 146 3.8.- Euler ................................................................................................... 157 Es euleriano ?. ..................................................................................... 157 3.9.- Algoritmos de bsqueda de trayectorias eulerianas. .......................... 162 Algoritmo de Fleury ................................................................................. 162 Algoritmo de Tucker. ............................................................................... 183 Algoritmo de Hierholzer........................................................................... 201 Problema del cartero ............................................................................... 205 3.10.- Algoritmos de vrtice coloracin....................................................... 212 Algoritmo de coloracin Secuencial o Voraz. .......................................... 213
3 de 248
Manual de algortmica Algoritmo de coloracin Welsh-Powell .................................................... 215 Algoritmo de coloracin Matula-Marble-Isaacson ................................... 216 Algoritmo de coloracin de Brelaz........................................................... 217 Es bipartito? .......................................................................................... 221 3.11.- Algoritmos de aristas coloracin....................................................... 225 Algoritmo basado en rellenar un cuadrado latino .................................... 225 Algoritmo basado en emparejamientos maximales................................. 228 3.-12.- Hamilton .......................................................................................... 235 Algoritmo de Dirac................................................................................... 235 Bsqueda de trayectorias hamiltonianas................................................. 239 4.- Bibliografa ................................................................................................ 248
4 de 248
Manual de algortmica
5 de 248
Manual de algortmica
1.- Introduccin.
Nos encontramos ante una aplicacin desarrollada para el departamento de matemtica aplicada I con el objetivo de proporcionar una herramienta que ayude al desarrollo de las prcticas de las asignaturas dedicadas al estudio de los grafos y la investigacin. La aplicacin desarrollada tiene como objetivos mejorar algunos aspectos de la aplicacin Algraf la cual ha sido punto de partida de este proyecto por lo que se mantiene la compatibilidad con versiones anteriores. La aplicacin resuelve todos los problemas recogidos en versiones anteriores de Algraf y se han incluido algunos nuevos por los que ahora la aplicacin da solucin a gran cantidad de problemas entre los que podemos destacar.
- Problema de rutas. - Problemas de ubicacin. - Problemas de compatibilidades o coloracin. - Problemas de minimizacin de costes. - Problemas de emparejamientos.
Los conceptos expuestos a continuacin estn enfocados a la comprensin nica y exclusivamente a los algoritmos desarrollados para la aplicacin. Se ha pretendido que sea un manual autocontenido por lo que cualquier concepto necesario para entender de los algoritmos o funcionamiento de la aplicacin est debidamente explicado.
6 de 248
Manual de algortmica
7 de 248
Manual de algortmica
Un grafo G es un conjunto finito, no vaco de vrtices V(G) y un conjunto de aritas E(G) que puede ser vaco formado por pares no ordenados de elementos pertenecientes a V(G). Solo se establecer un orden cuado hablemos de grafos dirigidos y a las aristas se las denomina arcos. Ejemplo de grafo no dirigido.
La matriz de adyacencias del grafo es simtrica respecto a la diagonal principal por ser no dirigido. v 1 1 1 v2 1 1 1 1 v3 1 1 v4 1 1 1 v5 1 1 1 v6 1 v7 1
v7 v1 v2 v3 v4 v5 v6
8 de 248
Manual de algortmica Si dos o ms aristas unen el mismo par de vrtices se llaman aristas paralelas y en este caso tenemos un multigrafo. Si una arista une un mismo vrtice se trata de un lazo o bucle. Si en un grafo se permite aristas paralelas y bucles obtenemos un seudografo.
v1 v2 v3 v4 v5
9 de 248
Manual de algortmica Un grafo es ponderado si cada arista lleva asociada una magnitud, longitud, dificultad al recorrerla Ejemplo de grafo ponderado no dirigido.
La matriz de adyacencias del grafo es simtrica respecto a la diagonal principal por ser no dirigido. v1 3 5 2 v2 3 3 6 1 v3 3 1 2 v4 6 1 1 v5 5 1 1 v6 2 v7 2
v1 v2 v3 v4 v5 v6 v7
10 de 248
Matriz de adyacencias.
v1 v2 v3 v4 v5 v6 v7 v8
v1
v2 2
v3 3
v4 1
v5 1
v6 1 1
v7 1
v8 4 2
Si G es un grafo no dirigido y e = uv es una arista de G diremos que u es adyacente a v o que v es adyacente a u o e une u y v, e incide en v y u. En caso de tratarse de un grafo dirigido diremos que u es adyacente a v y v es adyacente desde u. El arco (u, v) es incidente desde u e incidente hacia v.
11 de 248
Manual de algortmica
Algunas definiciones.
Tamao y orden de un grafo. El orden de un grafo G es el nmero de vrtices del grafo y tamao es el nmero de aristas. p = orden (G) = | V (G) |. q = tamao (G) = | E (G) |.
Valencia o grado de un vrtice v. En un grafo no dirigido el grado de un vrtice v es el nmero de aristas que inciden en l o nmero de vrtices adyacentes. En grafos dirigidos se distingue entre grado de entrada y salida del vrtice. El grado de entrada de v se define como el nmero de vrtices adyacentes y el grado de salida de v es el nmero de vrtices adyacentes hacia el v o nmero de vrtices que apuntan a v.
12 de 248
No es un subgrafo.
13 de 248
Sea S un conjunto de vrtices no vaco de un grafo G. El subgrafo inducido por S es el subgrafo maximal de G con vrtices en el conjunto S. Al conjunto de aristas lo denotaremos por <S>. En <S> estn todas las aristas de G que unen dos vrtices de S. Un subgrafo H es subgrafo inducido por vrtices si existe S V (G) tal que H = <S>. Ejemplo
14 de 248
Manual de algortmica Subgrafo inducido por lo vrtices {v1, v4, v5, v6}.
Sea X un conjunto no vaci de aristas de G. El subgrafo inducido por X es el subgrafo mnimo de G con X el conjunto de aristas y <X> el conjunto de vrtices. En <X> estn todos los vrtices incidentes con alguna arista de X. Un subgrafo es subgrafo inducido por aristas si H = <X> para algn X E (G).
15 de 248
Subgrafo inducido por las aristas {v1v4, v4v5, v5v6, v6v3, v4v3}.
16 de 248
Manual de algortmica
Grafos completos. Sea G un grafo de orden p. G es completo si dos vrtices cualesquiera del grafo son siempre adyacentes, es decir, todos sus vrtices tienen valencia o grado p-1 (kp). Ejemplo k4.
Ejemplo k5.
17 de 248
Manual de algortmica
Caminos simples.
Un grafo de orden p 1 que es un camino simple se denota Pp. Un camino simple tiene longitud par si p es impar y longitud impar si p es par. Ejemplo
Ciclos.
Los ciclos Cn o n-ciclos para p 3, son grafos que se asemejan a polgonos de p lados. Un ciclo tiene longitud par si n es par y longitud impar si n es par. Ejemplo C5.
18 de 248
Manual de algortmica
19 de 248
Manual de algortmica rbol. Un rbol de n vrtices es un grafo conexo, sin ciclos con exactamente n-1 aristas. Adems posee las siguientes propiedades. a) Dos vrtices cualesquiera estn unidos por un nico camino. b) Si al grafo le eliminamos cualquiera de sus aristas queda dividido exactamente en dos componentes conexas dando lugar a un bosque. Ejemplo.
20 de 248
Existen ms tipos de grafos como los bipartitos los cuales se comentan ms adelante. Concretamente hay un apartado dedicados exclusivamente para ellos y en el algoritmo de Kuhn-Munkres se comenta previamente los grafos bipartitos completos.
21 de 248
Manual de algortmica
Una de las formas de representacin de la informacin, como estructura de datos, ms utilizada es el rbol. Un rbol consiste en un nodo inicial, llamado raz, del que parten un cierto nmero de aristas, denominadas ramas, cada una hasta un nuevo vrtice. Los vrtices extremos de una arista se llaman tambin vrtice padre, aquel que se representa ms cerca de la raz, y el otro vrtice hijo. A su vez, estos vrtices hijos pueden presentar ramas hacia nuevos nodos hijos, que debern ser siempre nodos diferentes, ya que un rbol no puede presentar ciclos. Por ltimo, aquellos vrtices que no presentan ramas hacia ningn hijo, se denominan hojas. El caso de los rboles n-arios completos es un caso particular dentro de los rboles. La referencia a n-arios-completos se debe a que el nmero de ramas que sale de cada nodo padre, que es en todos los casos igual a n. Para definir completamente un grafo perteneciente a esta familia, en realidad son necesarios 2 parmetros. Uno es la n anteriormente comentado, y el otro es el nmero de niveles que se le quiere dar al grafo, esto es, el nmero de ramas que deber tener el grafo desde el vrtice raz hasta cualquiera de los vrtices hoja.
22 de 248
Un grafo nulo es aquel que no contiene aristas. Un grafo nulo puede tener un nmero de vrtices cualquiera pero todos ellos son vrtices aislados. Obviamente, en un grafo nulo el nmero de componentes conexas ser igual al nmero de vrtices. Un ejemplo de grafo nulo de cuatro vrtices puede observarse en la figura.
23 de 248
Manual de algortmica
Rueda
Como en los casos de los grafos ciclos y los grafos estrella, la familia de los grafos ruedas toma su apelativo de la figura con la que se representan estos grafos. En este caso, la figura que muestra un grafo rueda viene a ser el resultado de la unin de las dos familias citadas anteriormente, esto es, un vrtice central rodeado de los dems vrtices del grafo en forma de crculo, de forma que stos se unen mediante aristas entre vrtices consecutivos, y, a su vez, mediante una arista ms, quedan unidos al vrtice central, dando al conjunto el aspecto de una rueda con sus radios. As, para cada n4, el grafo rueda, W n, con n+1 vrtices, se define como la unin K1+Cn, de un vrtice aislado con un ciclo de longitud n.
24 de 248
Otra de las familias de grafos que suelen considerarse con bastante asiduidad es la de los cubos. Esta familia est formada por los cubos de las distintas dimensiones, desde el cubo de dimensin 1, como observaremos en el apartado siguiente, hasta cualquier nmero de dimensiones. Sea K un entero positivo mayor que 1. El k-cubo, Qk, es el grafo cuyos vrtices son las k-tuplas ordenadas de ceros y unos, en el cual dos vrtices estn unidos por una arista si y slo si difieren exactamente en una posicin. As, por ejemplo, para k=3, los vrtices son (0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), y (1, 1, 1) y, por ejemplo, (0, 0, 0) est unido con (0, 0, 1), (0, 1, 0) y (1, 0, 0) pero no con ningn otro vrtice. Se puede comprobar que un k-cubo tiene 2k vrtices, 2(k-1)k aristas y es bipartito.
Cubo de dimensin 1.
El grafo que representa el cubo de dimensin 1, tal y como se ha explicado en el apartado anterior, tiene 21 vrtices y (1/2)21 = 1 arista.
25 de 248
Como ya se ha explicado en apartados anteriores, el grafo que representa el cubo de dimensin dos tiene un total de 4 vrtices de grado 2, para lo cual son necesarias 4 aristas.
Cubo de dimensin 3.
Al igual que en los casos de los dems cubos, el grafo que representa el cubo de dimensin tres sigue la misma relacin de vrtices y aristas descrita en la introduccin de este apartado. Por lo tanto, el cubo de 3 dimensiones, tal y como es comnmente conocido, cuenta con 8 vrtices de grado 3, para lo cual necesita 12 aristas.
26 de 248
Como en los casos anteriores, el cubo de 4 dimensiones tambin cumple la relacin de vrtices y aristas descrita, por lo que tiene 24 vrtices y 25 aristas, lo que le da un grado 4 a todos sus vrtices, como ya sabamos.
27 de 248
Para terminar con los grafos relativos a la familia de los cubos ndimensionales que se incluyen en la aplicacin del presente proyecto fin de carrera, el cubo de 5 dimensiones constar, naturalmente, de 32 vrtices con 80 aristas. Como en el resto de cubos, se puede comprobar que el grado de todos y cada uno de los vrtices del grafo coincide con la dimensin, en este caso, 5.
28 de 248
La familia de grafos que recibe la denominacin de rejillas contiene aquellos grafos cuya representacin da como resultado una trama de figuras regulares repetidas un cierto nmero de veces, lo que da al conjunto el aspecto de una rejilla, lo que le da nombre a la familia. As, podran existir tantos tipos de rejillas como figuran geomtricas quisiramos utilizar como base para la construccin de las mismas. En el presente trabajo se han considerado solamente las dos ms sencillas: la rejilla rectangular y la rejilla triangular, que se explican a continuacin.
Rejilla rectangular
La familia de grafos que componen las rejillas rectangulares se compone de todos aquellos grafos cuya representacin tiene la forma de un rectngulo dividido en un cierto nmero de porciones de ancho por otro cierto nmero de porciones de alto, lo que da al conjunto el aspecto de una rejilla formada, a su vez, por rectngulos de igual tamao. Estos grafos se caracterizan por tener lo que podramos denominar tres grupos diferentes de vrtices. Los vrtices correspondientes a las esquinas del rectngulo, que tendrn, naturalmente, grado 2; los vrtices que forman los lados del rectngulo, que tendrn grado 3; y los vrtices interiores, que tendrn grado 4. El nmero de aristas de estos grafos est claramente determinado por las dimensiones que le demos al rectngulo. Para un nmero i de vrtices de ancho y un nmero j de alto, el nmero de aristas del grafo vendr determinado por la frmula (j-1)i + (i-1)j.
29 de 248
Rejilla triangular
La familia de grafos de las rejillas triangulares, paralelamente a la del rejillas rectangulares, contiene grafos cuya representacin es un triangulo dividido en porciones triangulares iguales. Como es fcil de suponer, el nmero de porciones en que se puede dividir el tringulo de la rejilla tambin est limitado. A diferencia de la rejilla rectangular, las dimensiones de la rejilla triangular se determinan perfectamente con un solo parmetro que ser el nmero de vrtices por cada lado. Al igual que ocurre con las rejillas rectangulares, en las triangulares tambin podemos encontrar tres grupos diferentes de vrtices. Los vrtices correspondientes a las esquinas del tringulo, que tendrn, igualmente, grado 2; los vrtices que forman los lados del tringulo, que tendrn en este caso grado 4; y los vrtices interiores, que tendrn grado 6. El nmero de aristas de estos grafos tambin viene determinado, lgicamente, por las dimensiones que le demos al tringulo. Para un nmero n de vrtices de lado del tringulo, el nmero de aristas del grafo vendr determinado por la frmula (3/2)n(n-1).
30 de 248
31 de 248
En el espacio de tres dimensiones, un poliedro es un slido limitado por superficies, llamadas comnmente caras, cada una de las cuales es un plano. Un slido se dice que es convexo si cualesquiera dos puntos de su interior pueden unirse mediante una lnea recta que se encuentre completamente en el interior del slido. Sea una cara de un grafo plano G. Definimos el grado de , denotado por d(), al nmero de aristas del contorno de . Los vrtices y las aristas de un poliedro, que forman el esqueleto del slido, forman un grafo simple en el espacio de tres dimensiones. Se puede ver que si el poliedro es convexo el grafo resultante es planar, y claramente, que tambin es conexo. Que el grado mnimo de cada vrtice ser, como mnimo, de 3 y que el grado de cada cara es tambin como mnimo de 3. Adems, en particular el grafo resultante tambin es simple, por lo que se puede establecer la definicin: Un grafo conexo, simple y plano G se denomina polidrico si d(v) 3 para cada vrtice v de G y d()3 para cada cara de G. Teorema: Sea P un poliedro convexo y sea G su grafo polidrico. Para cada n3 sea vn el nmero de vrtices de G de grado n y sea fn el nmero de caras de G de grado n. << vrticesG + carasG = aristasG +2 >> El poliedro P, y por lo tanto el grafo G, tiene al menos una cara limitada por un ciclo de longitud n para n=3, 4, o 5. Los antiguos griegos descubrieron cinco poliedros regulares. Se dice que un poliedro es regular si es convexo y sus caras son polgonos regulares congruentes (esto es, que los ngulos del poliedro son todos iguales). Estos cinco poliedros son conocidos como slidos platnicos. Usando la frmula de Euler se puede demostrar que no existe ningn otro poliedro regular adems de los 5 que descubrieron los griegos y cuyos grafos correspondientes constituyen la familia que se incluye en la herramienta y los cuales se presentan a continuacin.
32 de 248
Manual de algortmica A continuacin, se detalla un poco ms cada uno de los citados grafos. Tetraedro
El grafo platnico que representa la figura del tetraedro consta, naturalmente, de 4 vrtices y 6 aristas. Como se puede observar en la figura siguiente, todos los vrtices del grafo tienen grado 3, y las caras de la figura representada son todas tringulos, como corresponde a dicha figura. El grafo platnico tetraedro se encuentra representado planarmente en la siguiente figura.
33 de 248
Como el hexaedro que representa, el grafo platnico hexaedro tiene 8 vrtices y 12 aristas, formando 6 caras de cuatro lados. Como todos sabemos ya, la figura geomtrica hexaedro recibe tambin el nombre de cubo refirindose al cubo de tres dimensiones, por lo que el grafo platnico hexaedro, coincide exactamente con el grafo que representa el cubo tridimensional. El grafo platnico hexaedro se encuentra representado planarmente en la siguiente figura.
34 de 248
Como es bien conocido, un octaedro es una figura geomtrica que, como su propio nombre indica, consta de ocho caras, en forma de tringulo. Como es lgico, el grafo que lo representa tiene sus mismas caractersticas, como ya hemos visto en los ejemplos anteriores, es decir, 6 vrtices y 12 aristas. El grado de todos los vrtices de este grafo, obviamente, es 4. El grafo platnico octaedro se encuentra representado planarmente en la siguiente figura.
35 de 248
Como en todos los casos anteriores el grafo platnico icosaedro, al representar la figura geomtrica de la que toma nombre, posee tambin sus mismas caractersticas. En el caso del icosaedro, 12 vrtices de grado 5, con 30 aristas, para lograr formar 20 caras triangulares. El grafo platnico icosaedro se encuentra representado planarmente en la siguiente figura.
36 de 248
La ltima de las figuras representadas en la aplicacin y, por lo tanto, contenidas en el presente texto, mediante un grafo platnico es la del dodecaedro. Este grafo contar, pues, con los mismos 20 vrtices y las mismas 30 aristas que dan a la figura mencionada sus caractersticas 12 caras pentagonales. Para ello, los vrtices de este grafo tienen todos grado 3. El grafo platnico dodecaedro se encuentra representado planarmente en la siguiente figura.
37 de 248
Se ha incluido en la aplicacin el grafo atribuido a Herschel ya que tiene la particularidad de constituir el ejemplo ms pequeo de grafo polidrico nohamiltoniano.
38 de 248
Otra de las familias que se incluyen en el presente trabajo es la correspondiente a los grafos de Harary. Los grafos de Harary se definen mediante dos parmetros: el nmero de vrtices del grafo, que se denota por n; y el grado mnimo que debe tener cada vrtice del grafo, que se denota por k. Debido a esta notacin, los grafos de Harary suelen describirse mediante la simbologa: Hk, n. Estos grafos cumplen la propiedad de hacer que cada uno de sus vrtices tenga, como mnimo grado k, pero utilizando para ello el mnimo nmero de aristas posible. Un ejemplo de este tipo de grafos, donde se pueden observar las caractersticas descritas es H11, 10.
39 de 248
Los grafos enlazados se caracterizan porque, si numeramos sus vrtices, las aristas del grafo enlazan vrtices cuyo nmero se diferencia un una cantidad fija -que podemos llamar k-, es decir, siguiendo una determinada progresin lineal. Por ejemplo, si hacemos k=2, el vrtice 1 se unira al 3, el 2 al 4, y as sucesivamente con todos los vrtices del grafo. Si en lugar de tener en cuenta tan slo este valor de k, tomramos una serie completa de valores k1, k2, ... , kn, obtendramos un grafo que podramos denominar n-enlazado. Los grafos enlazados ms comunes son aquellos para los que n=1, que denotamos por Ln,r y aquellos en los que n=2, que denotamos por Ln,r,s. Enlazados LN, R Dado un grafo G, definido por un conjunto de vrtices V y un conjunto de aristas A. Supongamos v1, ..., vn los vrtices contenidos en V. Se dice que G es un grafo enlazado Ln, r si cumple que: vi, vj V, tales que (j<r j+n=i+r) (j=r j=i+r), la arista (vi, vj) A Los grafos enlazados Ln, r se caracterizan porque todos sus vrtices tienen grado dos. Para r>1, la forma de estos grafos, situando sus vrtices en crculo, es de estrella, como se puede observar en el ejemplo de la figura. L5,2.
40 de 248
Manual de algortmica Enlazados LN, R, S Dado un grafo G, definido por un conjunto de vrtices V y un conjunto de aristas A. Supongamos v1, ..., vn los vrtices contenidos en V. Se dice que G es un grafo enlazado Ln, r, s si cumple que: r s, vi, vj V, tales que (j<r j+n=i+r) (j=r j=i+r), la arista (vi, vj) A, y vk, vl V, tales que (l<r l+n=k+r) (l=r l=k+r), la arista (vk, vl) A
Los grafos enlazados Ln, r, s se caracterizan porque todos sus vrtices tienen grado cuatro. Un ejemplo de estos grafos es el que se puede observar en la figura L7, 2, 3.
41 de 248
El grafo que aqu se presenta debe su nombre a que la primera persona que lo estudi fue Petersen en el ao 1891. Las tres representaciones ms habituales del grafo de Petersen.
Entre las muchas cualidades interesantes que presenta este grafo, podemos mencionar las siguientes. Es un grafo 3-regular y de cintura 5, siendo adems, el grafo de orden mnimo que cumple estas caractersticas. Es un grafo de dimetro 2 lo que se traduce en que tiene 10 vrtices de la forma ms compacta posible. Tiene valor de conectividad y de arista-conectividad 3, caracterstica esta que ha sido ampliamente estudiada en la rama de las redes de telecomunicaciones. No es un grafo hamiltoniano pero tiene la peculiaridad de que el subgrafo resultante de eliminar cualquiera de sus vrtices s lo es. Adems, es el menor grafo con esta propiedad.
42 de 248
Otro de los grafos que por su relevancia han sido incluidos en la aplicacin como grafo singular es el denominado grafo Grtzsch. Para entender el inters que presenta este grafo es necesario primero introducir algunos conceptos de la Teora de Grafos. A continuacin pasamos a definir brevemente tales conceptos. Para cualquier grafo G un subgrafo completo de G se denomina clique de G. El nmero de vrtices del clique ms grande de G se denomina el nmero clique de G y se denota por cl(G). Sea G un grafo. Un coloreado de vrtices de G asigna colores, normalmente denotados por 1, 2, 3,... a los vrtices de G, uno por cada vrtice, de forma que vrtices adyacentes tienen asignados colores diferentes. Un k-coloreado de G es un coloreado que consiste en k colores diferentes y, en ese caso, el grafo G se dice que es k-coloreable. El mnimo nmero k para el cual existe un k-coloreado del grafo G se denomina nmero cromtico de G (o ndice cromtico de G) . Teorema: Para cada k1 existe un grafo k-cromtico Mk que no tiene subgrafos tringulos (K3). De esta familia de grafos Mi denominada familia Mycielski, el de Grtzsch representa el grafo M4. La siguiente figura muestra una representacin del grafo de Grtzsch.
43 de 248
44 de 248
El grafo de Tutte es un grafo planar, 3-conexo no hamiltoniano. El aspecto ms importante que presenta este grafo es que se utiliza para refutar la conjetura de Tait, que afirmaba que "todo grafo 3-regular, 3-conexo y planar es hamiltoniano". Esta conjetura tena importancia para demostrar de una forma sencilla el teorema de los cuatro colores, pero fracas a causa de este grafo contraejemplo. Una representacin de este grafo como la de la figura nos permitir comprobar las propiedades descritas.
45 de 248
Manual de algortmica
Tipos de rutas
A continuacin definiremos algunos conceptos sobre rutas que debemos conocer para comprender algunos de los algoritmos explicados. Definiremos: Camino. Recorrido. Camino simple. Camino cerrado. Ciclo. Circuito. Un camino w simple en un grafo G es una sucesin de alternada de vrtices y aristas o arcos (si es dirigido) w: v0e1v1e2v2vn-1envn comenzando y terminando con vrtices tal que ei = vi-1vi con 1 i n. Diremos que w tiene longitud n si posee n aritas. Un camino de longitud cero se denomina camino trivial. Ejemplo.
46 de 248
Manual de algortmica Un recorrido o trayectoria es un camino donde no se repiten aristas. Un posible ejemplo basndonos en el grafo anterior. Recorrido 1: v4v2v5v3v1. Recorrido 2: v5v3v1v2. Un camino simple es un camino en el que no se repiten vrtices. Camino simple: v4v2v5v3v1. Un ciclo es un camino simple v0v1vn con n 3, v0 = vn y los n vrtices son distintos. Al ciclo de longitud n lo denominaremos n-ciclo. Ciclo: v1v3v5v2v1 Un ciclo es un camino cerrado que cumple las propiedades anteriores y un camino simple es un camino abierto. Un camino cerrado donde no se repiten es un circuito. Circuito: v1v2v5v3v2v4v3v1.
Vrtices repetidos SI SI SI SI NO NO
Tipo ruta Camino Camino cerrado Recorrido Circuito Camino simple Ciclo
47 de 248
Manual de algortmica
Grafo complementario.
El grafo complementario de G () es un grafo con V() = V(G) y tal que si uv es una arista de si y solo si uv no es una arista de G. Ejemplo 1. (Grafo no dirigido)
Grafo complementario.
48 de 248
Grafo complementario.
49 de 248
Manual de algortmica
Grafo de lnea.
El grafo de lnea L(G) de G es un grafo que posee tantos vrtices como aristas tiene G, es decir, | V(L(G)) | = | E(G) |. Dos vrtices v y u de L(G) son adyacentes si u y v son aristas de G y inciden en un mismo vrtice. Ejemplo 1
Grafo de lnea.
50 de 248
Manual de algortmica
51 de 248
Grafo de lnea.
52 de 248
Manual de algortmica
53 de 248
Manual de algortmica
54 de 248
Manual de algortmica En cada iteracin se rellena una fila, siguiendo los siguientes pasos: 1.- Buscamos los vrtices adyacentes al vrtice Vi y en la columna correspondiente al adyacente. Si la distancia total recorrida hasta el momento ms la distancia entre Vi y el adyacente es menor o igual que la ya recorrida entonces actualizamos la tupla con la nueva distancia y vrtice padre. Es importante actualizar la tabla si la distancia es igual ya que as conseguiremos obtener varias rutas mnimas entre el vrtice origen y destino. 2.- A continuacin tomamos como nuevo vrtice Vi, el vrtice correspondiente a la columna cuya distancia es mnima. Una vez escogido el vrtice cuya distancia es mnima la columna queda cerrada, es decir no vuelve a considerarse para rellenar el resto de la tabla. Una vez que tenemos rellenada la tabla reconstruir el camino mnimo a partir de la misma es bastante fcil. Se ha optado por reconstruir el camino desde el vrtice destino al vrtice origen, por lo que el primer vrtice que forma parte del camino parcialmente construido es el vrtice destino. Acto seguido nos situamos en la primera posicin distinta de * de la columna correspondiente al vrtice destino comenzando por la parte inferior de la tabla y el vrtice padre es el siguiente que forma parte del camino. La longitud del camino viene determinada por la distancia almacenada en dicha posicin. Ahora nos situamos en la columna del vrtice padre y repetimos el proceso anterior hasta llegar al vrtice origen. En ese momento tendremos el camino mnimo completo. Para que la exposicin expondremos algunos ejemplos. del algoritmo quede totalmente clara
55 de 248
Aplicamos el algoritmo de Dijkstra para encontrar el camino mnimo entre el vrtice v1 y v8 obteniendo la siguiente tabla.
V1 (v2,P(v2)) (v3,P(v3)) (v4,P(v4)) (v5,P(v5)) (V6,P(v6)) (v7,P(v7)) (v8,P(v8)) m Vi
(0,NP) * * * * * * *
(,NP) (2,v1) * * * * * *
0 2 3 3 3 4 6 8
V1 V2 V3 V4 V5 V6 V7 V8
A continuacin reconstruiremos el camino desde el vrtice v1 a vrtice v8 comenzando por este ltimo.
Para ir desde el vrtice v8 al vrtice v1 es necesario pasar por el padre de v8. El camino construido hasta el momento es v8 v7 ... v1. Seguidamente miraramos quien es el padre del ltimo vrtice que forma parte del camino parcialmente construido, en este caso es v3 y as sucesivamente.
56 de 248
Manual de algortmica
Camino mnimo: v1
Podemos observar en la columna del vrtice de destino que existen dos tuplas con padres distintos e igual distancia lo cual no ndica que existe ms de un camino mnimo. Reconstruccin del segundo camino: v8 {P(v8)} v6 {P(v6)} v2 v5 {P(v5)} v5 v6 v2 {P(v2)} v1 {P(v1)}.
Camino mnimo: v1
Podemos observar que en la columna correspondiente al vrtice V6 existen dos tuplas con padres distintos y misma distancia por lo que existe otro camino mnimo ms.
Camino mnimo: v1
57 de 248
Aplicamos el algoritmo de Dijkstra para encontrar el camino mnimo entre el vrtice v1 y v4 obteniendo la siguiente tabla.
V1 (v2,P(v2)) (v3,P(v3)) (v4,P(v4)) (v5,P(v5)) m Vi
(0,NP) * * * *
(,NP) (4,v1) * * *
0 4 5 6 7
V1 V3 V2 V5 V4
Recontraccin del primer camino mnimo desde el vrtice v1 a v4. V4 {P(v4)} v5 {P(v5)} v3 v3 {P(v3)} v5 v1 {P(v1)}.
Camino mnimo: v1
Recontraccin del segundo camino mnimo desde el vrtice v1 a v4. V4 {P(v4)} v2 {P(v2)} v2 v1 {P(v1)}. v4. La longitud del camino es 7.
Camino mnimo: v1
58 de 248
59 de 248
Manual de algortmica Aplicamos el algoritmo de Dijkstra para encontrar el camino mnimo entre el vrtice v1 y v4 obteniendo la siguiente tabla.
V1 (v2,P(v2))
(0,NP) * * * *
(,NP) (1,v1) * * *
(v3,P(v3))
(v4,P(v4))
(v5,P(v5))
Vi
0 1 4
V1 V2 V3
En este caso observamos que el vrtice destino no tiene padre asignado, lo cual nos indica que el grafo no es conexo, por lo que no existe ningn camino entre el vrtice origen y destino.
60 de 248
Manual de algortmica
Algoritmo de Floyd.
El algoritmo de Floyd calcula el camino mnimo entre todos los pares de vrtices del grafo ponderado y no negativo mediante tcnicas de programacin dinmica. Para ello calcularemos una serie de matrices Dk[i,j] que debe cumplir:
Dk-1[i, k]+ Dk-1[k, j] (pasando por k). Dk[i, j] = Dk-1[i, j] (no pasando por k).
Donde Dk[i, j] = mnimo(Dk-1[i,k] + Dk-1[k,j]), D[i][j]). Longitud del camino ms corto para ir desde el vrtice i al vrtice j pudiendo pasar por los vrtices 1,2,..., hasta k. Bsicamente la expresin anterior nos dice: si para ir desde el vrtice i al j mejoramos pasando por el vrtice k, este se aade al camino. Adems para reconstruir el camino se hace uso de una matriz de trayectorias donde en cada iteracin si se mejora el camino desde el vrtice i al vrtice j pasado por k, este se anota en la matriz de trayectorias. El algoritmo de Floyd quedara: Func floyd (ady: Array[1..n,1..n] de entero) dev(D: Array[1..n,1..n] de entero, p: Array[1..n,1..n] de entero ) var i,j,k: Entero prin desde i=1 hasta n desde j=1 hasta n desde k=1 hasta n si k <> i y k<>j si D[i,j] > D[i,k] + D[k,j] D[i, j] := D[i,k] + D[k,j] P[i,j] := k // Vrtice de paso. fsi fsi fdesde fdesde fdesde
61 de 248
Calcularemos la sucesin de matrices Dk. Sea M[i,j] la matriz de adyacencias del grafo. V1 V2 V3 V4 0 5 50 0 15 5 30 0 15 15 5 0
M [j, j] =
V1 V2 V3 V4
Primera iteracin D1 representa el camino ms corto para ir desde vrtice i al vrtice j pudiendo pasar nicamente por el vrtice 1. V1 V2 V3 V4 V1 0 5 V2 50 0 15 5 V3 30 35 0 15 V4 15 20 5 0 V1 V2 V3 V4 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
D1 =
P[i,j] =
V1 V2 V3 V4
62 de 248
Manual de algortmica
D2 representa el camino ms corto para ir desde vrtice i al vrtice j pudiendo pasar nicamente por el vrtice 1 y 2.
D2 =
V1 V2 V3 V4
V1 V2 V3 V4 0 5 20 10 50 0 15 5 30 35 0 15 15 20 5 0
P[i,j] =
V1 V2 V3 V4
V1 V2 V3 V4 0 0 2 2 0 0 0 0 0 1 0 0 0 1 0 0
D3 representa el camino ms corto para ir desde vrtice i al vrtice j pudiendo pasar nicamente por el vrtice 1, 2 y 3.
D3 =
V1 V2 V3 V4
V1 V2 V3 V4 0 5 20 10 45 0 15 5 30 35 0 15 15 20 5 0
P[i,j] =
V1 V2 V3 V4
V1 V2 V3 V4 0 0 2 2 3 0 0 0 0 1 0 0 0 1 0 0
D4 representa el camino ms corto para ir desde vrtice i al vrtice j pudiendo pasar nicamente por el vrtice 1, 2, 3 y 4. En la ltima etapa se consideran todos los vrtices del grafo.
D4 =
V1 V2 V3 V4 V1 0 5 15 10 V2 20 0 10 5 V3 30 35 0 15 V4 15 20 5 0
P[i,j] =
V1 V2 V3 V4
V1 V2 V3 V4 0 0 4 2 4 0 4 0 0 1 0 0 0 1 0 0
63 de 248
Manual de algortmica Cmo se reconstruye el camino?. Para ir desde un vrtice vi a un vrtice vj consultamos la posicin P[i,j] de la matriz de trayectorias: Si es 0 entonces existe camino directo para ir desde el vrtice i al j y el camino se obtiene directamente. En otro caso sea Vpaso = P[i,j]. Ahora visitamos la posicin P[Vpaso,j] repitiendo el mismo proceso. Reconstruccin del camino mnimo para ir desde el vrtice v2 al vrtice v3. P[2,3] = 4 por lo que para ir de v2 a v3 es necesario pasar por el vrtice 4. P[4,3] = 0 existe camino directo.
Camino mnimo: v2
v4
v3.
64 de 248
Manual de algortmica
La excentricidad de un vrtice v de un grafo G es la distancia de v al vrtice ms alejado de l, es decir, se trata de la mayor longitud del camino ms corto entre el vrtice y cualquier otro. Para implementar el algoritmo pueden seguirse los siguientes pasos: 1.- Calculamos Dijsktra desde el vrtice v a resto de vrtices del grafo. 2.- Finalmente de todos los caminos mnimos obtenidos tomamos la longitud mayor.
Seguidamente veremos un ejemplo. Para el grafo de la figura calcularemos la excentricidad del vrtice v1.
Distancia mnima distmin(v1, v2) distmin(v1, v3) distmin(v1, v4) distmin(v1, v5)
65 de 248
66 de 248
Manual de algortmica
Radio de un grafo.
El radio de un grafo G es la excentricidad ms pequea de cualquiera de sus vrtices. Para implementar el algoritmo pueden seguirse los siguientes pasos: 1.- Para cada vrtice obtenemos la excentricidad. 2.- Obtener la excentricidad ms pequea.
Veamos un ejemplo.
Distancia mnima distmin(v1, v2) distmin(v1, v3) distmin(v1, v4) distmin(v1, v5)
67 de 248
Manual de algortmica
Distancia mnima distmin(v2, v1) distmin(v2, v3) distmin(v2, v4) distmin(v2, v5) Distancia mnima distmin(v3, v1) distmin(v3, v2) distmin(v3, v4) distmin(v3, v5)
Distancia mnima distmin(v4, v1) distmin(v4, v2) distmin(v4, v3) distmin(v4, v5)
Distancia mnima distmin(v5, v1) distmin(v5, v2) distmin(v5, v3) distmin(v5, v4)
Como sabemos la excentricidad de cada vrtice es la mayor longitud del camino ms corto. A partir de los clculos realizados con anterioridad podemos obtener una tabla con la excentricidad de cada vrtice.
v1 v2 v3 v4 v5 7 5 5 7 6
68 de 248
Manual de algortmica
Dimetro de un grafo.
El dimetro de un grafo G es la mayor distancia existente entre dos vrtices cualesquiera del grafo, es decir, es la excentricidad ms grande de cualquiera de sus vrtices. Para implementar el algoritmo pueden seguirse los siguientes pasos: 1.- Para cada vrtice obtenemos la excentricidad. 2.- Obtener la excentricidad mxima.
Veamos un ejemplo:
Para el grafo de la figura obtendremos el dimetro, aprovechado los clculos anteriores realizados para el radio. El dimetro del grafo es 7.
69 de 248
Manual de algortmica
Distancia de un vrtice.
La distancia de un vrtice "v" en un grafo G ponderado o no, es la suma de las distancias mnimas a todos los vrtices del grafo.
Para implementar el algoritmo pueden seguirse los siguientes pasos: 1.- Calcula Dijsktra para todos los vrtices del grafo. 2.- Sumar todas las distancias. Si entre un vrtice v y otro cualquiera existiera ms de un camino mnimo solo se tendr en cuenta un de los caminos a la hora sumar las distancias.
Veamos un ejemplo: Para el grafo de la figura calcular la distancia del vrtice v1 y v5.
Distancia mnima distmin(v1, v2) distmin(v1, v3) distmin(v1, v4) distmin(v1, v5)
70 de 248
Manual de algortmica distancia Distancia mnima distmin(v5, v1) distmin(v5, v2) distmin(v5, v3) distmin(v5, v4) distancia 22 Valor camino mnimo 6 3 2 1 12
Antes de comentar los algoritmos de la mediana y el centro de un grafo definiremos el concepto de subgrafo inducido por el conjunto de vrtices del grafo. Sea S un conjunto de vrtices no vaci de un grafo G. El subgrafo inducido por S es el subgrafo maximal de G, con vrtices en el conjunto S. Las aristas que forman parte del subgrafo inducido son todas las aristas de G que inciden o unen vrtices de S.
71 de 248
Manual de algortmica
Algoritmo de la mediana.
La mediana de un grafo G es el subgrafo inducido por los vrtices que tienen mnima distancia. Para implementar el algoritmo pueden seguirse los siguientes pasos: 1.- Calcular la distancia de cada vrtice. . 2.- Escoger el subconjunto de vrtices de mnima distancia. 3.- Construir el subgrafo inducido por dicho conjunto de vrtices obtenidos en el paso 2.
22 15 14 13 12
72 de 248
Manual de algortmica En este caso la mediana del grafo esta formada por un nico vrtice. Dicho vrtice es v5.
El centro de un grafo G, es el subgrafo inducido por los vrtices que tienen excentricidad mnima. Para implementar el algoritmo pueden seguirse los siguientes pasos: 1.- Para cada vrtice calculamos la excentricidad. 2.- Escoger el subconjunto de vrtices de mnima excentricidad. 3.- Construir el subgrafo inducido por dicho conjunto de vrtices obtenidos en el paso 2.
Veamos un ejemplo
73 de 248
Manual de algortmica El subconjunto de vrtices de mnima excentricidad esta formado por los vrtices v2 y v3.
74 de 248
Manual de algortmica
3.3.- Conectividad.
Algoritmo de componentes conexas.
Se trata de determinar si un grafo dirigido o no, es conexo o no lo es. Podemos usar la propiedad de que si un grafo es conexo es porque existe camino entre todo par de vrtices o, lo que es lo mismo, a partir de cualquier vrtice es posible alcanzar a todos los dems. Para la implementacin se realiza mediante tcnicas de programacin dinmica. Se hace uso de un array en la que cada posicin hace referencia a un vrtice del grafo. Aquellas posiciones que al finalizar la ejecucin posean el mismo valor estarn conectadas y formaran parte de la misma componente conexa. Inicialmente se suponen todos los vrtices desconectados por lo que todas las posiciones del array tienen un valor distinto. Seguidamente se itera sobre las aristas o matriz de adyacencias del grafo, de tal forma que si existe una aritas entre el vrtice correspondiente a la fila i y columna j se almacena en dos variables la componente mayor y menor respectivamente. Acto seguido se itera sobre el array de componente de tal forma que todas las posiciones donde el valor es igual a la componente mayor se actualizan con el valor de la componente menor, es decir, a vrtices conectados se les asigna el mismo valor y se pasa a la siguiente arista repitiendo dicho proceso. Tras iterar sobre todas las aristas el array almacena tantos nmeros distintos como componentes conexas tiene el grafo. Dicha componente conexa viene determinada por el subgrafo inducido de los vrtices que pertenecen a dicha componente conexa. Veamos un ejemplo
75 de 248
Manual de algortmica
v1 v2 v3 v4 v5 v6 Mayor Menor 1 2 3 4 5 6 * *
v1 v2 v3 v4 v5 v6 Mayor Menor 1 2 3 1 5 6 4 1 El vrtice v1 y v4 estn conectados. Actualizada la posicin del vrtice v4.
v1 v2 v3 v4 v5 v6 Mayor Menor 1 2 3 1 2 6 5 2
El vrtice v2 y v5 estn conectados. Actualizada la posicin del vrtice v5. v1 v2 v3 v4 v5 v6 Mayor Menor 1 2 3 1 2 3 6 3
El vrtice v3 y v6 estn conectados. Actualizada la posicin del vrtice v6. Como puede apreciarse el grafo posee tres componentes conexas que son v1v4 , v2v5 y v3v6 .
76 de 248
Manual de algortmica
Vrtices de corte.
Sea G un grafo y v un vrtice de G. Se dice que v es un vrtice de corte si al eliminar el vrtice del grafo este es no conexo, es decir, el nmero de componentes conexas es mayor que uno. La implementacin del algoritmo consta de los siguientes pasos: 1.grafo. 2.- Eliminamos un vrtice del grafo. 3.- En estas condiciones se calculan el nmero de componentes conexas. Si el nmero de componentes actuales es distinto del nmero de componentes calculadas inicialmente ms uno, entonces se trata de un vrtice de corte. 4.- Restauramos el vrtice borrado, as como sus aristas y repetimos el proceso con el resto de vrtices (ir al paso 2). Ejemplo El grafo posee tres vrtices de corte: v3, v4, v7. Basta observar que si eliminamos algunos de estos vrtices el grafo no es conexo. Calculamos las componentes conexas que posee inicialmente el
77 de 248
Manual de algortmica
Aristas puente.
Una arista e en un grafo G se dice que es una arista puente si al eliminar la arista del grafo, este deja de ser conexo. La implementacin del algoritmo consta de los siguientes pasos: 1.grafo. 2.- Eliminamos una arista del grafo. 3.- En estas condiciones se calculan el nmero de componentes conexas. Si el nmero de componentes actuales es distinto del nmero de componentes calculadas inicialmente entonces se trata de una arista puente. 4.- Restauramos la arista del grafo y repetimos el proceso para el resto de aristas del grafo. (Ir al paso 2) Calculamos las componentes conexas que posee inicialmente el
Ejemplo
78 de 248
Un bloque B de un grafo G conexo es un subgrafo no separable de G y mayor con esta propiedad. Los bloques permiten hacer una particin en el conjunto de las aristas. Un grafo conexo no trivial sin vrtices de corte recibe el nombre de grafo no separable. Un subgrafo G1 de G es maximal con respecto a una propiedad si no hay ningn otro subgrafo que tambin posea esa propiedad y que contenga a G.
Algunas propiedades.
a) Si G es no separable G es un bloque. b) Los bloques permiten hacer una particin del conjunto de las aristas. c) Cada dos bloques a lo sumo tienen un vrtice en comn y este es un vrtice de corte. d) Un bloque con exactamente un vrtice de corte se denomina bloque final. e) Un grafo G conexo con al menos un vrtice de corte tiene como mnimo dos bloques. f) Una arista puente es considerada un bloque.
1.- Calcular los vrtices de corte y aristas puente del grafo. 2.- Eliminar los vrtices de corte del grafo (guardando las aristas). 3.- Calcular las componentes conexas. 4.- Restaurar los vrtices de corte junto con las aristas y eliminar las aristas puente del grafo.
79 de 248
Manual de algortmica 5.- Para cada vrtice de corte y aristas de cada componente conexa. Si G existe una arista formada por el vrtice de corte y el vrtice origen o destino (o al contrario, es decir, el vrtice origen o destino y el vrtice de corte en caso de ser un grafo dirigido) de una arista de la componente conexa actualmente procesada almacenamos la arista formada por el vrtice de corte en un conjunto S. Una vez procesadas todas las aristas de la componente conexa actual, aadimos todas las aristas almacenadas en S, a la componente actual, obteniendo las aristas de uno de los bloques del grafo. 6.- Finalmente aadimos como bloques todas las aristas puente del grafo a la vez que las restauramos en el grafo G.
A continuacin veremos un ejemplo para cada tipo de grafo. Ejemplo para un grafo no dirigido.
PASO 1.
80 de 248
Eliminamos el vrtice de corte y guardamos las aristas eliminadas {v5v6, v5v4, v1v5, v3v5}.
PASO 3.
Restauramos el nico vrtice de corte v5 junto con las aristas eliminadas {v5v6, v5v4, v1v5, v3v5} y eliminamos las aristas puente.
81 de 248
Manual de algortmica
82 de 248
Comprobamos si en el grafo existe alguna arista formada por v5 y algn vrtice de las aristas de la componente conexa. Este proceso se realiza para cada una de las componentes conexas. Componentes conexas {{v1v2, v1v3, v3v2}, {v4}, {v6}}.
Primera componente conexa {v1v2, v1v3, v3v2}. Conjunto de aristas encontradas {v5v1, v5v3}. Aadimos las aristas encontradas a la lista de aristas de la primera componente conexa obteniendo las aristas del primer bloque. Bloque 1 {v1v2, v1v3, v3v2, v5v1, v5v3}. El resto de componentes conexas nos las saltamos, pues no tienen aristas que procesar.
PASO 6
Finalmente aadimos las aristas puente como bloque del grafo. Bloque 2 {v4v5}. Bloque 3 {v5v6}.
Bloque 1 {v1v2, v1v3, v3v2, v5v1, v5v3}. Bloque 2 {v4v5}. Bloque 3 {v5v6}.
83 de 248
PASO 1.
84 de 248
Eliminamos el vrtice de corte y guardamos las aristas eliminadas {v2v3, v2v5, v1v2, v4v2, v3v6, v3v7}.
PASO 3.
85 de 248
Restauramos los vrtices de corte junto con las aristas eliminadas {v2v3, v2v5, v1v2, v4v2, v3v6, v3v7} y eliminamos las aristas puente.
PASO 5.
Comprobamos si en el grafo existe alguna arista formada por algn vrtice de corte y algn vrtice de las aristas de la componente conexa. Este proceso se realiza para cada una de las componentes conexas. Componentes conexas {{v1v5, v5v4}, {v6v7}}. Primera componente conexa {v1v5, v5v4}. Conjunto de aristas encontradas {v2v5, v1v2, v4v2} Con el vrtice v3 no se encontr ninguna arista. Aadimos las aristas encontradas a la lista de aristas de la primera componente conexa obteniendo las aristas del primer bloque. Bloque 1 {v1v5, v5v4, v2v5, v1v2, v4v2}.
86 de 248
Manual de algortmica Segunda componente conexa {v6v7}. Conjunto de aristas encontradas {v3v6, v3v7}. Con el vrtice v2 no se encontr ninguna arista. Aadimos las aristas encontradas a la lista de aristas de la segunda componente conexa obteniendo las aristas del segundo bloque. Bloque 2 {v6v7, v3v6, v3v7}. PASO 6
Finalmente aadimos las aristas puente como bloque del grafo. Bloque 3 {v2v3}.
Bloque 1 {v1v5, v5v4, v2v5, v1v2, v4v2}. Bloque 2 {v6v7, v3v6, v3v7}. Bloque 3 {v2v3}.
87 de 248
Manual de algortmica
El algoritmo de recorrido en profundidad, en ingls depth-first search y que denotaremos DFS para abreviar, permite obtener un rbol recubridor del grafo original. Si G es un grafo un grafo conexo, el algoritmo de bsqueda en profundidad obtiene un rbol recubridor de G. Se trata de un grafo en el que aparecen todos los vrtices de G, pero no todas sus aristas. El rbol recubridor no es nico depende del vrtice de partida. El algoritmo puede implementarse mediante una pila, de tal forma que el vrtice activo o a partir del cual se expande el rbol siempre se encuentra en la cima de la pila. En cada paso se introduce en la pila unos de los vrtices adyacentes al vrtice activo, aadindose al rbol recubridor la arista que une el vrtice activo con dicho adyacente. Puede ocurrir que el vrtice activo no posea adyacentes o que todos hayan sido visitados con anterioridad y an no se han visitados todos los vrtices del grafo, en tal caso el vrtice es retirado de la pila y continuamos con el proceso con el nuevo vrtice activo. El algoritmo termina cuando la pila est completamente vaca, lo que es equivalente a decir que todos los vrtices del grafo han sido visitados. Seguidamente detallaremos los pasos del algoritmo en un ejemplo.
Ejemplo
88 de 248
Manual de algortmica Aplicaremos el algoritmo de bsqueda en profundidad comenzando por el vrtice v1 Pila v1 v1 v2 v1 v2 v3 v1 v2 v3 v5 v1 v2 v3 v1 v2 v3 v6 v1 v2 v3 v6 v4 v1 v2 v3 v6 v1 v2 v3 v1 v2 v1 Pila vaca Vrtices v2 v3 v5 * v6 v4 * * * * * * Aristas v1 v2 v2 v3 v3 v5 * v3 v6 v6 v4 * * * * * * Visitados v1 v2 v1 v2 v3 v1 v2 v3 v5 v1 v2 v3 v5 v1 v2 v3 v5 v6 v1 v2 v3 v5 v6 v4
La columna de vrtices visitados puede ser til para no introducir en la pila vrtices considerados anteriormente. Adems afinando un poco mas y aprovechado el conjunto de vrtices visitados podemos para la ejecucin del algoritmo cuando dicho conjunto contenga todos los vrtices del grafo sin necesidad de vaciar la pila. Orden en el que se visitan los vrtices: v1, v2, v3, v5, v6 y v4. Puede observarse que el rbol recubridor construido depende del vrtice de partida y del orden en el que se visiten los adyacentes al vrtice activo. rbol recubridor obtenido:
89 de 248
Manual de algortmica
El algoritmo de recorrido en anchura, en ingls breadth-first search y que denotaremos BFS para abreviar, al igual que el algoritmo de bsqueda en profundidad permite obtener un rbol recubridor donde los vrtices son recorridos por niveles. Al igual que en el caso anterior, si el grafo es conexo se encuentra el rbol recubridor, el cual no es nico, depender del vrtice de partida el orden en que se visitan los vrtices adyacentes al vrtice activo. El algoritmo puede implementarse mediante una cola, de tal forma que el vrtice activo o a partir del cual se expande el rbol siempre se encuentra en la cabeza de la cola. En cada paso se introduce en la cola unos de los vrtices adyacentes al vrtice activo, aadindose al rbol recubridor la arista que une el vrtice activo con dicho adyacente. Los vrtices adyacentes son introducidos por el final de la cola de tal forma que el vrtice activo no cambia, hasta que este se queda sin adyacentes, en este momento el vrtice es extrado de la cola y se repite el proceso con el resto de vrtices, hasta que todos los vrtices del grafo han sido visitados. Seguidamente detallaremos los pasos del algoritmo en un ejemplo. Ejemplo
90 de 248
Manual de algortmica Aplicaremos el algoritmo de bsqueda en anchura comenzando por el vrtice v1. Cola v1 v2v1 v4 v2v1 v4 v2 v4 v2 v3v4 v2 v3v4 v3 v5 v3 v5 Cola vaca Vrtices v2 v4 v6 * v3 * * v5 * * * Aristas v1 v2 v1 v4 v1 v6 * v2v3 * * v3 v5 * * * Visitados v1 v2 v1 v2 v4 v1 v2 v4 v6 v1 v2 v4 v6 v1 v2 v4 v6 v3 v1 v2 v4 v6 v3 v1 v2 v4 v6 v3 v1 v2 v4 v6 v3 v5
La columna de vrtices visitados puede ser til para no introducir en la cola vrtices considerados anteriormente. Adems afinando un poco mas y aprovechado el conjunto de vrtices visitados podemos para la ejecucin del algoritmo cuando dicho conjunto contenga todos los vrtices del grafo sin necesidad de vaciar la cola. Orden en el que se visitan los vrtices: v1, v2, v4, v6, v3 y v5. Puede observarse que el rbol recubridor construido depende del vrtice de partida y del orden en el que se visiten los adyacentes al vrtice activo.
91 de 248
Manual de algortmica
Algoritmo de Boruvka.
El algoritmo de Boruvka obtiene un rbol recubridor mnimo en un grafo G ponderado y conexo (no se admiten ponderaciones negativas). El algoritmo de Boruvka consiste en elegir desde cada vrtice la arista de menor peso que sale de l, y as formar al inicio un conjunto de componentes de vrtices unidos por dichas aristas. A partir de entonces en cada paso se busca la arista de menor peso entre los vrtices de cada componente y un vrtice que no lo sea, es decir, cada componente se unir a otra distinta. El algoritmo termina cuando todos los vrtices del grafo pertenecen a la misma componente. A este algoritmo tambin se le denomina "el algoritmo de las burbujas". El grafo se cubre por una coleccin de burbujas y en cada paso cada burbuja se adhiere a su burbuja ms cercana. Aplicar Boruvka al siguiente grafo ponderado y conexo.
92 de 248
Elegimos de cada vrtice la arista de menor para formar un conjunto de componentes de vrtices.
93 de 248
Como el grafo ya es conexo el algoritmo termina. El peso del rbol recubridor es 16.
94 de 248
Paso 1
Elegimos de cada vrtice la arista de menor para formar un conjunto de componentes de vrtices.
95 de 248
96 de 248
Manual de algortmica
El grafo ya es conexo por lo que el algoritmo termina. El peso del rbol recubridor es 66.
97 de 248
Manual de algortmica
Algoritmo de Prim.
El algoritmo de Prim obtiene un rbol recubridor mnimo en un grafo G ponderado (no se admiten ponderaciones negativas) y conexo. La implementacin del algoritmo se ha realizado partiendo de un vrtice que puede proporcionar el usuario, aunque no es obligatorio. Adems sea cual sea el vrtice de partida el rbol recubridor siempre tendr el mismo peso mnimo. El algoritmo comienza con un vrtice y en cada interaccin aade al grafo una arista de peso mnimo la cual tiene como origen un vrtice perteneciente al rbol parcialmente construido y como destino un vrtice perteneciente al grafo G y que no formaba parte del rbol, de tal forma que no pueda insertarse ningn ciclo. Dicho proceso se lleva a cabo hasta que todos los vrtices de G han sido visitados. Veamos un ejemplo:
98 de 248
T0 = { v1}. T1 = T0 + {v1, v6}. T2 = T1 + {v1, v4}. T3 = T2 + {v4, v7}. T4 = T3 + { v4, v5}. T5 = T4 + { v3, v5}. T6 = T5 + { v2, v4}. T7 = T6 + { v5, v8}. Peso del rbol recubridor = 16.
99 de 248
Manual de algortmica
Algoritmo de Kruskal.
El algoritmo de Kruskal obtiene un rbol recubridor de peso mnimo en un grafo G ponderado (no se admiten ponderaciones negativas) y conexo. Si el grafo G no es conexo obtiene un bosque de peso mnimo. Como paso previo se realiza un preprocesamiento a las aristas del grafo ordenndolas de menor a mayor segn su ponderacin. En cada iteracin se aade una arista de peso mnimo que no forme ciclo con el rbol recubridor parcialmente construido. Dicho algoritmo se ha implementado mediante tcnicas de programacin dinmica haciendo uso de una tabla en la que se van realizando una serie de clculos previos para encontrar el rbol recubridor de peso mnimo. Para llevar a cabo la implementacin se ha usado una tabla bidimensional con la cual tiene un nmero de columnas igual al nmero de aristas del grafo ms uno y el nmero de columna igual al nmero de vrtices. Adems haremos uso de dos variables m y M para almacenar el valor de la componente de menor y mayor respectivamente. Para rellenar la tabla se debe siguientes los siguientes pasos. Paso 1 La primera fila se rellena con el nmero de fila correspondiente al vrtice en la matriz de adyacencias. El resto de filas se corresponden con las aristas ordenadas de menor a mayor peso. Paso 2 Ahora rellenaremos las filas correspondientes con las aristas. Sea una arista e1 que une los vrtice u y v. En la fila anterior obtenemos el valor correspondiente a la columna que indique u y v mediante la fila o columna correspondiente a la matriz de adyacencias del grafo. El valor mximo se almacena en M y el valor mnimo en m. Si ambos valores son distintos entonces la arista forma parte del rbol recubridor puesto que al aadirla no se introduce ningn ciclo.
100 de 248
Manual de algortmica A continuacin podemos rellenar la fila correspondiente a dicha arista teniendo en cuenta los valores calculados en la fila anterior. Para obtener los valores de la fila correspondientes a la arista copiamos los valores de la fila anterior excepto cuando el valor de la fila anterior sea igual a M en cuyo caso se machara con el valor de la componente de menor m. Este proceso se repite hasta que terminemos con todas las aristas del grafo.
Veamos un ejemplo:
101 de 248
Manual de algortmica M arista comp(v1) comp(v2) comp(v3) comp(v4) comp(v5) comp(v6) comp(v7) comp(v8) m 1 2 3 4 5 6 7 8 * * * e1={v1,v6} 1 2 3 4 5 1 7 8 1 6 e1 e2={v4,v5} 1 2 3 4 4 1 7 8 4 5 e2 e3={v4,v7} 1 2 3 4 4 1 4 8 4 7 e3 e4={v1,v4} 1 2 3 1 1 1 1 8 1 4 e4 1 2 1 1 1 1 1 8 1 3 e5 e5={v3,v5} e6={v4,v6} 1 2 1 1 1 1 1 8 * * * 1 2 1 1 1 1 1 8 * * * e7={v5,v7} e8={v2,v4} 1 1 1 1 1 1 1 8 1 2 e8 1 1 1 1 1 1 1 8 * * * e9={v6,v7} e10={v5,v8} 1 1 1 1 1 1 1 1 1 8 e10 arista rbol recubridor de peso mnimo obtenido. El peso del rbol recubridor es 16.
102 de 248
Manual de algortmica
3.6.- Prufer
Algoritmo de codificacin.
Una secuencia de Prfer de longitud n-2 para n2 es cualquier secuencia de enteros entre 1 y n, permitiendo repeticiones. El algoritmo de codificacin que se presenta aqu, parte de un rbol (grafo) para dar lugar a una secuencia de Prfer que lo determina unvocamente. Como observacin se puede comprobar que el grado de cada uno de los vrtices es uno ms que el nmero de veces que su etiqueta aparece en la secuencia de Prfer. El algoritmo recibe como entrada un rbol A de n vrtices y retorna una secuencia S de n-2 vrtices.
Implementacin: func codificacinPrufer (g: Grafo) dev(S: secuencia de vrtices) var a: entero prin S := <inicializar a vaca> // Nmero de aristas del grafo. a := g.obtenerNmeroAristas() mientras a-1 > 0 Encontrar un vrtice v de A de grado 1. Sea v-w la arista que incide en v. Introducir w en S. Eliminar la arista v-w del grafo. a := a-1
103 de 248
Manual de algortmica fmientras fin La bsqueda del vrtice de grado 1 (hoja) se realiza en la matriz de adyacencias del grafo comenzando de izquierda a derecha y de arriba abajo a partir de la fila correspondiente al vrtice v. Una vez que se encuentra la hoja w eliminamos arista formada por los vrtices v-w para no volver a tenerla en cuenta. Para determinar si un vrtice es hoja sumamos la fila correspondiente a dicho vrtice, si el valor de la suma es 1 se trata de una hoja.
104 de 248
Manual de algortmica La primera hoja encontrada es el vrtice v3 y v3-v1 es la arista que incide en v3. Eliminamos dicha arista y aadimos v1 a la secuencia. S = {v1}. v1 0 1 1 v2 1 0 1 1 v3 0 v4 0 v5 1 0 v6 1 0 v7 1 0
v1 v2 v3 v4 v5 v6 v7
105 de 248
Manual de algortmica La primera hoja encontrada es el vrtice v4 y v4-v2 es la arista que incide en v4. Eliminamos dicha arista y aadimos v2 a la secuencia. S = {v1, v2}.
v1 v2 v3 v4 v5 v6 v7
v1 v2 0 1 1 0 1 1 1 1
v3 0
v4 1 0
v5 1 0
v6 1 0
v7 1 0
106 de 248
Manual de algortmica La primera hoja encontrada es el vrtice v5 y v5-v1 es la arista que incide en v5. Eliminamos dicha arista y aadimos v1 a la secuencia. S = {v1, v2, v1}.
v1 v2 v3 v4 v5 v6 v7
v1 0 1
v2 1 0 1 1
v3 0
v4 0
v5 0
v6 1 0
v7 1 0
107 de 248
Manual de algortmica La primera hoja encontrada es el vrtice v6 y v6-v2 es la arista que incide en v6. Eliminamos dicha arista y aadimos v2 a la secuencia. S = {v1, v2, v1, v2}.
v1 v2 v3 v4 v5 v6 v7
v1 0 1
v2 1 0 1
v3 0
v4 0
v5 0
v6 0
v7 1 0
108 de 248
Manual de algortmica La primera hoja encontrada es el vrtice v7 y v7-v2 es la arista que incide en v7. Eliminamos dicha arista y aadimos v2 a la secuencia. S = {v1, v2, v1, v2, v2}.
v1 v2 v3 v4 v5 v6 v7
v1 0 1
v2 1 0
v3 0
v4 0
v5 0
v6 0
v7 0
Como el tamao de la secuencia es n-2 el algoritmo termina, siendo n el nmero de vrtices del rbol el algoritmo termina.
109 de 248
Manual de algortmica
Algoritmo de decodificacin.
El procedimiento de decodificacin siguiente convierte una secuencia de Prfer en su correspondiente rbol. Tn Este procedimiento de decodificacin establece una funcin fd: Pn-2 que hace corresponder a un conjunto de secuencias de Prfer de longitud n-2 un conjunto de rboles de n vrtices. El algoritmo recibe como entrada el nmero de vrtices n que debe tener el rbol a generar y una secuencia S de n-2 vrtices. Los vrtices de la secuencia forman parte del rbol y pueden estar repetidos. A partir de la secuencia proporcionada se genera un rbol. El algoritmo podemos dividirlo en X pasos.
PASO 1
PASO 2
2.1.- Calcular el conjunto de vrtices que no forma parte de la secuencia NS. 2.2.- Calcular el conjunto de vrtices ocupados VO. 2.3.- Obtener la diferencia entre ambos conjuntos NS VO.
PASO 3
Si la secuencia es vaca insertamos una arista formada por los dos vrtices incluidos en NS VO y FIN. En otro caso insertamos la arista que tiene como origen el primer vrtice de la secuencia y como destino el primer vrtice de la diferencia NS VO. Seguidamente eliminar el primer vrtice de la secuencia y volver al PASO 2.
110 de 248
Manual de algortmica
111 de 248
PASO 1
Sea G el grafo:
112 de 248
Secuencia
PASO 3.1
Como la secuencia no est vaca formamos una arista que posee como origen el primer vrtice de la secuencia y como destino el primer vrtice de la diferencia entre NS y VO. Calculamos la diferencia entre NS y VO. NS VO = {v3, v5, v7}. Insertamos en G la nueva arista secuencia. v1-v3 y eliminamos v1 de la
113 de 248
Manual de algortmica
PASO 2.2
Secuencia
Como la secuencia no est vaca formamos una arista que posee como origen el primer vrtice de la secuencia y como destino el primer vrtice de la diferencia entre NS y VO. Calculamos la diferencia entre NS y VO. NS VO = {v1, v5, v7}. Insertamos en G la nueva arista secuencia. v2-v1 y eliminamos v2 de la
114 de 248
Manual de algortmica
115 de 248
Manual de algortmica
PASO 2.3
Secuencia
Vrtices no incluidos en la secuencia NS = {v1, v3, v5, v7}. Vrtices ocupados VO = {v1, v3}. PASO 3.3
Como la secuencia no est vaca formamos una arista que posee como origen el primer vrtice de la secuencia y como destino el primer vrtice de la diferencia entre NS y VO. Calculamos la diferencia entre NS y VO. NS VO = {v5, v7}. Insertamos en G la nueva arista secuencia. v4-v5 y eliminamos v4 de la
116 de 248
Secuencia
S = {v6, v2}.
Vrtices no incluidos en la secuencia NS = {v1, v3, v4, v5, v7}. Vrtices ocupados VO = {v1, v3, v5}. PASO 3.4
Como la secuencia no est vaca formamos una arista que posee como origen el primer vrtice de la secuencia y como destino el primer vrtice de la diferencia entre NS y VO. Calculamos la diferencia entre NS y VO. NS VO = {v4, v7}. Insertamos en G la nueva arista secuencia. v6-v4 y eliminamos v6 de la
117 de 248
Secuencia
S = {v2}.
Vrtices no incluidos en la secuencia NS = {v1, v3, v4, v5, v6, v7}. Vrtices ocupados VO = {v1, v3, v4, v5}. PASO 3.5
Como la secuencia no est vaca formamos una arista que posee como origen el primer vrtice de la secuencia y como destino el primer vrtice de la diferencia entre NS y VO. Calculamos la diferencia entre NS y VO. NS VO = {v6, v7}. Insertamos en G la nueva arista secuencia. v2-v6 y eliminamos v2 de la
118 de 248
Secuencia
S = {}.
Vrtices no incluidos en la secuencia NS = {v1, v2, v3, v4, v5, v6, v7}. Vrtices ocupados VO = {v1, v3, v4, v5, v6}. PASO 3.6
Como la secuencia est vaca solo nos falta insertar una arista. Los vrtices que forman parte de la misma se obtienen calculando la diferencia entre NS y VO. Calculamos la diferencia entre NS y VO. NS VO = {v2, v7}. Insertamos en G la nueva arista v2-v7 y FIN.
119 de 248
Manual de algortmica
120 de 248
Manual de algortmica
La implementacin del algoritmo trata de buscar un emparejamiento mediante un camino alternado. Se denomina camino alternado de G con respecto a M a un camino de G cuyas aristas son alternativamente emparejadas y no emparejada. En cada paso se escoge un vrtice no emparejado y busca un camino alternado aumentante mediante BFS. En el camino no pueden a parecer vrtices repetidos. Dicho camino deja de expandirse en cuanto encontremos un vrtice de G que no haya sido emparejado. Repetimos este proceso para el resto de vrtice del grafo. Al final obtendremos un emparejamiento maximal que puede ser completo si todos los vrtices del grafo han sido emparejados. Veamos un ejemplo:
121 de 248
Manual de algortmica
122 de 248
Manual de algortmica Comenzamos por el vrtice v1 formado por las aristas. y construimos el camino alternado
123 de 248
Manual de algortmica
124 de 248
Para el vrtice v5 = {{v5, v9}, {v4, v6}, {v1, v7}, {v2, v8}, {v3, v10}}
125 de 248
Manual de algortmica
126 de 248
127 de 248
Manual de algortmica
Algoritmo de Kuhn-Munkres
Se trata de un algoritmo de emparejamiento de peso mximo para grafos ponderados, bipartitos y completos. Los grafos bipartitos completos km,n, son grafos de (n + m) vrtices y (m * n) aristas que admiten una particin de sus vrtices en sendos conjuntos V y U de m y n vrtices respectivamente, de manera que cada uno de los m vrtices de V es adyacente a todos y cada uno de los n vrtices de U. Se denominan bipartitos completos porque no se pueden aadir arista alguna sin que deje de ser bipartito. Otro concepto importante es el de matriz de pesos del grafo. Se trata de una matriz que posee tantas filas y columnas como elementos tiene los conjuntos X e Y respectivamente. Cada posicin de la matriz almacena la ponderacin de una arita cuyo origen pertenece al conjunto X y el destino al conjunto Y. Ahora explicaremos de forma detallada los cuatro pasos en los que hemos dividido el algoritmo.
PASO 1
P.1.1.- Identificar los conjuntos V y U de vrtices. P.1.2.- Obtener la matriz de pesos del grafo MatrizPesos. Sean i y j los ndices para iterar por la matriz de pesos del grafo. P.1.3.- Consideremos las tuplas L(vi) y L(uj) con un tamao igual al nmero de vrtices que forman parte del conjunto V y U respectivamente. Inicializamos las tuplas con un etiquetado viable L(vi) se inicializa con el mximo de la fila correspondiente al vrtice vi en MatrizPesos[i, j] con (j <= | V |) (cardinal de V). L(uj) se inicializa a cero para todo uj.
128 de 248
Seguidamente construimos un grafo que verifique la expresin: L(uj) + L(vi) = MatrizPesos[i, j]. var G: Grafo. I, j: enteros prin G := <inicializamos el grafo> // Iteramos sobre la matriz de pesos del grafo, si se cumple la expresin // incluimos la arista al grafo g con la ponderacin correspondiente. desde i := 0 hasta | V | desde j := 0 hasta | U | si L(uj) + L(vi) = MatrizPesos[i, j] G.aadirArista(u, v, MatrizPesos[i, j]) fsi fdesde fdesde fin
PASO 3
P.3.1.- Buscamos un emparejamiento mximo M en el grafo G con el algoritmo de emparejamiento maximal simple. P.3.2.- Si cada vrtice de V est emparejado con respecto a M, entonces retorna M y FIN.
129 de 248
A continuacin cambiamos las etiquetas de los conjuntos L(vi) y L(uj). Sea V(T) los vrtices del el primer camino alternado enraizado en un vrtice no emparejado del conjunto V que no puede ser extendido ms en G. P.4.1.- Para ello obtenemos los siguientes conjuntos. I = V V(T). D = U V(T).
P.4.2.- Calculamos el valor que minimiza la expresin: L(vi) + L(uj) MatrizPesos[i, j] con vi y ui pertenecientes a los conjuntos I y D respectivamente.
P.4.3.- Finalmente cambiamos el etiquetado. Para cada vrtice vi perteneciente a la interseccin restamos el valor del mnimo en L(vi). Para cada vrtice ui no perteneciente a la diferencia sumamos el valor del mnimo en L(ui). Volvemos al PASO 2.
130 de 248
PASO 1 Identificamos los conjuntos U y V. U = {u1, u2, u3, u4, u5}. V = {v1, v2, v3, v4, v5}. Matriz de pesos del grafo, L(vi) y L(uj)
V/U v1 v2 v3 v4 v5 L(uj)
u1 5 0 2 2 6 0
u2 1 1 5 2 2 0
u3 1 3 4 3 0 0
u4 3 3 3 4 0 0
u5 2 4 0 4 1 0
L(vi) 5 4 5 4 6
131 de 248
Construimos un grafo G2.1 que verifique la expresin L(uj) + Lv(vi) = MatrizPesos[i, j].
132 de 248
Como no se ha conseguido un emparejamiento mximo para los vrtices del conjunto V cambiamos el etiquetado.
133 de 248
v5 es el primer vrtice no emparejado perteneciente a V. V(T) es el conjunto de vrtices del rbol alternado enraizado en v5 que no puede ser extendido ms. V(T) = {v5, v1, u1}. Calculamos los siguientes conjuntos. V V(T) = {v5, v1}. V V(T) = {u2, u3, u4, u5}. Minimizamos la expresin L(uj) + L(vi) MatrizPesos[i, j] para los vrtices que forman parte de los conjuntos I y D. L(v5) + L(u2) - 2 = 4. L(v5) + L(u3) - 0 = 6. L(v5) + L(u4) - 0 = 6. L(v5) + L(u5) - 1 = 5. L(v1) + L(u2) - 1 = 4. L(v1) + L(u3) - 1 = 4. L(v1) + L(u4) - 3 = 2. L(v1) + L(u5) - 2 = 3. El mnimo es 2. Ahora restamos el valor del mnimo a los vrtices que forman parte del conjunto I en L(vi) y sumamos el valor del mnimo a los vrtices que no forman parte del conjunto D en L(uj). Y volvemos al paso 2 V/U v1 v2 v3 v4 v5 u1 5 0 2 2 6 u2 1 1 5 2 2 u3 1 3 4 3 0 u4 3 3 3 4 0 u5 2 4 0 4 1 L(vi) 3 4 5 4 4
134 de 248
135 de 248
Construimos un grafo G2.2 que verifique la expresin L(uj) + Lv(vi) = MatrizPesos[i, j].
Como no se ha conseguido un emparejamiento mximo para los vrtices del conjunto V cambiamos el etiquetado.
136 de 248
137 de 248
v5 es el primer vrtice no emparejado perteneciente a V. V(T) es el conjunto de vrtices del rbol alternado enraizado en v5 que no puede ser extendido ms. V(T) = {v5, v1, u1, v4, u4, v2, u5}. Calculamos los siguientes conjuntos. V V(T) = {v5, v1, v4, v2}. V V(T) = {u2, u3}. Minimizamos la expresin L(uj) + L(vi) MatrizPesos[i, j] para los vrtices que forman parte de los conjuntos I y D. L(v5) + L(u2) - 2 = 4. L(v5) + L(u3) - 0 = 4. L(v1) + L(u2) - 1 = 2. L(v1) + L(u3) - 1 = 2. L(v4) + L(u2) - 2 = 2. L(v4) + L(u3) - 3 = 1. L(v2) + L(u2) - 1 = 3. L(v2) + L(u3) - 3 = 1. El mnimo es 1. Ahora restamos el valor del mnimo a los vrtices que forman parte del conjunto I en L(vi) y sumamos el valor del mnimo a los vrtices que no forman parte del conjunto D en L(uj). Y volvemos al paso 2 V/U v1 v2 v3 v4 v5 u1 5 0 2 2 6 u2 1 1 5 2 2 u3 1 3 4 3 0 u4 3 3 3 4 0 u5 2 4 0 4 1 L(vi) 2 3 5 3 3
138 de 248
139 de 248
Construimos un grafo G2.3 que verifique la expresin L(uj) + Lv(vi) = MatrizPesos[i, j].
140 de 248
Como todos los vrtices del conjunto V estn emparejados el algoritmo termina. El peso del emparejamiento es 21.
141 de 248
Manual de algortmica
El algoritmo de Kuhn-Munkres se utiliza para obtener un emparejamiento de peso mximo en un grafo bipartito, ponderado y completo. Tambin podemos usarlo para obtener el emparejamiento de peso mnimo aunque previamente es necesario realizar un preprocesamiento a las ponderaciones de las aristas del grafo. El preprocesamiento cambia las ponderaciones de las aristas manteniendo la relacin de orden, pero las aristas que antes eran mnimas ahora son mximas por lo que bastara aplicar el algoritmo de Kuhn-Munkres y deshacer los cambios en las ponderaciones de las aristas para obtener el emparejamiento de peso mnimo.
PREPROCESAMIENTO.
142 de 248
Realizar el preprocesamiento. La arista v5u1 es la que posee mayor ponderacin en el grafo. Su peso es 6.
143 de 248
A continuacin aplicaremos el algoritmo de Kuhn-Munkres obteniendo un emparejamiento de peso mximo que nos dar las aristas de peso mnimo cuando deshagamos los cambios realizados en el preprocesamiento. Aristas del emparejamiento de peso mximo: Arista (v1, u3, 5). Arista (v2, u1, 6). Arista (v3, u5, 6). Arista (v4, u2, 4). Arista (v5, u4, 6). El peso del emparejamiento es 27.
144 de 248
Manual de algortmica Deshacemos los cambios en las ponderaciones obteniendo el peso original de las aristas. Aristas del emparejamiento de peso mnimo: Arista (v1, u3, 1). Arista (v2, u1, 0). Arista (v3, u5, 0). Arista (v4, u2, 2). Arista (v5, u4, 0). El peso del emparejamiento es 3.
145 de 248
Manual de algortmica
El problema de bsquedas de emparejamientos mximo de peso ptimo (mximo o mnimo) es un problema NP-completo. Aunque existen mtodos aproximados se ha optado por un algoritmo de bsqueda exhaustiva, implementado mediante la tcnica de backtracing. El esquema que implementa el backtracing:
proc btptimo(x: Etapa) var xsig: Etapa cand: Candidatos prin si (esSolucin(x)) si (esMejor()) actualizaSolucin() fsi fsi xsig := nuevaEtapa(x) cand := calculaCandidatos(x) mientras (quedanCandidatos(cand)) seleccionaCandidato(cand, xsig); si (esPrometedor(cand, xsig)) anotaSolucin(cand, xsig); btOptimo(xsig); cancelaAnotacin(cand, xsig); fsi fmientras fin
A continuacin comentaremos algunas caractersticas del problema que se pretende resolver y detallaremos cada uno de los mtodos y clases que hacen posible la bsqueda del emparejamiento de peso ptimo.
146 de 248
Manual de algortmica Comenzaremos por la Clase Solucin Clase Solucin // Atributos emparejamientos: Array[][] de enteros. /// Almacena el peso del emparejamiento. pesoEmparejamiento: real /// Nmero de vrtices emparejados. numVrticesEmparejados: entero fclase La matriz emparejamientos se inicializa con 0 excepto la diagonal principal y posiciones en las que o existe aritas que se inicializa con infinito o menos infinito dependiendo si el emparejamiento buscado es de peso mnimo o mximo respectivamente. Adems a lo largo de la ejecucin almacena las parejas encontradas a las cuales les asignan un nmero que hace referencia al orden en el que se han encontrado. La profundidad al que se encuentra la solucin que viene determinada por el nmero mximo de vrtices que pueden ser emparejados, pero determinar esto en un grafo no es trivial, por ello en cada etapa marcamos la fila y columna de los vrtices emparejados con el valor de la etapa para que no vuelvan a ser considerados y saber cuando terminamos el proceso de bsqueda de parejas. Dicho proceso finaliza cuando la matriz emparejamientos no contiene ningn 0. Esto se comprueba en el mtodo esSolucin. Adems si emparejamiento buscado es de peso mnimo puede aplicarse una poda al rbol de expansin si hemos encontrado previamente una posible solucin. La poda de una rama se produce si el peso del emparejamiento encontrado es menor o igual que el peso del emparejamiento parcialmente construido. En dicho caso la rama no es examinada. Si por el contrario el emparejamiento buscado es de peso mximo ser necesario expandir el rbol completo, pues no es posible aplicar ninguna poda. Por otra parte como se trata de un problema de optimizacin una solucin se considera mejor otra, si existe un mayor nmero de vrtices emparejados o si el nmero de vrtices emparejados es igual en ambas soluciones se comprueba el peso y en funcin del tipo de emparejamiento se escoge la solucin de mayor o menor peso. Esta comprobacin se realiza en el mtodo esMejor. Cada vez que encontremos una solucin mejor
147 de 248
Manual de algortmica actualizaremos la solucin obtenida hasta el momento, lo cual se realiza en el mtodo actualizaSolucin.
Clase Candidatos Clase Candidatos // Atributos vrticesSinPareja: Array[] de enteros; // ndice para iterar sobre el array de candidatos. i: entero fila: entero fclase
En el array vrticesSinPareja almacenamos las columnas de los vrtices que an no tienen parejas. El atributo fila indica la fila en la matriz de adyacencias donde se encontraron los vrtices candidatos. Los candidatos de una etapa son las columnas de los vrtices an no emparejados escogidos de la primera fila de la matriz emparejamientos en la que aparece un 0.
Clase Etapa // Atributos // Profundidad del rbol de expansin k: entero // Candidato actualmente procesado. i: entero fclase
148 de 248
Manual de algortmica Ahora detallaremos los atributos de la clase que da cuerpo a cada uno de los mtodos del esquema.
Clase EmparejamientoMaximalPesoOptimoBacktracking // Atributos // Matriz de adyacencias del grafo. adyacencias: Array[][] de real tipoEmparejamineto: Lgico // Fila del vrtice sin pareja. fila: entero // Columna del vrtice sin pareja columna: entero // Almacena las soluciones parciales encontradas sol: Solucin // Almacena la solucin ptima encontrada. solptima: Solucin fclase El atributo tipoEmparejamiento informa del tipo de emparejamiento buscado por el usuario. Si su valor es cierto buscamos un emparejamiento de peso mximo, en otro caso de peso mnimo. Por ltimo comentar algunos detalles del resto de mtodos del esquema. En el mtodo nuevaEtapa tan solo incrementamos el valor de la etapa actual. En quedanCandidatos se comprueba si el atributo i utilizado para iterar sobre el array verticesSinpareja que almacena los candidatos ha llegado al final del array. En selecionaCandidato actualizamos los atributos fila y columna del vrtice no emparejado. Adems se incrementa el ndice del candidato usado para iterar sobre el array que almacena los vrtices sin pareja y asignamos dicho valor al atributo que indica en la etapa el candidato que se esta procesando actualmente. En anotaSolucin se marca la fila y columna de los vrtices emparejados con el valor -k de la etapa. Por otra parte posicin de la matriz 2
149 de 248
Manual de algortmica emparejamientos correspondiente al emparejamiento se marca con el valor k de la etapa indicando el orden en el que se ha encontrado la pareja. Tambin incrementamos en dos el nmero de vrtices emparejados y actualizamos el peso del emparejamiento parcialmente construido con el peso de la nueva arista considerada. Finalmente en cancelaAnotacin decrementamos el valor k y restauramos el valor del candidato actualmente de la etapa. Adems se restaura el valor de la fila y columna, se desmarcan la fila y columnas de los ltimos vrtices emparejados. Tambin restauramos el valor del peso del emparejamiento y vrtice emparejados con el valor que tenan antes de considerar la nueva pareja. En definitiva las tpicas operaciones que deben aparecer en toda vuelta atrs. A continuacin veremos un par de ejemplos donde encontrar el emparejamiento ptimo es trivial, pero son tiles para visualizar el rbol de expansin generado. Adems a la hora de mostrar los candidatos pondremos los propios vrtices en vez de la posicin que estos ocupan en la matriz de adyacencias. Emparejamiento mximo de peso mximo.
150 de 248
Manual de algortmica
k=0
k=1
v1 v2 v3 v4
v1 -1 -1 -1
v2 1 -1 -1
v3 -1 -1 0
v4 -1 -1 0
v1 v2 v3 v4
v1 -1 -1 -1
v2 -1 -1 0
v3 1 -1 -1
v4 -1 0 -1
v1 v2 v3 v4
v1 -1 -1 -1
v2 -1 0 -1
v3 -1 0 -1
v4 1 -1 -1
{v4} peso = 2
{v4} peso = 10
{v3} peso = 4
k=2
v1 v2 v3 v4
v1 -1 -1 -1
v2 1 -1 -1
v3 -1 -1 -2
v4 -1 -1 2
v1 v2 v3 v4
v1 -1 -1 -1
v2 -1 -1 -2
v3 1 -1 -1
v4 -1 2 -1
v1 v2 v3 v4
v1 -1 -1 -1
v2 -1 -2 -1
v3 -1 2 -1
v4 1 -1 -1
peso = 5
peso = 14
peso = 9
El emparejamiento ptimo de peso mximo es 14. En este caso ha sido necesario expandir todo el rbol para obtener el emparejamiento de peso mximo con el mayor nmero de vrtices. Aristas del emparejamiento: Arista (v1, v3, 10) Arista (v2, v4, 4)
151 de 248
k=0
k=1
v1 v2 v3 v4
v1 -1 -1 -1
v2 1 -1 -1
v3 -1 -1 0
v4 -1 -1 0
v1 v2 v3 v4
v1 -1 -1 -1
v2 -1 -1 0
v3 1 -1 -1
v4 -1 0 -1
v1 v2 v3 v4
v1 -1 -1 -1
v2 -1 0 -1
v3 -1 0 -1
v4 1 -1 -1
{v4} peso = 2
{v4} peso = 10
{v3} peso = 4
k=2
v1 v2 v3 v4
v1 -1 -1 -1
v2 1 -1 -1
v3 -1 -1 -2
v4 -1 -1 2
v1 v2 v3 v4
v1 -1 -1 -1
v2 -1 -2 -1
v3 -1 2 -1
v4 1 -1 -1
peso = 5
peso = 9
El emparejamiento ptimo de peso mnimo es 5. En este caso no ha sido necesario expandir todo el rbol pues ya tenamos una solucin cuyo peso es 5 y por la segunda rama el emparejamiento parcialmente construido tiene peso 10 por lo que no es posible mejorar el emparejamiento encontrado inicialmente. Aristas del emparejamiento: Arista (v1, v2, 2)
152 de 248
153 de 248
Manual de algortmica Seguidamente un par de ejemplos para grafos con un mayor nmero de vrtices y aritas. Ejemplo 1.
Arista (v1, u4, 3). Arista (v2, u3, 3). Arista (v3, u2, 5). Arista (v4, u5, 4). Arista (v5, u1, 6). El peso del emparejamiento es 21.
154 de 248
Arista (v1, u3, 1). Arista (v2, u1, 0). Arista (v3, u5, 0). Arista (v4, u2, 2). Arista (v5, u4, 0). El peso del emparejamiento es 3.
Ejemplo 2.
Arista (v1, v5, 4). Arista (v2, v6, 1). El peso del emparejamiento es 5.
155 de 248
Manual de algortmica
Arista (v1, v4, 2). Arista (v2, v5, -1). El peso del emparejamiento es 1.
156 de 248
Manual de algortmica
3.8.- Euler
Es euleriano ?.
Un grafo simple conexo es euleriano si y solo si todos los vrtices tienen valencia par. Si el grafo es dirigido y el grado de entrada y salida de cada vrtice de es igual entonces es euleriano. La implementacin del algoritmo hace distincin entre grafos simples y dirigidos. Si se trata de un grafo simple se suma las filas de la matriz de adyacencias para cada vrtice y si todos tienen valencia par entonces el grafo es euleriano. En caso contrario el grafo no es euleriano. Si el grafo es dirigido se calcula el grado de entrada sumado la fila y el grado de salida sumando la columna correspondiente al vrtice en la matriz de adyacencias del grafo. Si el grado de entrada y salida de todos los vrtices es igual entonces el grafo es euleriano.
A continuacin veremos dos ejemplos para cada tipo de grafo. Grafos simples. Ejemplo 1
157 de 248
Manual de algortmica
Vrtices grado v1 4 v2 4 v3 4 v4 2 v5 2 v6 2 v7 2 Como todos los vrtices son de valencia par el grafo es euleriano.
Ejemplo 2.
Vrtices grado v1 3 v2 4 v3 4 v4 2 v5 2 v6 1
158 de 248
159 de 248
Manual de algortmica A continuacin expondremos los ejemplos para los grafos dirigidos. Grafos dirigidos. Ejemplo 1
Vrtices Entrada Salida v1 2 2 2 2 v2 v3 2 2 v4 2 2 v5 3 3 v6 2 2 v7 1 1 Como todos los vrtices tienen el grado de salida igual al grado de entrada el grafo es euleriano.
160 de 248
Vrtices Entrada Salida v1 2 2 v2 2 1 v3 2 1 v4 2 2 1 1 v5 Como existen vrtices cuyo grado de salida es distinto al grado de entrada el grafo no es euleriano.
161 de 248
Manual de algortmica
Algoritmo de Fleury
El algoritmo de Fleury trata de buscar una trayectoria euleriana en un grafo conexo y en el que no existen ms de dos vrtices de grado impar. La implementacin del algoritmo se ha realizado mediante tcnicas de programacin dinmica combinada con voraz. La heurstica seguida para encontrar la trayectoria euleriana es la siguiente. Se comprueba que previamente que el grafo satisface las condiciones para que exista dicha trayectoria.
162 de 248
Manual de algortmica
Seguidamente no situamos en unos de los vrtices impares si existen o en caso contrario uno cualquiera de grado par. A continuacin de todos los vrtices adyacentes respecto al que estamos situados escogemos el primero segn orden existente en la matriz de adyacencias y al ser posible que no sea una arista puente salvo que no exista ninguna otra alternativa. Una vez seleccionada la arista, esta no vuelve a tenerse en cuenta por lo que es como si la hubiramos eliminado del grafo. Repetimos este proceso hasta recorrer todas las aristas del grafo, pudiendo repetir vrtices. Si el grafo es no dirigido la trayectoria se encuentra sin problemas, sin embargo en grafos dirigidos puede no encontrarse dicha trayectoria si el grafo posee ms de un vrtice impar. En este caso lo nico que podemos hacer es relanzar la bsqueda partiendo del otro vrtice impar. Veamos algunos ejemplos: Encontrar una trayectoria euleriana en el siguiente grafo no dirigido.
Vrtices Grado v1 2 2 v2 v3 3 v4 3 v5 2 v6 2
163 de 248
Manual de algortmica v7 2
Como posee dos vrtices impares y el grafo es no dirigido posee una trayectoria euleriana abierta. Los vrtices impares son v3 y v4. Comenzamos por el primer vrtice impar v3. v3 v1
v3
v1
v2
164 de 248
Manual de algortmica
165 de 248
Manual de algortmica v3 v1 v2 v3
v3
v1
v2
v3
v4
166 de 248
Manual de algortmica v3 v1 v2 v3 v4 v5
v3
v1
v2
v3
v4
v5
v6
167 de 248
Manual de algortmica v3 v1 v2 v3 v4 v5 v6 v7
v3
v1
v2
v3
v4
v5
v6
v7
v4.
168 de 248
Vrtices Entrada Salida v1 2 2 1 1 v2 v3 1 1 v4 2 2 v5 2 1 v6 0 1 El grafo no es euleriano pues existen vrtices con grado de entrada y salida distintos, concretamente v5 y v6. En este caso podemos intentar encontrar dicha trayectoria partiendo de algunos de los vrtices anteriores.
169 de 248
Manual de algortmica Los vrtices con grado de entrada distinto del grado de salida son v5 y v6. Comenzamos por el primer vrtice impar v5. v5 v4
v5
v4
v1
170 de 248
Manual de algortmica
v5
v4
v1
v2
v5
v4
v1
v2
v3
171 de 248
Manual de algortmica
v5
v4
v1
v2
v3
v4
172 de 248
Manual de algortmica
v5
v4
v1
v2
v3
v4
v2
173 de 248
Manual de algortmica v5 v4 v1 v2 v3 v4 v2 v5 .
En el siguiente paso nos damos cuenta que el vrtice v5 no posee ningn vrtice adyacente por lo que no se ha encontrado la trayectoria buscada pues no se han recorrido todas las aristas. En este caso lo nico que podemos hacer comenzar a construir la trayectoria desde el otro vrtice impar.
174 de 248
v6
v1
v2
175 de 248
Manual de algortmica
176 de 248
Manual de algortmica v6 v1 v2 v3
v6
v1
v2
v3
v4
177 de 248
Manual de algortmica
v6
v1
v2
v3
v4
v1
v6
v1
v2
v3
v4
v1
v5
178 de 248
Manual de algortmica
v6
v1
v2
v3
v4
v1
v5
v4
v6
v1
v2
v3
v4
v1
v5
v4
v2
179 de 248
Manual de algortmica
180 de 248
En este caso partiendo desde el otro vrtice impar es posible encontrar la trayectoria euleriana abierta pero puede ocurrir que dicha trayectoria no exista.
181 de 248
Manual de algortmica Veamos un ejemplo de grafo dirigido el que solo existen dos vrtices de grado impar pero no existe una trayectoria euleriana.
Vrtices Entrada Salida v1 0 2 v2 3 1 v3 1 1 v4 1 1 v5 1 1 En este caso no existe trayectoria euleriana pues es imposible visitar las aristas v1v2 y v1v5 si partimos del vrtice v2. Si por el contrario partiramos del vrtice v1 no podramos recorrer todas las que salen de dicho vrtice pues el grado de entrada es cero. Como conclusin podemos decir que en grafos dirigidos existe una trayectoria euleriana si el grado de entrada y salida de cada vrtice son iguales, en otro caso la trayectoria puede no existir. Seguidamente expondremos dos algoritmos encargados de buscar trayectorias eulerianas cerradas en cualquier tipo de grafos, pero con estrategias claramente distintas. Por ello en ambos se exige que los grafos cumplan ciertas restricciones. Si se trata de un grafo no dirigido todos los vrtices deben ser de grado par y si es no dirigido los grados de entrada y salida de cada vrtice deben ser idnticos para garantizar la existencia del ciclo euleriano. Teniendo claro lo anteriormente comentado pasaremos a explicar detalladamente las estrategias de ambos algoritmos.
182 de 248
Manual de algortmica
Algoritmo de Tucker.
Tras comprobar las condiciones que permiten la ejecucin del algoritmo se siguen dos estrategias segn el tipo de grafo. Si el grafo es no dirigido para cada vrtice cuyo grado es mayor que dos se duplica hasta conseguir que reducir su grado a dos, en caso de ser un grafo dirigido duplicamos aquellos vrtices cuyo grado de entrada o salida sean distintos de uno hasta reducirlos a ese valor. Al final del proceso tenemos una lista de vrtices duplicados y los respectivos vrtices con los que se identifica. Adems cabe mencionar que el nmero de aristas del grafo original se conserva, lo nico que pueden aumentar es el nmero de vrtices. Una vez concluido el proceso de duplicacin el grafo queda dividido en un conjunto de componentes conexas a partir de las cuales iremos reconstruyendo los ciclos a la misma vez que identificamos los vrtices duplicados con el vrtice resultado de la duplicacin para dejar el grafo como estaba originalmente. Para terminar de comprender el algoritmo veremos un par de ejemplos.
183 de 248
Los vrtices cuyo grado es mayor que dos son v1, v2 y v4. Estos vrtices sern duplicados hasta conseguir reducir el grado a dos para cada uno de ellos.
184 de 248
185 de 248
Manual de algortmica
186 de 248
Manual de algortmica Finalmente para que todos los vrtices posean grado 2 duplicamos el vrtice v4 dando el vrtice v15.
Tras el proceso de duplicacin el grafo queda dividido en un conjunto de componentes conexas concretamente cuatro y tenemos una lista de vrtices duplicados y el correspondiente vrtice con el que se identifica.
Vrtice duplicado Vrtice con el que se identifica v1 v13 v2 v14 v4 v15 Ahora reconstruiremos el grafo y la trayectoria euleriana cerrada identificando los vrtices duplicados. Si el grafo ha sido dividido en varias componentes conexas tomamos un vrtice de la lista de duplicados tal que el vrtice duplicado y el vrtice con el que se identifica estn en componentes conexas distintas comenzando por las primeras posiciones de la tabla anterior. Adems en ese caso en la primera iteracin reconstruiremos dos ciclos y los reensamblaremos por el final.
187 de 248
Manual de algortmica Si el grafo solo posee una componente conexa reconstruir la trayectoria es trivial, viene determinada por el propio grafo, bastar identificar los vrtices duplicados y al mismo tiempo actualizarlos en la trayectoria. En este caso escogemos el vrtice duplicado v4 y el vrtice resultado de la duplicacin v15. Reconstruimos los dos ciclos identificando el vrtice. Primer ciclo {v4-v7-v8-v9-v4}. Segundo ciclo {v4-v3-v1-v2-v4}. Identificamos el vrtice y reensamblamos los ciclos.
Ciclo reensamblado {v4-v7-v8-v9-v4-v3-v1-v2-v4}. Como el grafo an no es conexo escogemos de la lista de vrtices duplicados uno que no haya sido considerado y cuyo vrtice duplicado pertenezca a la trayectoria parcialmente construida para que sea ms fcil la concatenacin del nuevo ciclo. Por lo que escogemos el vrtice duplicado v2 y el vrtice resultado de la duplicacin v14
188 de 248
189 de 248
Reensamblamos el nuevo ciclo en la trayectoria parcialmente construida por el final. {v4-v7-v8-v9-v4-v3-v1-v2-v5-v6-v2-v4}. Finalmente escogemos el vrtice duplicado v1 y el vrtice resultado de la duplicacin v13. Construimos el ciclo identificando el vrtice {v1-v10-v11-v12-v1} Por ltimo identificamos los vrtices y reensamblamos el ciclo por el final en la trayectoria euleriana parcialmente construida obteniendo la trayectoria cerrada completa.
190 de 248
Manual de algortmica
191 de 248
Vrtices Grado v1 4 v2 2 v3 2 4 v4 v5 2 v6 2
Los vrtices cuyo grado es mayor que dos son v1 y v4. Estos vrtices sern duplicados hasta conseguir reducir el grado a dos para cada uno de ellos.
192 de 248
Para terminar de conseguir que todos los vrtices tengan grado 2 duplicaremos el vrtice v4 dando el vrtice v8.
193 de 248
Manual de algortmica Como el grafo ha sido dividido 2 componentes conexas tomamos un vrtice de la lista de duplicados tal que el vrtice duplicado y el vrtice con el que se identifica estn en componentes conexas distintas comenzando por las primeras posiciones la tabla anterior. Adems en ese caso en la primera iteracin reconstruiremos dos ciclos y los reensamblaremos por el final. En este caso escogemos el vrtice duplicado v4 y el vrtice resultado de la duplicacin v8. Reconstruimos los dos ciclos identificando el vrtice. Primer ciclo {v4-v1-v2-v3-v4}. Segundo ciclo {v4-v5-v7-v6-v4}. Identificamos el vrtice y reensamblamos los ciclos.
Ciclo reensamblado {v4-v1-v2-v3-v4-v5-v7-v6-v4}. El grafo ya es conexo por lo que solo nos queda identificar el resto de vrtices si existen para obtener la trayectoria euleriana cerrada.
194 de 248
Manual de algortmica Identificamos el ltimo vrtice duplicado que nos queda v1 con v7.
195 de 248
Vrtices Entrada Salida v1 3 3 v2 1 1 1 1 v3 v4 1 1 v5 2 2 v6 1 1 v7 1 1 1 1 v8 v9 1 1 Como se trata de un grafo dirigido debemos conseguir que todos los vrtices tengan grado de entrada y salida igual a 1, por lo que duplicaremos los vrtices v1 y v5.
196 de 248
197 de 248
Una vez que los grados de entrada y salida de todos los vrtices son iguales a 1 comenzamos el proceso reconstruccin de la trayectoria euleriana cerrada e identificacin de vrtices para dejar el grafo como estaba originalmente.
Vrtice duplicado Vrtice con el que se identifica v1 v10 v1 v11 v5 v12 Como es la primera iteracin reconstruiremos dos ciclos. Buscamos un vrtice duplicado y vrtice con el que se identifica de tal forma que pertenezcan a componentes conexas distintas. En este caso escogemos comenzando por las primeras posiciones de la tabla el vrtice duplicado v1 y el vrtice resultado de la duplicacin v1. Reconstruimos los dos ciclos identificando el vrtice. Primer ciclo {v1-v2-v3-v1}. Segundo ciclo {v1-v9-v1}.
198 de 248
Ciclo reensamblado {v1-v2-v3-v1-v9-v1}. Como el grafo an no es conexo escogemos de la lista de vrtices duplicados uno que no haya sido considerado y cuyo vrtice duplicado pertenezca a la trayectoria parcialmente construida para que sea ms fcil la concatenacin del nuevo ciclo. Por lo que escogemos el vrtice duplicado v1 y el vrtice resultado de la duplicacin v11. Construimos el ciclo identificando el vrtice {v1-v4-v12-v6-v7-v5-v8-v1}. Identificamos el vrtice.
199 de 248
Manual de algortmica
Reensamblamos los ciclos {v1-v2-v3-v1-v9-v1-v4-v12-v6-v7-v5-v8-v1}. Como el grafo ya es conexo tan solo nos falta identificar el resto de vrtices duplicados. Finalmente identificamos el vrtice duplicado v5 y el vrtice resultado de la duplicacin v12 y obtenemos la trayectoria euleriana cerrada.
200 de 248
Manual de algortmica
Algoritmo de Hierholzer.
Tras comprobar las condiciones que permiten la ejecucin del algoritmo, seguimos la siguiente estrategia independientemente del tipo de grafo. Nos situamos en un vrtice cualquiera y construimos un ciclo. Si todas las aristas del grafo han sido visitadas tenemos la trayectoria euleriana en otro caso partimos de un vrtice que forme parte de la trayectoria euleriana parcialmente construida y que an le queden adyacentes por considerar. Partiendo de este vrtice construimos otro ciclo y lo reensamblamos con el obtenido anteriormente comenzando por el principio de la lista que almacena la trayectoria euleriana. Para construir el ciclo basta coger en cada iteracin un adyacente del vrtice en el cual nos encontramos. El vrtice actual en cada iteracin es el adyacente obtenido. Dicho proceso se repetir hasta llegar al vrtice de partida. Este proceso se realiza hasta que todas las aritas del grafo hayan sido visitadas. Veamos algunos ejemplos para terminar de comprender el algoritmo.
201 de 248
Manual de algortmica
202 de 248
Manual de algortmica El primer ciclo podemos construirlo partiendo de cualquier vrtice del grafo, por ejemplo v5. Obtenemos el ciclo {v5-v2-v1-v3-v4-v2-v6-v5}. A continuacin obtenemos otro ciclo partiendo de un vrtice perteneciente al ciclo anteriormente encontrado para que sea ms fcil la concatenacin de ambos. Partimos del vrtice v1 y obtenemos el ciclo {v1-v10-v11-v12-v1}. Ahora reensamblamos los ciclos: {v5-v2-v1-v10-v11-v12-v1-v3-v4-v2-v6-v5}. Como an no se han recorrido todas las aristas del grafo obtendremos otro ciclo partiendo de un vrtice contenido en los ciclos concatenados con anterioridad. Por lo que podemos partir del vrtice v4, obteniendo el ciclo {v4-v7-v8-v9-v4}. Ahora concatenamos los ciclos y obtenemos la trayectoria euleriana cerrada. {v5-v2-v1-v10-v11-v12-v1-v3-v4-v7-v8-v9-v4-v2-v6-v5}.
203 de 248
El primer ciclo podemos construirlo partiendo de cualquier vrtice del grafo, por ejemplo v3. Obtenemos el ciclo {v3-v1-v2-v3}. A continuacin obtenemos otro ciclo partiendo de un vrtice perteneciente al ciclo anteriormente encontrado para que sea ms fcil la concatenacin de ambos. Partimos del vrtice v1 y obtenemos el ciclo {v1-v4-v5-v6-v7-v5-v8-v1}. Ahora reensamblamos los ciclos: {v3-v1-v4-v5-v6-v7-v5-v8-v1-v2-v3}. Como an no se han recorrido todas las aristas del grafo obtendremos otro ciclo partiendo de un vrtice contenido en los ciclos concatenados con anterioridad. Por lo que podemos partir del vrtice v1, obteniendo el ciclo {v1-v9-v1}. Ahora concatenamos los ciclos y obtenemos la trayectoria euleriana cerrada. {v3-v1-v9-v1-v4-v5-v6-v7-v5-v8-v1-v2-v3}.
204 de 248
Manual de algortmica
Este problema modeliza numerosas situaciones de la vida real como es la recogida de basura de una ciudad, repartos de mercancas, en definitiva situaciones donde se sale de punto y es necesario llegar o pasar por un conjunto de zonas y regresar a dicho punto minimizando el coste del trayecto. Tradicionalmente se conoce como problema del cartero debido al trabajo que esta persona realizan, puesto que un cartero debe salir de la oficina, repartir todas las cartas a todas las casas y volver a la oficina minimizando el coste del recorrido. El objetivo encontrar un recorrido cerrado de coste ptimo que pase por todas las aristas del grafo, pudiendo repetir las que sean necesarias. El algoritmo podemos dividirlo en cinco pasos bien diferenciados que detallaremos a continuacin.
PASO 2 Formar el grafo completo kn con los vrtices impares. La ponderacin de las aristas del grafo anterior viene determinada por la distancia del camino mnimo en el grafo original entre cada par de vrtice del grafo completo formado por los vrtices impares. Para obtener el peso de las aristas se ha empleado el algoritmo de Dijkstra.
PASO 3 Buscar un emparejamiento perfecto de peso mnimo en el grafo completo formado por los vrtices impares.
PASO 4 Duplicar las aristas del camino mnimo anteriormente calculado segn el emparejamiento obtenido, es decir, si se obtuvo la siguiente pareja (v1, v2) se duplican las aristas del camino mnimo que une v1 con v2 en el grafo original.
205 de 248
Manual de algortmica PASO 5 Encontrar el recorrido cerrado de menor coste. Para ello se ha utilizado el algoritmo de Fleury.
Seguidamente veremos un ejemplo en el que detallaremos cada uno de los pasos anteriormente comentados. Sea G el siguiente grafo.
206 de 248
Construimos el grafo completo formado por los vrtices v3, v5, v6 y v7.
Ahora calcularemos las ponderaciones de las aristas. Para ello obtendremos la distancia del camino mnimo en G entre cada par de vrtices del grafo completo formado por los vrtices impares.
dG (v3, v5) = 2. dG (v3, v6) = 7. dG (v3, v7) = 2. dG (v5, v7) = 4. dG (v6, v5) = 6. dG (v6, v7) = 9.
207 de 248
Manual de algortmica
Por lo que las ponderaciones de las aritas del grafo formado por los vrtices impares nos queda.
PASO 3
Buscamos un emparejamiento perfecto de peso mnimo en el grafo formado por los vrtices impares. Para ello se ha utilizado el algoritmo de emparejamiento de peso ptimo explicado en la seccin dedicada a los emparejamientos. El emparejamiento obtenido esta formado por las aristas v3v7 y v5v6. PASO 4
Ahora debemos duplicar en G las aristas del camino mnimo existente entre los vrtices emparejados para lo cual volvemos a aplicar Dijkstra.
208 de 248
Manual de algortmica Obtenemos las aristas que forman parte del camino mnimo entre v3 y v7.
Obtenemos las aristas que forman parte del camino mnimo entre v5 y v6.
209 de 248
Manual de algortmica
Finalmente encontramos el recorrido cerrado de coste mnimo aplicando el algoritmo de Fleury teniendo en cuenta las aristas duplicadas, es decir, podemos pasar por ellas dos veces. El recorrido es v6-v1-v2-v1-v4-v2-v4-v3-v7-v3-v4-v5-v2-v5-v1-v6. Orden en el que se recorren las aristas:
Arista (v6, v1, 2). Arista (v1, v2, 3). Arista (v2, v1, 3) Arista (v1, v4, 4). Arista (v4, v2, 6). Arista (v2, v4, 6). Arista (v4, v3, 1).
210 de 248
Manual de algortmica
Arista (v3, v7, 2). Arista (v7, v3, 2). Arista (v3, v4, 1). Arista (v4, v5, 1). Arista (v5, v2, 1). Arista (v2, v5, 1). Arista (v5, v1, 5). Arista (v1, v6, 2).
211 de 248
Manual de algortmica
212 de 248
Manual de algortmica
Este algoritmo sigue una estrategia voraz, es decir comienza la coloracin de los vrtices segn orden de los stos en la matriz de adyacencias del grafo, por lo que la entrada del algoritmo es una ordenacin de los vrtices del grafo. La coloracin se realiza siguiendo los siguientes pasos. 1.- Asignar el color 1 al primer vrtice de la entrada del algoritmo. 2.- A continuacin escogemos el siguiente vrtice en la ordenacin y le asignamos el menor color posible diferente respecto a sus adyacentes. Repetimos este proceso hasta que todos los vrtices del grafo hayan sido coloreados. En cada paso se le asigna un color a un vrtice y no se le vuelve a modificar ms a lo largo de la ejecucin de ah el carcter voraz del algoritmo. Aplicaremos el algoritmo la grafo de la figura. Orden de coloracin: v1, v2, v3, v4, v5, v6, v7.
vrtices v1 v2 v3 v4 v5 v6 v7 color 1 2 1 3 1 2 2
213 de 248
Manual de algortmica
214 de 248
Manual de algortmica
La nica diferencia respecto al algoritmo voraz es el orden en el que se realiza la coloracin de vrtices. En este caso los vrtices se ordenan de mayor a menor grado, es decir en funcin del nmero de vrtices adyacentes.
vrtices v1 v2 v3 v4 v5 v6 v7 color 3 1 2 2 3 1 1
215 de 248
Manual de algortmica
La nica diferencia respecto a los otros dos algoritmos de coloraciones el orden en el que se realiza la coloracin vrtices. En este caso el orden de los vrtices es inverso al proceso de seleccin. Primero se elige vn como el vrtice de menor grado, luego se elige vn-1 como el vrtice de menor grado en G-{vn} (prescindiendo del vrtice vn), y as se contina examinando los vrtices de menor grado y eliminndolos del grafo.
vrtices v1 v2 v3 v4 v5 v6 v7 color 1 3 1 2 1 2 2
216 de 248
Manual de algortmica
El orden de coloracin de los vrtices depende del grado g(V) y grado de saturacin o color de los vrtices gs(V) y es determinado en tiempo de ejecucin. El grado de un vrtice es nmero de adyacentes del mismo y el grado de saturacin es el nmero colores no repetidos usados en los adyacentes o vecinos. A continuacin expondremos los pasos del algoritmo:
PASO 1
Calcular el grado de todos los vrtices y colorear un vrtice de grado mximo con el color 1.
PASO 2
Seleccionamos un vrtice, an sin colorear, con grado de saturacin o color mximo. Si existen varios vrtices con el mismo grado de saturacin mximo escogemos el de mayor grado entre esos vrtices. Si adems coinciden en grado seleccionamos el primero comenzando por la izquierda de la tabla.
PASO 3
PASO 4
Si todos los vrtices se han coloreado, FIN. En caso contrario, volver al paso 3.
217 de 248
La primera fila almacena el grado o el nmero de adyacentes de cada vrtice y la segunda fila contiene el grado de color o saturacin de cada vrtice que en principio es cero par todos los vrtices pues an no existe ningn vrtice coloreado. La ltima fila informa del color asignado al vrtice. El primer vrtice coloreado es el vrtice de grado mximo que en nuestro caso es v2 al cual se le asigna el color 1. Tras colorearlo el grado de saturacin sus vrtices adyacentes aumenta en una unidad.
A continuacin habra que escoger un vrtice de grado de saturacin o color mximo pero existen varios por lo que seleccionamos el primer vrtice de grado mximo no colorado comenzando por la izquierda de la tabla. Dicho vrtice es v4 al cual se le asigna el menor color posible. En este caso el color 2.
218 de 248
Manual de algortmica En los siguientes pasos volvemos a seleccionar vrtice con grado de color mximo y si existiera ms de uno escogeramos el de mayor grado, hasta colorear todos los vrtices del grafo. Veamos la evolucin de la tabla.
219 de 248
Manual de algortmica
220 de 248
Manual de algortmica
Es bipartito?
Los grafos bipartitos kn,m, que son aquellos que admiten una particin de sus vrtices en dos conjuntos V = XY, de manera que las aristas tienen un extremo en cada uno de estos conjuntos (van de vrtices en X a vrtices en Y). El conjunto X e Y constan de n y m vrtices respectivamente. | X | = n. | Y | = m. Un grafo bipartito si y solo si no contiene ciclos de orden impar o su nmero cromtico X(G) es dos. Estas dos propiedades nos permiten saber si un grafo es bipartito. Teorema El algoritmo de Brelaz colorea con dos colores a los grafos bipartitos. Por lo que tenemos un algoritmo polinmico para decidir si un grafo es bipartito o no. Bastar aplicar la coloracin de Brelaz al grafo. Si el nmero de colores usados es igual a dos entonces el grafo es bipartito. En otro caso el grafo no es bipartito. Veamos el siguiente ejemplo.
221 de 248
Manual de algortmica
222 de 248
Como el nmero de colores utilizados es dos el grafo es bipartito. Veamos otro ejemplo
223 de 248
224 de 248
Manual de algortmica
Expondremos dos algoritmos para la coloracin de las aristas de un grafo, ambos de carcter voraz.
225 de 248
Manual de algortmica
vrtices v1 v2 v3 v4 v5 v6 v7 v8 v9
v1 0 1 2 3 4 5
v2 1 0 3
v3 2 3 0 1
v4 0 2 1
v5 3 1 2 0 4
v6 1 4 0
v7 4 0 1
v8 5 1 0
v9 5 0
Lgicamente el cuadrado latino es simtrico pues las aristas vivj o vjvi son la misma para cualquier tipo de grafo en lo que a coloracin de arista se refiere, por ello tienen asignado el mismo color. Si una posicin del cuadrado latino aparece un infinito indica que no existe arista entre ambos vrtices.
226 de 248
Manual de algortmica
227 de 248
Manual de algortmica
Este algoritmo colorea las aritas del grafo utilizando el algoritmo de emparejamiento maximal simple. Para ello comienza buscando un emparejamiento maximal en el grafo. Al conjunto de aristas obtenidas les asigna el color k. Seguidamente elimina dichas aristas del grafo y vuelve a calcular un emparejamiento maximal al cual le asigna el color k+1. Dicho proceso se repite hasta eliminar todas las aritas del grafo. Iniciar k := 1 Paso 1 Encontrar un emparejamiento mximo M de G, y colorear todas las aristas de M con el color k. Hacer G := G - M.
Paso 2 Si el grafo no posee aristas, FIN. En caso contrario hacer k := k+1 y volver al paso 1. A continuacin detallaremos un ejemplo para el siguiente grafo.
228 de 248
Manual de algortmica
229 de 248
Manual de algortmica Calculamos un emparejamiento maximal al cual le asignamos el color 1. Arista (v1, v2). Arista (v3, v5). Arista (v4, v6). Arista (v7, v8). Eliminamos del grafo las aristas del primer emparejamiento.
Calculamos otro emparejamiento maximal y le asignamos el color 2. Arista (v1, v7). Arista (v2, v3). Arista (v4, v5).
230 de 248
Manual de algortmica Eliminamos del grafo las aristas del segundo emparejamiento.
Calculamos otro emparejamiento maximal y le asignamos el color 3. Arista (v1, v3). Arista (v5, v6).
231 de 248
Manual de algortmica Eliminamos del grafo las aristas del tercer emparejamiento.
232 de 248
233 de 248
234 de 248
Manual de algortmica
3.-12.- Hamilton
Un grafo conexo se dice hamiltoniano cuando admite un ciclo hamiltoniano. Un ciclo hamiltoniano es un ciclo que pasa por todos los vrtices del grafo. Un camino hamiltoniano es un camino simple que pasa por todos los vrtices del grafo sin repetir ninguno.
Algoritmo de Dirac.
El problema de decidir si un grafo es hamiltoniano est abierto (no existe un procedimiento para saber si lo es).
Teorema de Dirac.
235 de 248
Manual de algortmica Un grafo G (V, A) es hamiltoniano si todos los vrtices tienen valencia (V) n/2 donde n es el nmero de vrtices del grafo. Esta condicin es suficiente pero no necesaria por lo que si el grafo no satisface dicha relacin no podemos asegurar que no sea hamiltoniano.
236 de 248
Vrtices v1 v2 v3 v4 v5 v6
El grafo es hamiltoniano pues todos los vrtices tienen valencia mayor o igual que 3.
237 de 248
Vrtices v1 v2 v3 v4 v5 v6 v7 v8
(V) n/2 6 8/2 = 4 3 8/2 = 4 4 8/2 = 4 4 8/2 = 4 3 8/2 = 4 4 8/2 = 4 2 8/2 = 4 2 8/2 = 4
Como existen vrtices que no cumplen la relacin, no podemos asegurar que el grafo no sea hamiltoniano.
238 de 248
Manual de algortmica
El problema de bsqueda de trayectorias hamiltonianas es un problema NP-completo. Aunque existen mtodos aproximados se ha optado por un algoritmo de bsqueda exhaustiva, implementado mediante la tcnica de backtracing. El esquema que implementa el backtracing:
proc btptimo(x: Etapa) var xsig: Etapa cand: Candidatos prin si (esSolucin(x)) si (esMejor()) actualizaSolucin() fsi fsi xsig := nuevaEtapa(x) cand := calculaCandidatos(x) mientras (quedanCandidatos(cand)) seleccionaCandidato(cand, xsig); si (esPrometedor(cand, xsig)) anotaSolucin(cand, xsig); btOptimo(xsig); cancelaAnotacin(cand, xsig); fsi fmientras fin
A continuacin comentaremos algunas caractersticas del problema que se pretende resolver y detallaremos cada uno de los mtodos y clases que hacen posible la bsqueda de la trayectoria hamiltoniana. Comenzaremos por la Clase Solucin Clase Solucin // Atributos solucin : Array de enteros. fclase
239 de 248
Manual de algortmica La solucin se almacena en un array de enteros donde que almacena la posicin del vrtice respecto a la matriz de adyacencias del grafo. El tamao del array y la profundidad a la que se encuentra la solucin en caso de existir vienen determinados por el nmero de vrtices del grafo. Podemos decir que si existe la solucin se encuentra a dicha profundidad en el rbol de expansin, en otro caso no existe solucin. Una vez que se encuentra una solucin el se para el proceso de bsqueda y reconstruiremos la trayectoria a partir de las posiciones del los vrtices en la matriz de adyacencias. Adems al no tratarse de un problema de optimizacin el mtodo esMejor retorna siempre cierto. y actualiza solucin se deja vaco.
Clase Candidatos Clase Candidatos // Atributos vrticesDestinos: Array de enteros i: entero fclase
El array almacena las posiciones de los posibles vrtices destinos respecto a la matriz de adyacencias del grafo del ltimo vrtice que forma parte de la trayectoria hamiltoniana que no hayan sido ya considerados por lo que todos los candidatos son prometedores, por ello el mtodo esPrometedor siempre retornar cierto. En la primera etapa Los candidatos se obtienen en el mtodo calculaCandidatos. El entero i se utiliza para iterar y seleccionar el vrtice candidato, operacin realizada en el mtodo seleccionaCandidato.
240 de 248
El entero almacena la profundidad del rbol de expansin. Ahora detallaremos los atributos de la clase que da cuerpo a cada uno de los mtodos del esquema.
Clase HamiltoBacktracing
Clase HamiltoBacktracing // Matriz de adyacencias del grafo. adyacencias: Array [][] de real hamiltoniano: Array de entero // Tipo de trayectoria bsqueda (ciclo o camino) ciclo: Lgico // Nmero de vrtices del grafo. numVrtices: entero. vrticeActual: entero // Si su valor es cierto se ha encontrado la solucin. solEncontrada: Lgico // Almacenar la trayectoria si se encuentra. sol: Solucin fclase
El array hamiltoniano almacena la secuencia de posiciones de los vrtices que forman parte de la trayectoria respecto a la matriz de adyacencias del grafo y el entero vrticeActual almacena la posicin del ltimo vrtice que forma parte de la trayectoria. El tipo de trayectoria buscada es elegida por el usuario.
241 de 248
Manual de algortmica
Finalmente comentar que en el mtodo anotaEnSolucin se aade el vrtice candidato a la trayectoria parcialmente construida y en cancelaAnotacin solo decrementamos el valor de la etapa. Para aclara todo lo expuesto anteriormente realizaremos una serie ejemplo. Consideremos el siguiente grafo en el cual encontrar el ciclo o camino hamiltoniano es trivial pero nos servir para mostrar el rbol de expansin completo. En el rbol en vez de mostraremos los vrtices y no las posiciones que estos ocupan en la matriz de adyacencias.
En este caso el array que almacena la solucin posee tamao 3 y a dicha profundidad obtendremos la solucin, pero seguiremos expandiendo el rbol para ver como evoluciona aunque no es necesario y de hecho no se realiza en la implementacin proporcionada para la aplicacin pues seria una perdida de tiempo. Al lado de cada tupla entre llaves aparecen lo candidatos.
Etapa k= 0
[v2, v1, -]
[v2, v3, -]
[v3, v1, -]
[v3, v2, -]
242 de 248
Manual de algortmica k=2 {v3} {v2} {v3} {v1} [v2, v3, v1] {v2} [v3, v1, v2] {v1} [v3, v2, v1]
243 de 248
Manual de algortmica La solucin encontrada es v1-v2-v3 si se desea el camino o v1-v2-v3 -v1 en el caso del ciclo, el resto del rbol no seria necesario generarlo. En cada tupla se actualiza la posicin correspondiente con la etapa en la que nos encontramos considerando que las posiciones del array comienzan en cero. A continuacin expondremos otro ejemplo con su rbol de expansin para un grafo en el que existe un camino hamiltoniano. Una vez encontrado el camino no seguiremos expandiendo el rbol.
[v2, -, -, -] {v1}
244 de 248
245 de 248
Manual de algortmica Finalmente podremos un ejemplo de bsqueda de un ciclo hamiltoniano en el que solo mostraremos la solucin.
246 de 248
Manual de algortmica
247 de 248
Manual de algortmica
4.- Bibliografa
Apuntes de la asignatura de matemtica discreta de la escuela tcnica superior de informtica de la universidad de Sevilla http://ma1.eii.us.es/miembros/mcruz/MD/md_ii.html. Apuntes de la asignatura de teora de grafos de la escuela tcnica superior de informtica de la universidad de Sevilla http://ma1.eii.us.es/Docencia/Doc_info/XSLT.asp?xml=teorgraf.xml&xsl=progra ma.xsl&par=esp:. Coloracin de vrtices y aristas http://www.dma.fi.upm.es/grafos/color03.pdf. Apuntes sobre grafos eulerianos http://www.google.es/search?hl=es&q=grafos+German+Combariza&btnG=B% C3%BAsqueda&meta=. Conectividad en grafos http://mipagina.cantv.net/jhnieto/md/Grafos.pdf.
248 de 248