Teor´ıa de Grafos

Anuncio
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
Descargar