Capı́tulo 2 Teorı́a de Grafos 2.1 Introducción: grafos y digrafos En términos generales, un grafo consiste en un conjunto de puntos, que llamaremos vértices, y lı́neas que unen los vértices, que denominaremos aristas. Los grafos se están convirtiendo en herramientas poderosas de múltiples disciplinas: ingenierı́a electrica y civil, redes de comunicación, computación, economia, sociologı́a, etc. Tanto por su simplicidad como modelo de muy variadas situaciones, como secillez para dar solución a los problemas, en muchos casos en forma de algoritmos computables en ordenador. Aparecen en diferentes campos bajo denominaciones distintas: “redes” en ingenierı́a electrica, “estructuras moleculares” en quı́mica, “mapas de carreteras”, “sociogramas”, “redes de telecomunicaciones”, etc. El modelado es simple tomando los objetos (lugares, aparatos, personas, . . . ) como vértices y las conexiones (cables, relaciones, tratos, . . . ) como aristas. Ejemplo 1.- En la ciudad de Königsberg, existen siete puentes que unen las riberas y dos islas formadas por el rı́o Pregel, de la forma que indica el dibujo. ¿Hay alguna forma de recorrer los siete puentes y volver al punto de partida, sin cruzar dos veces por el mismo puente? s s $ s s % El grafo que aparece sobre el dibujo modela esa situación: cuatro puntos, que representan las partes de tierra firme y las lı́neas que los unen, representando los puentes. El problema se reduce a saber si pueden recorrerse todas las lı́neas sin repetir ninguna y acabar en el mismo punto. Cuando se planteó esa pregunta a Euler ingenió la teorı́a de grafos y probó los primeros resultados antes de dar su respuesta: no. Definición 2.- Un grafo está formado por un par de conjuntos finitos, y se denota por G = (V, A), donde V es el conjunto de vértices y A es el conjunto de aristas. Cada arista de a ∈ A conecta dos vértices de V , que llamaremos extremos de la arista, y escribiremos a = {x, y} para indicar que a conecta o une los vértices x e y . Diremos entonces que x e y son adyacentes por a. En un grafo podemos encontrarnos lazos (aristas cuyos extremos coinciden), aristas múltiples (más de una arista conectando los mismos vértices) y vértices aislados (no están conectados a ningún otro vértice). Pero también podemos hablar de grafos dirigidos donde cada arista tiene una dirección de recorrido; modelos para una distribución de agua por la red de tuberias de la ciudad, la red viaria con calles de sentido único, etc., son ejemplos de grafos dirigidos. Definición 3.- Un digrafo o grafo dirigido está formado por un par de conjuntos finitos, y lo denotaremos por D = (V, A), donde V es el conjunto de vértices y A es el conjunto de arcos o aristas dirigidas entre los vértices. Cada arco a ∈ A conecta dos vértices de V , que llamaremos respectivamente extremo inicial y extremo final del arco, y escribiremos a = (x, y) para indicar que a conecta o une el vértice x con el vértice y . Diremos también que x es adyacente a y y que a incide en y . Matlab 6.1. 21 2.1 Introducción: grafos y digrafos Si los grafos se representan con puntos y lı́neas que los unen, los digrafos se representan con puntos y flechas entre ellos. Desgraciadamente no hay una nomenclatura estándar para designar los tipos de grafos ni los elementos que aparecen, por lo que es preciso fijarla y tenerlo presente al consultar cualquier bibliografı́a sobre el tema. Los grafos se clasifican por ser dirigidos o no, y por tener aristas/arcos múltiples y lazos. De un grafo sin aristas múltiples ni lazos se suele decir que es simple. Nosotros trabajaremos siempre con grafos simples. Notación 4.- Llamaremos grafos a los no dirigidos, sin aristas múltiples ni lazos (grafos no dirigidos simples), y digrafos a los dirigidos, sin arcos múltiples ni lazos dirigidos (grafos dirigidos simples). Si G = (V, A) es un grafo, con V = {v1 , v2 , . . . , vn }, escribiremos {vi , vj } ó {vj , vi } para denotar la arista que une ambos vértices. Si D = (V, A) es un digrafo, denotaremos por (vi , vj ) el arco que conecta vi con vj . Observaciones 5.? En un grafo sólo puede haber una arista entre los mismos dos vértices, y en un digrafo puede haber hasta dos arcos pero de sentidos contrarios. Si un grafo tiene n vértices, en cada vértice pueden incidir a lo más n − 1 aristas. Si es un digrafo, de cada vértice pueden salir a lo más n − 1 arcos y pueden incidir en él n − 1 arcos como mucho. ? Un grafo (no dirigido) puede considerarse tambien como un digrafo, sin más que cambiar cada arista por dos arcos de sentidos contrarios. t K En ocasiones, por comodidad y claridad en la representación gráfica, cuando en un digrafo aparece un arco y el de sentido contrario se sustituyen ambos por una arista. -t t -t = Ut t? t t? Definición 6.- Un subgrafo (subdigrafo) de un grafo (digrafo), es un grafo (digrafo) formado con vértices y aristas (arcos) del inicial. Es decir, se obtienen eliminando aristas y/o vértices del inicial (si se elimina un vértice, también deben eliminarse todas las aristas incidentes en él). 2.1.1 Matriz de adyacencia de un grafo Un grafo o un digrafo D = (V, A) puede tambien describirse mediante una tabla o matriz que indique las conexiones: Definición 7.- Si D tiene n vértices, se llama matriz de adyacencia de D a la matriz cuadrada de orden n, M = (mij )n×n , donde mij = 1 si el arco (vi , vj ) ∈ A, y mij = 0 en otro caso. Si G es no dirigido, su matriz de adyacencia es simétrica (si la arista {vi , vj } está en A, también está {vj , vi }). Si el grafo o digrafo es simple –es nuestro caso–, la diagonal está formada por ceros (no tiene lazos). v3 s 6 R s v1 - s v4 s? v2 v1 M = v2 v3 v4 v1 0 1 1 0 v2 0 0 0 1 v3 1 0 0 0 v4 1 0 1 0 v3 s @ @ s v4 @ s v1 @ @ @s v2 0 1 M = 1 1 1 0 1 0 1 1 0 0 1 0 0 0 Fig. 2.1. Matrices de adyacencia Matlab 6.1. 22 2.1 Introducción: grafos y digrafos Si para formar un subgrafo eliminamos sólo aristas, su matriz de adyacencia se forma cambiando el 1 por un 0 en las posiciones correspondientes; pero si se elimina un vértice, debemos eliminar la fila y la columna correspondientes a ese vértice en la matriz. En un grafo el número de unos en cada fila o columna es el número de aristas incidentes en el vértice correspondiente a esa fila o columna; mientras que en un digrafo, el número de unos de cada fila se corresponde con el número de arcos salientes desde ese vértice y el número de unos de cada columna indica el numero de arcos que llegan a ese vértice. Definición 8.- En un grafo no dirigido, el número de aristas incidentes en un vértice se denomina grado del vértice, gr(v). En un digrafo, se denomina ingrado de un vértice al número de arcos incidentes en un vértice, ing(v), y exgrado al número de arcos salientes del vértice, exg(v). ? Si G es un grafo con n vértices y m aristas, no es dificil comprobar que n P gr(vi ) = 2m. i=1 ? Si D es un digrafo con n vértices y m arcos, se tiene que n P ing(vi ) = i=1 2.1.2 n P exg(vi ) = m. i=1 Ejercicios 1.1 La zona Z-72 de gestión de carreteras se ocupa de la red viaria entre las 6 ciudades del área. Hay carretera entre A y C , A y E , B y C , B y D , B y F , C y D , C y E , y entre E y D . (a) Dibujar un grafo para modelar esta situación. (b) En una redistribución zonal, la ciudad B pasa a depender de la nueva zona Z-80, y las carreteras que la unı́an con las ciudades de la Z-72 pasan a depender de la Interzonal 3. ¿Qué grafo describirı́a la nueva situación de la Z-72? ¿Hay alguna peculiaridad reseñable? (c) Si es C , en lugar de B , quien pasa a depender de la Z-80, ¿qué grafo describirı́a entonces la nueva situación de la Z-72? ¿Hay alguna peculiaridad reseñable? (d) Obtener la matriz M de adyacencia del grafo inicial y las matrices M1 y M2 de los subgrafos construidos en los apartados anteriores. ¿Como se reflejan en las matrices las peculiaridades observadas antes? Introducir en el ordenador como M la matriz de adyacencia del grafo. [i] Encuentra los vértices adyacentes a B y los adyacentes a D . [ii] Construir a partir de ella las matrices M1 y M2 de los subgrafos obtenidos en ese ejercicio. Hacerlo de dos formas: eligiendo los elementos que las forman y eliminando los que sobran. [iii] Calcular el grado de cada vértice, calcular el número de aristas y comprobar que es cierta la igualdad n P gr(vi ) = 2m. i=1 1.2 La matriz M representa las direcciones de circulación de las calles entre 6 plazas A, B , C , D , E y F . (a) El problema se modela usando un digrafo. ¿Por qué? (b) ¿Hay calles de doble dirección? ¿cuales? (c) Si se cierra la plaza B por obras, ¿habrı́a que cambiar (o añadir) alguna dirección para poder seguir circulando por las demás calles? Matlab 6.1. 0 1 1 M = 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 1 0 23 2.2 Moverse por un grafo. Conexión (d) Si la respuesta al apartado anterior es afirmativa, indicar los cambios necesarios para resolver el problema. Estudiar todas las posibilidades de solución y resaltar las que requieran un menor número de cambios. Introducir en el ordenador la matriz de adyacencia del digrafo como una matriz dispersa S. [i] Construir la matriz M a partir de ella. [ii] Hallar la traspuesta y comprobar que es distinta de M. [iii] Implementar una bifurcación que nos diga si una matriz es o no cuadrada, y otro que nos diga si es simétrica. [iv] Construir una matriz de tres columnas que por filas tenga el vértice, su ingrado y su exgrado. [v] Obtener la matriz M1 del digrafo resultante de cerrar la plaza B al tráfico. [vi] Si es el caso, obtener la matriz M2 que resuelva el problema del tráfico. [vii] Construir a partir de M, mediante operaciones con matrices (y no por elementos), la matriz A correspondiente a hacer todas las calles de doble dirección. [viii] ¿Que operador relacional usarı́as para comprobar que los arcos que figuran en M siguen estando en A? 2.2 Moverse por un grafo. Conexión La estructura de un grafo, como puntos conectados, sugiere recorridos o desplazamientos por un grafo. Es decir, en un grafo G = (V, A), podemos ir desde un vértice v1 recorriendo aristas hasta llegar a otro vértive vk . Ası́: Definición 9.- Sea G = (V, A) un grafo. Llamaremos trayectoria en G a una sucesión de vértices, x1 x2 · · · xp−1 xp tales que {xi , xi+1 } ∈ A, para cada i = 1, 2, . . . , p − 1. Diremos que la trayectoria conecta o une el vértice x1 y el vértice xp , y del número de aristas recorridas, p − 1, diremos que es la longitud de la trayectoria. Si x1 = xp se dice que la trayectoria es cerrada. No hemos puesto ninguna restricción al recorrido de la trayectoria (salvo que use aristas del grafo), podrı́amos deambular por el grafo recorriendo siempre las mismas aristas y pasando por los mismos vértices. Es usual distinguir otros dos tipos de trayectorias. Definición 10.- Llamaremos cola a una trayectoria que recorre aristas distintas y camino a una trayectoria sin vértices repetidos (luego tampoco aristas). De una cola cerrada se dice que es un circuito y de un camino cerrado que es un ciclo. Nota: Las denominaciones de trayectoria, cola, circuito y camino difieren de unos autores a otros, mientras que la de ciclo es más común; en cualquier caso, y como ya comentamos, conviene comprobar cómo denomina cada autor estos elementos. Los caminos y ciclos son elementos imprescindicles en la teorı́a de grafos –también en la parte que a nosotros nos ocupa–. Las siguientes definiciones establecen unas tipologı́as de grafos muy importantes: Definición 11.- Diremos que un grafo es acı́clico si no tiene ciclos. Definición 12.- Un grafo es conexo si todo par de vértices está unido por una trayectoria (por un camino). Matlab 6.1. 24 2.2 Moverse por un grafo. Conexión Si el grafo no es conexo, está formado por varios trozos que sı́ son conexos. De cada uno de estos trozos se dice que es una componente conexa del grafo. En otras palabras, un grafo es conexo si desde un vértice se puede ir a todos los demás. Si el grafo no es conexo un vértice sólo está conectado con los de su misma componente conexa. Aunque no todas las trayectorias son caminos, el siguiente resultado nos asegura que siempre podremos disponer de uno si es necesario (y explica el paréntesis en la definición de conexión). Proposición 13.- Cada trayectoria que une dos vértices distintos contiene un camino que une esos mismos vértices. Demostración: Sea T una trayectoria que une el vértice vr y el vértice vs . Si T no es un camino, repite vértices. Cuando recorremos T , si pasamos por un vértice vi y este nos aparece más adelante en la trayectoria, nos encontramos en el mismo punto que la primera vez que pasamos por él, luego si eliminamos el “paseo” intermedio seguimos teniendo una trayectoria que une el vértice vr y el vértice vs . Si repetimos el proceso hasta que no queden vértices repetidos tenemos el camino postulado. De igual manera se tiene que: Proposición 14.- Cada circuito que empieza y acaba en un vértice vr contiene un ciclo que empieza y acaba en ese vértice vr . (El resultado es por supuesto válido para cada vértice de un circuito.) 2.2.1 Trayectorias y matrices La matriz M , de adyacencia de un grafo, indica las aristas entre vértices, que son también las trayectorias de longitud 1 posibles entre vértices. Ası́, la matriz M 2 = M M indica, en cada posición, el número de trayectorias de longitud 2 entre los vértices correspondientes, es decir, si en la posición (i, j) hay un 3, tenemos distintas desde el vértice vi al vértice vj . tres trayectorias 0 1 1 1 1 0 1 0 En efecto, si M = es la matriz de un grafo, el elemento (1, 3) de M 2 se obtiene de 1 1 0 1 1 0 1 0 operar la fila 1 de M con la columna 3 de M . Entonces (ponemos con cada elemento de la matriz su significado como arista), 0 6→ 1 1 v1 →v2 v1 →v3 1 v1 →v4 1 1 0 v1 →v3 v2 →v3 = 0 · 1+ 1 · 1 +1 · 0+ 1 · 1 = 2 v1 →v2 →v3 v1 →v4 →v3 6→ 6→ 1 v4 →v3 6→ luego hay dos trayectorias de longitud 2 desde el vértice v1 al vértice v3 : v1 v2 v3 y v1 v4 v3 . Igualmente, el elemento (2, 2) de M 2 será: 1 v2 →v1 0 6→ 1 v2 →v3 0 6→ 1 0 1 0 v1 →v2 6→ v3 →v2 = 1·1 v2 →v1 →v2 +0 · 0+ 6→ 1·1 v2 →v3 →v2 +0 · 0 = 2 6→ 6→ y hay dos trayectorias de longitud 2 desde el vértice v2 al vértice v2 : v2 v1 v2 y v2 v3 v2 . Los valores de M 2 cuentan trayectorias, no caminos. En el primer caso, las trayectorias son caminos, pero en el otro no son caminos (ni colas) pues se recorre la misma arista. De hecho todas las trayectorias contadas en la diagonal se forman ası́: se sale del vértice por cada arista y se vuelve por la misma arista. De la misma forma, en M 3 se tiene el número de trayectorias de longitud 3 entre cada par de vértices; en M 4 se tiene el número de trayectorias de longitud 4 entre cada par de vértices, etc. Matlab 6.1. 25 2.2 Moverse por un grafo. Conexión 2.2.2 Algoritmos de conexión de un grafo Usando las potencias de la matriz de adyacencia puede estudiarse la conexión de un grafo de manera eficaz, pero poco eficiente desde el punto de vista del cómputo operacional. Yendo a la definición de conexión (existencia de caminos entre cada par de vértices) y construyendo nuevos caminos a partir de los ya existentes se obtienen mejores algoritmos para probarlo. El más sencillo, y que sirve como base a otros interesantes algoritmos es el algoritmo de Warsall. 2.2.2.1 El algoritmo de Warsall Este algoritmo recrea la construcción de trayectorias estre vértices de la manera siguiente: “Los vértices vi y vj estan conectados si hay un camino entre ellos o, si para algún vértice vk hay un camino de vi a vk y un camino de vk a vj ” La estrategia que sigue el algortimo es de comprobaciones exhaustivas y lo hace en sentido contrario al sugerido por la frase anterior: no comprueba si para cada par de vértices vi , vj hay algún otro vk que hace de enlace, sino al revés, comprueba si cada vértice vk es puente entre cada par de vértices vi y vj . Warsall produce una sucesión de matrices booleanas W (1) , W (2) , . . . , W (n) (una por cada vértice vk a comprobar) que indican si dos vértices dados están o no conectados. Si el grafo es conexo la última matriz constará toda de unos (si hay al menos dos vértices). Inicialmente, comenzaremos usando la matriz de adyacencia M como matriz de conexión inicial (W (0) = M , sólo están conectados los vértices extremos de las aristas). En el paso 1, y para cada vi y vj , se comprueba si ya están conectados o si pueden conectarse a través de v1 (es decir, si vi está conectado con v1 y también v1 está conectado con vj ). Obtendremos ası́ una nueva matriz W (1) que indicará los vértices conectados, bien porque lo estaban o bien porque se han conectado a través de v1 . Y se repite lo mismo para cada uno de los vértices restantes... El algoritmo, puede plantearse ası́: Algoritmo 1.- (de Warsall) inicio: n; M; W(0) = M para k = 1 hasta n para j = 1 hasta n para i = 1 hasta n W(k) (i, j) = W(k−1) (i, j) | W(k−1) (i, k) & W(k−1) (k, j) fin fin fin Y el grafo será conexo si la matriz final, W (n) , es toda de unos. Observación 15.- Matlab es un potentı́simo manejador de matrices, por lo que es mejor y más corto hacer algoritmos para las matrices completas que para los elementos individualmente (si se puede claro). Ası́, el algoritmo de Warsall puede reducirse al siguiente inicio: n; M; W(0) = M para k = 1 hasta n W(k) = W(k−1) | W(k−1) ( : , k) ∗ ones(1, n) & ones(n, 1) ∗ W(k−1) (k, : ) fin Como los operadores lógicos sobre matrices se aplican elemento a elemento, si en un paso k, escribimos en las posiciones correspondientes de una matriz todas las comparaciones “y(&)” que se hacen, vemos que puede separarse en una comparación de dos matrices, la primera contine copias de la columna k y la segunda copias de la fila k. Matlab 6.1. 26 2.2 Moverse por un grafo. Conexión Es evidente que si la matriz toda de unos se consigue en un paso intermedio no es necesario completar el algoritmo, por lo que puede incluirse condiciones de parada que reduzcan el timepo de cómputo. (De hecho, es suficiente con que en una fila o columna todos los elementos que no sean de la diagonal sean 1 para asegurar la conexión.) 2.2.2.2 Algoritmo de Floyd El algoritmo trabaja con operaciones lógicas para determinar la conexión o no entre los vértices, pero cambiando el tipo de elementos y operadores usados se ha adaptado para otras cuestiones. Por ejemplo, puede modificarse ligeramente para encontrar la longitud (en el sentido de menor número de aristas) del camino más corto entre dos vértices conectados: “si hay un camino entre los vértices vi y vj y se puede formar otro uniendo dos que pasen por algún vértice vk , elegimos el más corto de los dos”. Para ello hay que sustituir la matriz de adyacencia M , por otra matriz L (de “longitud de alcance”) que almacena las longitudes de los caminos entre los vértices, de la siguiente manera: • un vértice está a alcance 0 de si mismo (0 en la diagonal), • los vértices conectados por una arista están a alcance 1 y • los vértices no conectados directamente están a alcance ∞. Se trata pues de ir minorando los valores de la matriz; para ello realizamos las mismas comprobaciones que realiza Warsall con un pequeño cambio: en cada paso tomaremos como nuevo valor de la matriz de alcance el valor mı́n L(k−1) (i, j) , L(k−1) (i, k) + L(k−1) (k, j) (es decir, tomamos como longitud la del camino más corto entre el que tenemos y el que se pueda formar uniendo dos caminos). La matriz final del algoritmo contendrá en cada posición la logitud del camino más corto entre cada par de vértices (y cero en la diagonal). Si dos vértices no pueden conectarse figurará el valor ∞ (inf en Matlab), por lo que el grafo será conexo si no existe ningún valor ∞ en la matriz final. 2.2.3 Trayectorias y conexión en un digrafo Para los grafos dirigidos, las trayectorias, colas, caminos, circuitos y ciclos, se definen de forma análoga. La diferencia estriba en que los arcos sólo se pueden recorrer en un sentido, por lo que las trayectorias (colas, ciclos, etc.) son siempre trayectorias dirigidas que se recorren en el sentido que indica la flecha. Definición 16.- Sea D = (V, A) un digrafo. Llamaremos trayectoria (dirigida) en D a una sucesión de vértices, x1 x2 · · · xp−1 xp tales que (xi , xi+1 ) ∈ A, para cada i = 1, 2, . . . , p − 1. Diremos que la trayectoria conecta o une el vértice x1 con el vértice xp , y del número de arcos recorridos, p − 1, diremos que es la longitud de la trayectoria. Si x1 = xp se dice que la trayectoria es cerrada. Llamaremos cola a una trayectoria con todos los arcos distintos y circuito a una cola cerrada. Llamaremos camino a una trayectoria sin vértices repetidos y ciclo a un camino cerrado. Todas las definiciones y resultados vistos en el apartado anterior (aciclicidad, matrices y su significado, etc.) tienen su análogo para digrafos –sin más que tener en cuenta que todos los elementos han de ser dirigidos–, excepto uno: la definición de conexo. Definición 17.- Sea D un digrafo. Se llama grafo no dirigido subyacente a D , al grafo que se obtiene sustituyendo cada arco (x, y) por la arista {x, y} (si aparecen (x, y) e (y, x) se sustituyen ambos por una sóla arista). Definición 18.- Un digrafo es conexo si su grafo subyacente es conexo. Matlab 6.1. 27 2.2 Moverse por un grafo. Conexión En general, los resultados válidos para grafos o digrafos los son también para los otros, salvo aquellos que se basan directamente en la existencia o no existencia de direcciones (como la conexión). Ası́, el algoritmo de Floyd para calcular la menor longitud de un camino entre vértices, comentado antes, funciona perfectamente con digrafos: Algoritmo 2.- (de Floyd) inicio: n; L; L(0) = L para k = 1 hasta n para j = 1 hasta n para i = 1 hasta n L(k) (i, j) = min L(k−1) (i, j), L(k−1) (i, k) + L(k−1) (k, j) fin fin fin Donde L se obtiene a partir de la matriz de adyacencia, poniendo para i 6= j sin arco entre ellos L(i, j) = ∞. Si en la matriz final algunas posiciones mantienen el valor ∞, quiere decir que no puede irse de un vértice al otro (no hay camino). Nota: En un grafo no dirigido la conexión asegura que se puede ir desde cualquier vértice a cualquier otro, pero en los digrafos conexos puede haber perfectamente vértices no conectados por caminos dirigidos (que no haya camino de vi a vj ni camino de vj a vi ). En el v1 v v3 v v5 s - s2 s - s4 s digrafo de la derecha, v1 sólo se conecta con v2 , v2 no se conecta con ningún otro, etc. 2.2.4 Ejercicios v2 s @ 2.1 Considerar en el grafo G de la derecha, la trayectoria de v2 a v7 , T = v2 v1 v3 v2 v5 v4 v6 v5 v3 v4 v6 v7 . (a) ¿Es T un camino?, ¿y una cola? ¿Cuál es su longitud? @ @ v1 s @ (b) Los caminos C1 = v2 v4 v6 v7 y C2 = v2 v5 v6 v7 , no forman parte de la trayectoria. ¿Por qué? v4 s @ @ @ @ @ @s v3 v6 s @ @s v5 @ @ @s v7 (c) Buscar en T un camino del vértice v2 al vértice v7 . (d) Tomar los vértices del grafo y dibujar T como una lı́nea continua, indicando el sentido del recorrido. Destacar el camino obtenido en el apartado anterior y las partes eliminadas. (e) La prueba del resultado de la proposición 13 da un método para encontrar un camino contenido en una trayectoria. Reescribir el método en la forma de un procedimiento paso a paso (algorı́tmico) que permita obtener un camino contenido en una trayectoria. (f) Obtener el número de trayectorias de longitud 3 de v4 a v5 y describirlas. Introducir en el ordenador la trayectoria como un vector T y la matriz de adyacencia M. [i] Calcular a partir de T la longitud de la trayectoria T . [ii] Comprobar qué vértices de subı́ndice impar se repiten en la trayectoria y, cuando ocurra, encontrar las posiciones de las repeticiones en T. [iii] Idear una manera de comprobar que la septima arista recorrida en T es también una arista de G. Implementar esa idea en un bucle for que compruebe que T es una trayectoria válida (que cada arista de T es un arista de G). [iv] Programar el mismo algoritmo, pero en un bucle while. [v] Completar los programas anteriores, para que den como repuesta “Es una trayectoria” o “No es una trayectoria”, según el caso. Matlab 6.1. 28 2.2 Moverse por un grafo. Conexión 2.2 Sea G1 el grafo formado, eliminando del grafo G del ejercicio anterior los vértices v1 y v7 y la arista {v2 , v4 }. (a) Hallar su matriz de adyacencia. (b) Aplicar el algoritmo de Warsall dado en Algoritmo 1 de la página 26 para comprobar que es conexo. ¿En que valor de k se obtiene ya la matriz toda de unos? (c) Si la condición de parada es que todos los elementos de una fila o columna son uno (que no sean de la diagonal principal), ¿para qué valores de k y j se consigue? Implementar en Matlab el algoritmo de Warsall anterior: [i] Sin condiciones de parada. [ii] Que a la vista de la matriz resultante, diga si el grafo es o no conexo. [iii] Añadiendo la condición de parada cuando se consiga una matriz toda de unos. [iv] Que la condición de parada sea una fila (o columna) toda de unos. [v] Implementarlo con operaciones matriciales, en la forma descrita en la Observación 15. 2.3 Considerar el digrafo D del Ejercicio 1.2 dado por su matriz de adyacencia M . (a) Si es posible, encontrar en D un camino, una cola que no sea camino y una trayectoria que no sea cola, del vértice B al vértice D . (b) Comprobar cual de las trayectorias T1 = B A C E C D F D F y T2 = B A C E D C F D F es válida y obtener en ella un camino de B a F . (c) ¿Es un digrafo conexo? Introducir la matriz M y las trayectorias como los vectores respectivos T1 y T2. [i] Decidir la trayectoria válida usando el método construido en el Ejercicio 2.1[iii]. [ii] Construir A, la matriz del grafo no dirigido subyacente a D , y comprobar que el digrafo es conexo usando alguno de los algoritmos de Warsall construidos anteriormente. 2.4 Consideremos M, la matriz de adyacencia del digrafo D del ejercicio anterior. (a) Construir una matriz L (“de alcance”, ver los comentarios previos a Observación 15 o Algoritmo 2) cambiando los ceros de M por inf pero manteniendo 0 en la diagonal. (b) Implementar en Matlab el Algoritmo 2 (de Floyd), para la matriz L. Escribirlo como la función L FLOYD, con argumentos de entrada n y L y retorno una matriz W. (c) Obtener del valor de retorno W, los vértices que están a mayor distancia (en el sentido de la longitud del camino más corto) de entre los que están conectados. (d) Construir una función M FLOYD, que use como matriz de entrada la matriz de adyacencia M del digrafo, construya la matriz de alcance L y llame a L FLOYD para obtener la matriz de alcance minima. 2.5 Implementar como algoritmo en Matlab el proceso paso a paso del Ejercicio 2.1(e). Práctica (Primera parte).- Elaborar una función Floyd, que mejore el algoritmo de L Floyd para usar operaciones matriciales (en el mismo sentido que en el Ejercicio 2.2[v]). Que su entrada sea únicamente la matriz de adyacencia de un grafo o digrafo y, tenga de salida 1 (conexo) o 0 (no conexo) como primer argumento y la matriz de alcance mı́nimo como segundo argumento. Matlab 6.1. 29