Skip to Content

Grafos y sus representaciones

Un grafo GG consiste de un conjunto finito VV, cuyos miembros son llamados vértices, y un conjunto de 2-subconjuntos de VV, cuyos miembros son aristas

Escribimos G=(V,E)G = (V, E) para denotar un grafo GG con conjunto de vértices VV y conjunto de aristas EE.

Un ejemplo de un grafo G=(V,E)G = (V, E) dado por los conjuntos:

V={a,b,c,d,e},    E={{a,b},{a,d},{a,e},{b,e},{c,b},{d,e}}V = \{a, b, c, d, e\}, \; \; E = \{\{a, b\}, \{a, d\}, \{a, e\}, \{b, e\}, \{c, b\}, \{d, e\} \}

La representación pictórica de un grafo puede ser más fácil de entender a simple vista:


grafo

Sin embargo esta representación no es útil para comunicarse con una computadora. Debe representarse mediante conjuntos o una tabla.

Los vértices x,yx, y de un grafo son adyacentes cuando {x,y}\{x, y\} es una arista.

Podemos representar un grafo G=(V,E)G = (V, E) por su lista de adyacencia, donde cada vértice vv encabeza una lista de los vértices adyacentes a vv:


aabbccddee
bbccbbaabb
ddaaeedd
eeeeaa

Este grafo podría representarse en Python como:

grafo = { "a": ["b", "d", "e"], "b": ["c", "a", "e"], "c": ["b"], "d": ["a", "e"], "e": ["b", "d", "a"] }

Isomorfismo de grafos

Dos grafos G1G_1 y G2G_2 son isomorfos si existe una biyección α\alpha entre el conjunto de vértices de G1G_1 y G2G_2 tal que
Si {x,y}\{x, y\} es una arista en G1G_1 entonces {α(x),α(y)}\{\alpha(x), \alpha(y)\} es una arista en G2G_2.
Si {z,w}\{z, w\} es una arista en G2G_2 entonces {α1(z),α1(w)}\{\alpha^{-1}(z), \alpha^{-1}(w)\} es una arista en G1G_1.

Por ejemplo:


grafografo

La biyección es dada por:

α(1)=b,  α(3)=a,  α(2)=c,  α(4)=d\alpha(1) = b, \; \alpha(3) = a, \; \alpha(2) = c, \; \alpha(4) = d

Comprobando que a cada arista en G1G_1 le corresponde una arista de G2G_2 y viceversa.

Si dos grafos tienen diferente cantidad de vértices, entonces no pueden ser isomorfos. Si tienen la misma cantidad de vértices, pero diferente cantidad de aristas, entonces hay biyecciones de vértices pero ninguna de estas puede ser un isomorfismo.

Determinar la igualdad de dos grafos puede ser una tarea computacional costosa dependiendo de la cantidad de vértices y aristas.

Subgrafos

Sea G=(V,E)G = (V, E) un grafo. Un subgrafo de GG es un grafo G=(V,E)G' = (V', E') donde VVV' \subset V y EEE' \subset E.

Podemos determinar si dos grafos no son isomorfos en base a sus subgrafos:


grafografo

Hay un subgrafo K1G1K_1 \subset G_1 que contiene 1 arista. Pero K1char"338G2K_1 \not\subset G_2. Por lo tanto, G1G_1 y G2G_2 no son isomorfos.

Valencias

La valencia de un vértice vv en un grafo G=(V,E)G = (V, E) es el número de aristas que tienen a vv como extremo. Se utiliza la notación δ(v)\delta(v) para la valencia de vv.

δ(v)=Dv,  Dv={eEve}\delta(v) = |D_v|, \; D_v = \{e \in E \mid v \in e \}

En una lista de adyacencia, la valencia de un vértice es la cantidad de elementos de la columna del vértice:


aabbccddee
bbccbbaabb
ddaaeedd
eeeeaa
δ(a)=3,  δ(b)=3,  δ(c)=1,  δ(d)=2,  δ(e)=3\delta(a) = 3, \; \delta(b) = 3, \; \delta(c) = 1, \; \delta(d) = 2, \; \delta(e) = 3

