15. Cálculo numérico elemental
16.2. Representación de grafos
Antes de meternos de lleno con los algoritmos, tenemos que decidir cómo guar- daremos la información de un grafo en la computadora. Ya sabemos que los vértices serán 1, 2, . . . , n , y nos falta guardar la información de las aristas. Hay muchas formas de hacerlo, pero nosotros nos concentraremos en dos: dar la lista de aristas (con sus extremos) y dar la lista de adyacencias o vecinos, una lista donde el elemento en la posición i es a su vez una lista de los vecinos de i .
- Otras dos formas usuales son la matriz de adyacencias, una matriz cuyas entradas son sólo 0 o 1 y de modo que la entrada i j es 1 si y sólo si{i , j } ∈ E , y la matriz de
incidencias, una matriz de m× n, también binaria, donde la entrada i j es 1 si y sólo si la arista i -ésima es incidente sobre el vértice j .
Las más de las veces el ingreso de datos es más sencillo mediante la lista de aristas, pues la matriz de adyacencias tiene n2elementos y en general m n2(y siempre m≤ n(n − 1)/2 para grafos simples).
Ejemplo 16.2. Para el grafo de lafigura 16.1, podríamos poner
ngrafo = 6 # cantidad de vértices
aristas = [[1, 2], [1, 3], [2, 3], [2, 6], [3, 4], [3, 6], [4, 6]]
Observar que los elementos dearistasson a su vez listas en las que el orden es importante para Python[1, 2]6=[2, 1]. Sin embargo, al tratarse de aristas de un grafo para nosotros serán iguales.
- Recordando lo hecho en la elcapítulo 13al tratar listas como conjuntos, para conser- var la salud mental trataremos de ingresar la arista{u , v } poniendo u < v , aunque en general no será necesario.
La lista de vecinos tendrá índices desde 1, por lo que pondremosNoneen la posición 0 a fin de evitar errores (pero la lista de aristas tiene índices desde 0).
16.2. Representación de grafos Pág. 129
vecinos = [None,
[2, 3], [1, 3, 6], [1, 2, 4, 6], [3, 6], [], [2, 3, 4]]
- Observar que hay información redundante en la lista de vecinos. Por ejemplo, en la listavecinosanterior, como2está envecinos[1], sabemos que{1,2} es una arista del grafo, y en principio no sería necesario repetir esta información poniendo1en vecinos[2].
- La redundancia hace que sea preferible el ingreso de la lista de aristas antes que la de vecinos, porque se reducen las posibilidades de error. Esencialmente, ambas requieren del mismo lugar en memoria pues si{a ,b } ∈ E , al ingresarla en la lista de aristas ocupa dos lugares (uno para a y otro para b ), y en la lista de vecinos también (un lugar para a como vecino de b y otro para b como vecino de a ). ¡ Ejercicio 16.3. Hacer una función para que dada la lista de vecinos, se imprima para cada vértice, los vértices que son adyacentes.
Por ejemplo, si la entrada es el grafo delejemplo 16.1, la salida debería ser algo como
Vértice Vecinos 1 2 3 2 1 3 6 3 1 2 4 6 4 3 6 5 6 2 3 4 ¡
Ejercicio 16.4. Como es útil pasar de una representación a otra, definimos las funciones
dearistasavecinosydevecinosaaristasen el módulo
grafos
.Comprobar el comportamiento de estas funciones con las entradas delejemplo 16.2, pasando de una a otra representación (en ambos sentidos).
Observar que:
• Como es usual, suponemos que los datos ingresados son correctos: los vértices de las aristas que se ingresan son enteros entre 1 yngrafoy no hay aristas repetidas o de la forma{i , i }.
• Endearistasavecinosponemos explícitamentevecinos[0] = None. • Endevecinosaaristassólo agregamos una arista cuandov<u, evitando poner
una arista dos veces.
• Las inicializaciones devecinosyaristasen cada caso.
• La construcciónfor u, v in aristasendearistasavecinos, aún cuando
cada arista está representada por una lista. ¡
Ejercicio 16.5. A fin de evitar errores cuando ingresamos datos y no escribir tanto, es conveniente guardar los datos del grafo en un archivo de texto. Por comodidad (y uniformidad), supondremos que el archivo de texto contiene en la primera línea el número de vértices, y en las restantes los vértices de cada arista: por lo menos debe tener
un renglón (correspondiente al número de vértices), y a partir del segundo debe haber exactamente dos datos por renglón.
Por ejemplo, para el grafo delejemplo 16.2, el archivo tendría (ni más ni menos):
6 1 2 1 3 2 3 2 6 3 4 3 6 4 6
Hacer una función que toma como argumento el nombre de un archivo de textos donde se guarda la información sobre el grafo (como indicada anteriormente). Com- probar la corrección de la función imprimiendo la lista de aristas, una por renglón.
¿Qué pasa si el grafo no tiene aristas? ¡
Ejercicio 16.6 (grado de vértices). Dado un grafo G= (V, E ), para cada vértice v ∈ V se define su grado o valencia,δ(v ), como la cantidad de aristas que inciden en v , o equivalentemente, la cantidad de vecinos de v (excluyendo al mismo v ).
Por ejemplo, en el grafo delejemplo 16.2, los grados sonδ(1) = 2,δ(2) = 3,δ(3) = 4,δ(4) = 2,δ(5) = 0,δ(6) = 3.
a) Hacer una función que dado un grafo calculeδ(v ) para todo v ∈ V .
b) Uno de los primeros teoremas que se ven en teoría de grafos dice que si U es el
conjunto de vértices de grado impar, entonces X
v∈U
δ(v ) es par.
Hacer una función para hacer este cálculo y verificar el teorema. ¡ Ejercicio 16.7. Es claro que si(u = v1, v2, . . . , vk = v ) es un camino u –v , entonces (vk, vk−1, . . . , v1, v0) es un camino v –u , y lo mismo para un ciclo.
Hacer una función que ingresando un grafo (de un archivo de texto) y una sucesión de vértices(v1, v2, . . . , vk) (ingresada interactivamente, k > 1):
a) decida si(v1, v2, . . . , vk) es un camino, es decir, si {vi−1, vi} ∈ E para i = 2, . . . , k , b) en caso afirmativo, imprima el camino inverso,(vk, vk−1, . . . , v1, v0),
c) verifique si(v1, v2, . . . , vk) es un ciclo. ¡
Ejercicio 16.8. El módulo
grgr
(gráficos de grafos) permite hacer ilustraciones de grafos como el de lafigura 16.1. El comportamiento es similar al del módulogrpc
, aunque una diferencia importante es que engrgr
se pueden mover los vértices y etiquetas con el ratón.Como otros módulos gráficos que vimos,
grgrsimple
es una plantilla para realizar ilustraciones, en este caso congrgr
. Habrá que variar los parámetros del grafo (cantidad de vértices y aristas) y de la ilustración.Ejecutar el módulo
grgrsimple
viendo su comportamiento moviendo los vértices yetiquetas, o ingresando otros grafos. ¡