2.3 Grafos acı́clicos 2.3 Grafos acı́clicos Hasta ahora hemos buscado caminos y estudiado la conexión de un grafo, sin entrar en el estudio de los ciclos y la aciclicidad. En esta sección trataremos de ello, introduciéndonos brevemente en el estudio los grafos acı́clicos. 2.3.1 Grafos acı́clicos no dirigidos: Árboles Los resultados siguientes, aunque sencillos (casi “simplones”) son básicos en el estudio y ponen de manifiesto la imbricación entre conexión y ciclos ? Cualquier vértice que esté en un ciclo tiene al menos grado 2 (el recı́proco no es cierto). ? Si un vértice tiene grado 1, la arista incidente no forma parte de ningún ciclo. ? Si dos vértices pertenecen a un mismo ciclo, están conectados al menos por dos caminos distintos. ? Si eliminamos una arista de un ciclo, los vértices extremos siguen estando conectados. ? Si un grafo consta únicamente de un ciclo tiene tantas aristas como vértices. t t t t t t t t t t t t t t t t t t t t Bastan estas gráficas para considerar la validez de los resultados anteriores. Es notoria la relación entre conexión y ciclos si consideramos el siguiente resultado: Lema 19.- Si G = (V, A) es un grafo conexo y a es una de sus aristas, entonces: (V, A − {a}) es un grafo conexo ⇐⇒ a está en un ciclo. Demostración: Si la arista a une los vértices x e y , y (V, A − {a}) es conexo hay un camino C uniendo estos dos vértices que no pasa por a, en consecuencia C ∪ a forma un ciclo en G. Recı́procamente, si a está en un ciclo y la eliminamos, el grafo resultante sigue siendo conexo, pues hay otro camino que une los puntos extremos. Pero también la aciclicidad se caracteriza por la unicidad de los caminos: Lema 20.- Si dos vértices de un grafo están conectados por dos caminos distintos el grafo tiene al menos un ciclo. Demostración: zi+1 Si x z1 z2 · · · zp y y x w1 w2 · · · wr y son cat minos distintos, tienen al menos un vértice zj zi−1 zi z1 distinto. Si recorremos los dos caminos empet t t t ty x t w1 wi−1 wi ws zando en x, como tienen al menos un vértice distinto, habrá un vértice zi (que puede ser t x) a partir del cual se separan, luego la priwi+1 mera vez que vuelvan a coincidir en un vértice se forma el ciclo –y deben volver a juntarse pues ambos acaban en y , luego se juntan en y o en otro anterior–. (Ver la figura de la derecha donde aparece en verde el ciclo formado.) Proposición 21.- Un grafo no dirigido conexo es acı́clico si y sólo si cada par de vértices está unido por un único camino. Matlab 6.1. 30 2.3 Grafos acı́clicos La veracidad del resultado es clara del lema y el tercero de los resultados “básicos” anteriores (aunque su prueba requiere algo más de trabajo). Pero definamos con propiedad los elementos a tratar: tratar: Definición 22.- A un grafo no dirigido, acı́clico y conexo se le llama árbol. Si no es conexo se denomina bosque y, cada componente conexa es un árbol. En un árbol, a los vértices de grado uno se les llama hojas. En el estudio de los grafos acı́clicos nos limitaremos a los conexos, los árboles, pues para los no conexos (bosques) basta aplicar los resultados a cada una de las componentes conexas. Los árboles figuran entre los tipos más importantes de grafos y se presentan en varias aplicaciones: los árboles genealógicos, los organigramas o las redes de distribución son ejemplos de ellos. Pueden usarse para presentar, organizar o analizar redes eléctricas, relaciones mercantiles, estructuras de la programación, etc. Puede decirse que son la estructura mı́nima de conectividad (máxima conectividad al mı́nimo coste). Las dos representaciones siguientes ilustran su estructura: v2 t @ v4 t v6 t @ @ v1 t ur @ t v3 @ @t v5 t v7 rr HH H vr HHsr @ @ @ @ @rw @r r p q @ @ r r @r x y z donde se aprecia claramente la aciclicidad y, en el segundo, su imagen arbórea. Los vértices v1 , v3 y v7 son hojas del primer árbol. El siguiente resultado nos permite obtener un punto de inicio para implementar un método de chequeo de la aciclicidad: Lema 23.- Un árbol finito con al menos una arista (o con más de un vértice) tiene al menos una hoja (de hecho al menos dos hojas). Demostración: Elegimos un vértice cualquiera del grafo, x, y se construye a partir de él un camino hasta que no podamos seguir, entonces el vértice final del camino es una hoja: por ser acı́clico de él no pueden salir otras aristas (distintas de la de llegada) a vértices anteriores del camino y si no se puede seguir tampoco salen aristas a otros vértices, luego la única arista incidente en él es la de llegada por lo que tiene grado 1. (Si x tiene grado 1 es la segunda hoja y si tiene grado mayor prolongamos el camino anterior a partir de x siguiendo otra arista hasta que no podamos más, entonces el vértice final para esta parte también es una hoja –por la misma razón que antes–.) Algoritmo de aciclicidad El algoritmo se basa en los siguientes resultados: • Si eliminamos un hoja y la arista incidente en ella, el subgrafo que nos queda sigue teniendo los mismos ciclos que antes (una hoja no puede formar parte de un ciclo). • Si el grafo es conexo, y elimnamos una hoja el subgrafo resultante sigue siendo conexo. Luego sobre un grafo conexo, el método del algoritmo es el siguiente: Si tiene más de un vértice y no tiene una hoja, no es acı́clico. Si tiene una hoja, la eliminamos del grafo. Si el subgrafo resultante tiene más de un vértice y no tiene hojas, no es acı́clico y tampoco lo es el inicial. Si tiene una hoja, la eliminamos. Sucesivamente, hasta que nos quede un sólo vértice de grado 0, en cuyo caso es acı́clico, o hasta obtener un subgrafo de más de un vértice y sin hojas, en cuyo caso tiene ciclos. Matlab 6.1. 31 2.3 Grafos acı́clicos v2 t @ @ @ v1 t t v3 2.3.1.1 v4 t @ @ @t v5 v6 t t v7 b r r @ @ r @r r b r r b r b r @ r r b @ @r r b r r b b r r r b r r b b r b b b b b b b b b b Ejercicios 3.1 Consideremos los dos grafos siguientes: x1 t x2 t x3 t x4 t G1 y1 t y2 t y3 t y4 t t y6 t y7 t y8 G2 t x5 t x6 t x7 t x8 t y5 (a) Hay un único camino en G1 para ir de x5 a x6 y hay un único camino en G2 para ir de y5 a y6 . ¿Eso quiere decir que los grafos son acı́clicos? ¿Por qué? (b) Comprobar por inspección gráfica si son conexos y si contienen algún ciclo. ¿Cuáles son sus hojas? (c) Comprobar si son o no aciclicos usando el método del algoritmo sobre el dibujo. (d) Escribir la matiz de adyacencia de G1 y detectar en ella las hojas. Aplicar el algoritmo sobre la matriz de adyacencia. Hacerlo también para G2 . (e) Si eliminamos la arista {x6 , x7 } de G1 y la arista {y2 , y6 } de G2 , ambos grafos dejan de ser conexos. Repetir sobre estos nuevos grafos los apartados (c) y (d) anteriores. Introducir en el ordenador como M1 y M2 las matrices de adyacencia respectivas de G1 y G2 . [i] ¿Cuantas hojas tiene G1 ? ¿Cuáles son? ¿Y las de G2 ? [ii] Elegir la primera hoja que se encuentre en G1 y elimı́nala. Usar un bucle for para programar el algoritmo de aciclicidad. Si el grafo es acı́clico ¿cómo será la matriz final? [iii] Repetir el apartado anterior para el grafo G2 , pero usando un bucle while. [iv] Aplicar los algoritmos anteriores a los grafos no conexos construidos en el apartado (e). ¿Detectan adecuadamente si los grafos son acı́clicos o no? De no hacerlo alguno de ellos, ¿como se modificarı́a el programa para que lo haga? 3.2 (a) Sea G un grafo acı́clico y conexo de n vértices. Aplicando el algoritmo de aciclicidad se elimina, en cada paso, una hoja y al final del proceso el grafo consta de un único vértice de grado 0. Entonces, ¿cuántas aristas tenı́a inicialmente G? (b) Si G es acı́clico, formado por dos componentes conexas, una de k vértices y la otra de n−k vértices ¿cuántas aristas tiene G? (c) Si a G acı́clico y conexo de n vértices, le añadimos una nueva arista ¿seguirá siendo acı́clico?, ¿por qué? 3.3 Construir una función Aciclico que aplique el algoritmo de aciclicidad sobre la matriz de adyacencia de un grafo no dirigido y devuelva 0 si no es acı́clico y 1 si lo es. Matlab 6.1. 32 2.3 Grafos acı́clicos 2.3.2 Digrafos acı́clicos. El conjunto de los digrafos acı́clicos también tiene propiedades muy interesantes. Matemáticamente, constituyen la estructura más amplia en la que se puede asegurar la existencia de maximales y minimales y, en consecuencia, admiten etiquetados naturalmente ordenados (reordenación natural y sencilla de los vértices). En un sentido más usable, permiten reordenar los vérices de manera que sea fácil detectar y manejar las direcciones de los arcos. Un uso habitual de esta propiedad es establecer una secuencia lineal (sin dicotomı́as) de instruciones de montaje, cuando algunas de ellas precisan de la realización previa de otras; secuenciación de programas informáticos, etc. Definición 24.- Sea (V, A) un grafo dirigido. El punto x ∈ V es un punto maximal, pozo o sumidero del grafo si no existe y ∈ V tal que (x, y) ∈ A, es decir, si exg(x) = 0. El punto x ∈ V es un punto minimal o fuente del grafo si no existe y ∈ V tal que (y, x) ∈ A, es decir, si ing(x) = 0. Proposición 25.- Si (V, A) es un digrafo (finito) acı́clico admite, al menos, un maximal y un minimal. Demostración: Si no hubiera maximales todo punto del digrafo serı́a adyacente a algún otro, luego partiendo de un punto cualquiera x1 podrı́amos construir una trayectoria x1 · · · xp tan larga como quisiéramos. Ahora bien, como el digrafo es finito, llega un momento en la trayectoria que repetirı́amos vértices, lo que va en contra de la aciclicidad. Análogamente para los minimales. Usando la proposición anterior se obtiene la siguiente caracterización para los digrafos acı́clicos: Proposición 26.- Si (V, A) es un digrafo con |V | = n, entonces (V, A) es acı́clico si, y sólo si, se puede etiquetar V en la forma {x1 , x2 , . . . , xn } de modo que si (xi , xj ) ∈ A, entonces i < j . En este caso diremos que el digrafo está naturalmente ordenado. Demostración: =⇒ Por inducción sobre el número de vértices n. Es claramente cierto para n = 1. Supongamos entonces que los digrafos acı́clicos con menos de n vértices pueden ordenarse naturalmente y sea (V, A) un digrafo acı́clico con n vértices. Elijamos un vértice minimal x ∈ V y asignémosle la etiqueta x1 . El subgrafo inducido en V − {x} es acı́clico con n − 1 vértices, por lo que puede ordenarse naturalmente con {x2 , x3 , . . . , xn } y, en consecuencia, el digrafo (V, A) queda de esta manera naturalmente ordenado (al ser x minimal sólo tiene arcos salientes que llegan a vértices con ı́ndice mayor que 1). ⇐= Supongamos que (V, A) posee un ciclo xa xb xc · · · xa . Sea j = mı́n{a, b, c, . . . , a} y sea xi el anterior a xj en el ciclo. Entonces (xi , xj ) ∈ A y, como j es mı́nimo, i ≥ j ; contra la hipótesis i < j. La propia demostración de que todo digrafo acı́clico admite un etiquetado naturalmente ordenado nos proporciona el método para construir dicho etiquetado. 2.3.2.1 Algoritmo de ordenación natural Si |V | = n, tomamos un x ∈ V que sea minimal y lo etiquetamos por x1 ; consideramos ahora el subgrafo (V − {x1 }, A|V −{x1 } ) formado al eliminar ese vértice y todos los arcos que salen de él. Ahora tomamos en este subgrafo un y ∈ V − {x1 } que sea minimal y que etiquetamos por x2 ; Sucesivamente, se repite el proceso hasta acabar con todos los vértices. Matlab 6.1. 33 2.3 Grafos acı́clicos En el ejemplo siguiente, construimos un etiquetado naturalmente ordenado sobre el digrafo etiquetado por V = {a, b, c, d, e, f, g, h}. A la derecha aparece el digrafo con el etiquetado naturalmente ordenado, donde hemos colocado todos los vértices en alturas progresivas a fin de que se observe fácilmente ese hecho (todos los arcos van de abajo a arriba, de ı́ndice menor a ı́ndice mayor). a b - rb 1 r Rrc 6 Rrd r? U R r r e h g h g h g b Rrc 6 r? rd U R r r e 1 r b4 h r? U R r b e b3 g 2.3.2.2 1 r b2 f bb h g b b b2 r r? U R r r e 1 rc 6 bd h g b2 1 b b b2 r r? b3 U R r r e b2 1 b b2 b b4 6 b b4 6 b b4 r? U Rr b3 g b b3 7 b b3 f b 5 Rr f rx8 6 ] J r * xJ7 6 J x6 r J M Jrx5 x4r 6 I @ @r x3 rx2 6 r bc f f f f 1 b b 5 f =8 b b x1 5 Ejercicios 3.4 Sea D el digrafo dado por la figura de la derecha: (a) Hallar el ingrado y el exgrado de los vértices. (b) Hallar los maximales y minimales de D . Si eliminamos el vértice 3, ¿alguno de los minimales o máximales ha dejado de serlo? ¿Cómo se justifica el resultado? Obtener los maximales y minimales del nuevo digrafo (c) El digrafo D es conexo. ¿Y si se eliminan los vértices 3 y 5? -8s $ @ 5s @ R s @ - s s11 7 9 I @ 6 6 @ 1s 10s @s6 $ ' 6 6 s? s? % & 2@ 3 @ R s @ & % 4 ' (d) De los caminos que salen del vértice 6 ¿cual es más largo?, ¿y el más corto? ¿Son únicos? (e) ¿Están los vértices naturalmente ordenados? ¿Es acı́clico? (f) ¿Pueden reordenarse los vértices para obtener un etiquetado naturalmente ordenado? Comprobar que M es la matriz de adyacencia de D [i] Hallar el ingrado y el exgrado de cada vértice. [ii] Hallar los maximales y minimales. [iii] Obtener la matriz M3 resultado de eliminar el vértice 3 de D . ¿Tiene maximales y minimales el nuevo digrafo? ¿Cuáles son? ¿Algún vértice que no lo era lo es ahora?, ¿y alguno que lo era ha dejado de serlo? M= 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 [iv] Eliminar también el vértice 5 y repetir el apartado anterior. Aplicar el algoritmo de Warsall para comprobar si este digrafo es conexo. [v] Usando la función Floyd construida para la primera parte de la práctica, obtener la matriz de alcanze minimo. ¿Puede responderse con esos datos al apartado d)? ¿Por qué? [vi] Comprueba si el digrafo está o no naturalmente ordenado. Matlab 6.1. 34 2.3 Grafos acı́clicos 3.5 Considerar el grafo G2 del ejercicio 3.1. Construir un digrafo D , convirtiendo cada arista {yi , yj }, con i < j , en el arco (yi , yj ) si i + j es par y en el arco (yj , yi ) si i + j impar. (a) Dibujar el digrafo D . Si G2 era conexo, ¿D también lo es? ¿Por qué? (b) Aplicar el algoritmo de ordenación natural para comprobar que es acı́clico. (c) Redibujar el digrafo con la nueva ordenación de manera que se aprecie claramente. Introducir la matriz D2 del digrafo (¿cómo se obtiene a partir de la de G2?) [i] Aplicar sobre la matriz el algoritmo de ordenación natural: • detectar un minimal, guardarlo como el primer elemento de un vector OrdNat y eliminarlo del digrafo, • detectar un minimal en el digrafo resultante, guardarlo como el segundo elemento del vector OrdNat y eliminarlo del digrafo, • .... hasta terminar los vértices. [ii] Permutar las filas y columnas de la matriz D2 siguiendo la ordenación natural construida. ¿Que caracterı́stica destacarı́as de la nueva matriz? ? Escribir una función Diaciclico que con un bucle for repita de manera sucesiva las instruciones del apartado [i] del ejercicio anterior. 3.6 ? Modificarla, para adaptarla a un bucle while. ? ¿Que ócurrirá en el proceso si el digrafo no es acı́clico? Añadir una condición para que se salga del bucle cuando detecte esta situación (ver órdenes continue, break y return). 3.7 Para la realización de un programa informático necesitamos usar 6 procesos informáticos A, B , C , D , E y F conocidos. En la estructura del programa deben usarse los procesos de manera secuencial, sin embargo algunos de estos procesos requieren de la realización previa de otros de ellos. Ası́, el proceso A debe realizarse con anterioridad a el proceso E (lo denotaremos por A < E ), también B previo a C y a D (B < C, D ), C < E , D < C y F < A, D . (a) Modelar con un digrafo la situación de precedencia de unos procesos con otros. (b) Obtener una secuencia de los procesos de manera que no se realize ninguno más de una vez, y que siempre que utilicemos un proceso se hayan realizado previamente los necesarios. Práctica (Segunda y última parte).- Crear una función SinCiclos que tenga como argumento de entrada la matriz de adyacencia de un grafo o digrafo simple, y tres argumentos de salida (que denotaremos por sal 1, sal 2, sal 3). Con las siguientes caracterı́sticas: ? que sal 1=[(0)1,(0)1,(0)1] según sea (no) conexo, (no) dirigido y (no) acı́clico ? que sal 2=V OrdNat si el grafo es dirigido y acı́clico; y sal 2=[ ] en otro caso ? que sal 3=M OrdNat si el grafo es dirigido y acı́clico; sal 3=[ ] si es dirigido y no acı́clico; y sal 3=L ∗ si es no dirigido ? que use los algoritmos de Floyd, de aciclicidad y de ordenación natural (en alguna de sus versiones) como funciones externas, a las que llamará cuando sean necesarias. Nota: Por V OrdNat denotamos al vector que contenga la ordenación natural construida. Por M OrdNat denotamos a la matriz del digrafo una vez reordenada siguiendo la ordenación natural construida. Por L ∗ denotamos la matriz de alcance mı́nimo y, naturalmente [ ] es la matriz vacı́a. Matlab 6.1. 35