Diremos que un vértice es par si su valencia es par, e impar si su valencia es impar.

Handshaking lemma

La suma de las valencias de los vértices de un grafo G=(V,E)G = (V, E) es igual al doble de la cantidad de aristas de GG.

v    Vδ(v)=2E\sum_{v \; \in \; V} \delta(v) = 2|E|

Por ejemplo, en base a la lista de valencias anterior:

δ(a)+δ(b)+δ(c)+δ(d)+δ(e)=3+3+1+2+3=12\delta(a) + \delta(b) + \delta(c) + \delta(d) + \delta(e) = 3 + 3 + 1 + 2 + 3 = 12

No existe un grafo que pueda contradecir esta propiedad.

Grafos regulares, planares y conexos

Un grafo regular es aquel con la misma valencia rr en todos sus vértices.

Un grafo planar es aquel donde no se cruzan las aristas.

Un grafo conexo es aquel donde no hay vértices aislados.

Un ejemplo que cumple ambas condiciones es este grafo:


grafo

Árboles

Un grafo G=(V,E)G = (V, E) es árbol si es conexo y sin ciclos, tal que E=V1|E| = |V| - 1 y donde cada par de vértices está conectado por un único camino.

Un árbol sin vértices es un árbol vacío. Un árbol con vértices tiene un vértice especial llamado raíz, del cual pueden derivarse otros vértices estableciendo una jerarquía o relación de dependencia entre ellos.

En Haskell, podríamos definir un árbol binario de búsqueda, donde partiendo de un nodo o vértice podemos obtener como máximo, dos adyacentes:

data ABB a = Vacio | Nodo a (ABB a) (ABB a) deriving (Show)

Una representación podría ser:


grafo

En este tipo de árbol se cumple que los valores del subárbol izquierdo son menores al valor del nodo raíz, y los valores del subárbol derecho son mayores al valor del nodo raíz.

Ciclos, caminos y caminatas

Una caminata en un grafo GG es una secuencia de vértices v0,v1,,vkv_0, v_1, \ldots, v_k tal que {vi,vi+1}\{v_i, v_{i+1}\} es una arista de GG para 0i<k0 \leq i < k.

Un camino es una caminata donde todos los vértices son distintos.

Un ciclo es una caminata v0,v1,,vk,v0v_0, v_1, \ldots, v_k, v_0 (Se repite el primer vértice al final).

Algunos ejemplos en el grafo G1G_1 anterior son:

  • a,d,e,b,ca, d, e, b, c es un camino.

  • c,b,a,d,bc, b, a, d, b es una caminata.

  • a,b,e,d,aa, b, e, d, a es un ciclo.

Ciclo Hamiltoniano

Un ciclo Hamiltoniano en un grafo GG es un ciclo que pasa por todos los vértices de GG exactamente una vez.

Caminata Euleriana

Una caminata Euleriana en un grafo GG es una caminata que usa todas las aristas de GG exactamente una vez.

Coloreo de grafos

Un coloreo de un grafo G=(V,E)G = (V, E) es una función c:VSc: V \rightarrow S donde SS es un conjunto de colores. El número cromático de GG es el mínimo número de colores necesarios para colorear GG.

La función de coloreo cumple la propiedad:

{x,y}E,  c(x)char"338=c(y)\forall \{x, y\} \in E, \; c(x) \not=c(y)

Es decir, dos vértices adyacentes no pueden tener el mismo color. Si bien no existe un algoritmo definitivo para determinar el número cromático de un grafo, podemos usar el Algoritmo Greedy para obtener una aproximación.

Algoritmo Greedy

Si hay vértices no coloreados, elegimos un vértice sin color y le otorgamos un color que no tengan sus vecinos.

Primero definimos un orden a los vértices: v0,v1,,vnv_0, v_1, \ldots, v_n. Definimos SS como el conjunto de colores.

  • Le damos el color 00 a v0v_0.
  • Tomamos el siguiente vértice, y le damos el color más bajo que no tengan sus vecinos.
  • Al terminar el último vértice, el número cromático es el cardinal de SS.

