Está en la página 1de 4

1.2 Moverse por un grafo.

Conexión

1.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 tres trayectoriasdistintas desde
 el vértice vi al vértice vj .
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),
 
1 v1 →v3
 
 1 v2 →v3

0 1 1 1  = 0 · 1+ 1 · 1 +1 · 0+ 1 · 1 = 2

6→ v1 →v2 v1 →v3 v1 →v4  0

6→  6→ v1 →v2 →v3 6→ v1 →v4 →v3
1 v4 →v3

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 v1 →v2
 
1 0 1 0 0 6→

= 1·1 +0 · 0+ 1·1 +0 · 0 = 2
 
v2 →v1 6→ v2 →v3 6→

 1 v3 →v2  v2 →v1 →v2 6→ v2 →v3 →v2 6→
0 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.

1.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.

1.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 W1 , W2 , . . . , Wn (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 (W0 =
M , sólo están conectados los vértices extremos de las aristas). En el paso 1, y para cada vi y vj , se

Matlab 6.1. 6
1.2 Moverse por un grafo. Conexión

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 W1 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; W0 = M
para k = 1 hasta n
para j = 1 hasta n
para i = 1 hasta n  
Wk (i, j) = Wk−1 (i, j) | Wk−1 (i, k) & Wk−1 (k, j)
fin
fin
fin
Y el grafo será conexo si la matriz final, Wn , 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 en Matlab se reduce a:

W = M; n = size(W, 1); v = ones(1, n);


for k=1 : n  
W = W | W( : , k · v) & W(k · v, : )
end
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 contiene copias de la columna k y
la segunda copias de la fila k.
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 tiempo 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 Sea G1 el grafo que se forma al eliminar del grafo G del ejercicio 2.1 de la pág. 5, los vértices v1
y v7 y la arista {v2 , v4 }.
(a) Hallar su matriz de adyacencia N .
(b) Contruir las matrices N , N + N 2 , N + N 2 + N 3 , etc. ¿Qué significan estas matrices? ¿Cómo
pueden usarse para probar la conexión de un grafo?
(c) Aplicar el algoritmo de Warsall dado en Algoritmo 1 de la página 7 para comprobar que es
conexo. ¿En que valor de k se obtiene ya la matriz toda de unos?
(d) 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?
(e) Aplicar el algoritmo de Warsall dado en Observación 15 para comprobar que es conexo.
Obtener la matriz de adyacencia, N, a partir de la matriz M usada en el ejercicio 2.1.

[i] Implementar en Matlab el algoritmo de Warsall de Observación 15. ¿El grafo es conexo?

[ii] Añadir una condición de parada cuando se consiga una matriz toda de unos.

[iii] Modificarlo para que la condición de parada sea una fila (o columna) toda de unos.

Matlab 6.1. 7
1.2 Moverse por un grafo. Conexión

1.2.2.2 Algoritmo de Floyd


El algoritmo de Warsall 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 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 de ir minorando los valores de la matriz realizando las mismas comprobaciones que hace Warsall,
con un pequeño cambio: en cada paso se toma como nuevo valor de la matriz de alcance
 
Lk (i, j) = mı́n Lk−1 (i, j) , Lk−1 (i, k) + Lk−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 existentes). Esta variante, se denomina algoritmo de Floyd.
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.

[iv] Mediante manipulacion de las matrices, construir a partir de N su matriz de alcance L.

[v] Modificar el algoritmo de Warsall para implementar el algoritmo de Floyd.

1.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–; todas excepto una: 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. 8
1.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; L0 = L
para k = 1 hasta
 n 
Lk = min Lk−1 , Lk−1 ( : , k · v) + Lk−1 (k · v, : )
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 entre ellos).

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
digrafo conexo de la derecha, no hay camino dirigido de v1 a v4 ni de v4 r - r2 r - r4 r
a v1 y ocurre lo mismo entre más vértices.

1.2.4 Ejercicios
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?
(d) Las matrices M 2 , M 3 , etc. representan lo mismo que en el caso de los grafos no dirigidos,
pero referido a trayectorias “dirigidas”. Si en la diagonal de todas potencias sólo hay ceros, el
digrafo es acı́clico, ¿por qué?.
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[ii].

[ii] ¿Como comprobarı́as si la trayectoria es un camino? ¿Vale el método usado en los no dirigidos?

[iii] Comprobar si es una cola, un ciclo o un circuito, ¿es igual que en el caso no dirigido?

[iv] 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.

[i] Construir una matriz de alcance L, ver ejercicio 2.2[iv].

[ii] Usar el algoritmo de Floyd para comprobar que todas las plazas están conectadas con las
demás.

[iii] Obtener la matriz resultante de cerrar la plaza B al tráfico (ver ejercicio 1.2 de pág. 3). Usar
el algoritmo de Floyd para comprobar que hay plazas no conectadas con otras.

[iv] Resuelve este problema de circulación, cambiando y/o añadiendo direcciones.

[v] Usando el algoritmo de Floyd, elegir de entre las soluciones propuestas, aquella que permita
los recorridos de menor longitud.

Matlab 6.1. 9

También podría gustarte