Ejercicios resueltos - Grafos

1.

Dar los componentes/subgrafos del grafo cuya lista de adyacencias es:


aabbccddeeffgghhiijjkkll
ccddaabbccbbaaddaaffeeff
ggffeehhkkhhkkffkkllgghh
iijjlliijj
ll

Podemos dibujar los siguientes subgrafos G1,G2G_1, G_2:


grafografo

2.

Determinar si los subgrafos G1,G2G_1, G_2 son isomorfos.

Podemos determinar que no son isomorfos, observando el vértice ff hay un subgrafo K4G2K_4 \subset G_2 que contiene 4 aristas y K4char"338G1K_4 \not\subset G_1.


3.

Determinar si alguno de los subgrafos tiene un ciclo Hamiltoniano.

El subgrafo G2G_2 tiene un ciclo Hamiltoniano que pasa por todos los vértices exactamente una vez:

b,f,j,l,h,d,bb, f, j, l, h, d, b

4.

Aplicar el Algoritmo Greedy para colorear G1,G2G_1, G_2 y dar sus números cromáticos.

Para aplicar el Algoritmo Greedy en G1G_1, podemos seguir el siguiente orden:

i,e,k,c,a,gi, e, k, c, a, g

Ahora aplicamos los pasos del Algoritmo:

  • 1)   i\; i tiene colores vecinos S=    c(i)=0S = \emptyset \implies c(i) = 0.
  • 2)   e\; e tiene colores vecinos S=    c(e)=0S = \emptyset \implies c(e) = 0.
  • 3)   k\; k tiene colores vecinos S={0}    c(k)=1S = \{0\} \implies c(k) = 1.
  • 4)   c\; c tiene colores vecinos S={0}    c(c)=1S = \{0\} \implies c(c) = 1.
  • 5)   a\; a tiene colores vecinos S={0,1}    c(a)=2S = \{0, 1\} \implies c(a) = 2.
  • 6)   g\; g tiene colores vecinos S={1,2}    c(g)=3S = \{1, 2\} \implies c(g) = 3.

Por lo tanto, el número cromático de G1G_1 es 33. Podría colorearse de la siguiente forma:


grafo

Para G2G_2, podemos seguir el siguiente orden:

l,d,h,b,j,fl, d, h, b, j, f

Aplicando los pasos del Algoritmo:

  • 1)   l\; l tiene colores vecinos S=    c(l)=0S = \emptyset \implies c(l) = 0.
  • 2)   d\; d tiene colores vecinos S=    c(d)=0S = \emptyset \implies c(d) = 0.
  • 3)   h\; h tiene colores vecinos S={0}    c(h)=1S = \{0\} \implies c(h) = 1.
  • 4)   b\; b tiene colores vecinos S={0}    c(b)=1S = \{0\} \implies c(b) = 1.
  • 5)   j\; j tiene colores vecinos S={0}    c(j)=1S = \{0\} \implies c(j) = 1.
  • 6)   f\; f tiene colores vecinos S={0,1}    c(f)=2S = \{0, 1\} \implies c(f) = 2.

Por lo tanto, el número cromático de G2G_2 es 22. Podría colorearse de la siguiente forma:


grafo

5.

Determinar las valencias de todos los vértices en G1,G2G_1, G_2:

δ(a)=3,  δ(b)=2,  δ(c)=2,  δ(d)=2,  δ(e)=2,  δ(f)=4,δ(g)=2,  δ(h)=3,  δ(i)=2,  δ(j)=2,  δ(k)=3,  δ(l)=3\begin{aligned} \delta(a) = 3, \; \delta(b) = 2, \; \delta(c) = 2, \; \delta(d) = 2, \; \delta(e) = 2, \; \delta(f) = 4, \\ \delta(g) = 2, \; \delta(h) = 3, \; \delta(i) = 2, \; \delta(j) = 2, \; \delta(k) = 3, \; \delta(l) = 3 \end{aligned}
Última vez actualizado el