Documente Academic
Documente Profesional
Documente Cultură
piló por separado en Context). Los otros capítulos del libro son Teoría de conjuntos,
Sistemas numéricos y teoría elemental de números y Conteo. Son apuntes reunidos
durante varios años en los cursos de matemáticas discretas para la carrera de Inge-
niería de Sistemas y Computación y para la Maestría en Ingeniería de Sistemas y
Computación. El capítulo tiene también una sección con problemas para proponer
a los estudiantes.
1
Invitación a la Matemática Discreta.
2
Grafos
1 Grafos
1.1 Introducción
Pero en otra carta del mismo año al matemático italiano Giovanni Marinoni dice:
“El problema es tan banal, pero me parece que merece la atención pues ni la
geometría, ni el algebra, ni el arte de contar son suficientes para resolverlo.
En vista de esto, se me ocurrió preguntarme si pertenece a la geometría de
la posición 1, la que Leibniz a trabajado tanto.”
Finalmente, también en 1736, Euler presentó a la academia de St. Petersburgo el
artículo "Solutio problematis ad geometriam situs pertinentis" que fue publicado
en 1741. En ese artículo no solo solucionaba el problema de los siete puentes de
Königsberg, también generalizaba su solución a cualquier configuración.
3
Grafos
4
Grafos
¿Cómo se puede modelar este problema? Imitando a Euler, omitiendo toda infor-
mación irrelevante para el problema como el ancho de las avenidas o los tiempos de
los semáforos, es claro que lo único que importa para este problema son los flujos
vehiculares que se intersectan y entonces podemos relacionar este problema con un
grafo en el que los vértices corresponden a los diferentes cruces permitidos y en el
que un arco entre dos vértices indica que los cruces correspondientes se intersectan.
Los giros en las esquinas no se consideran pues no interfieren con ningún otro cruce.
Lo que importa es que dos cruces que se intersecten no tengan semáforo en verde
simultáneamente. Se pueden entonces etiquetar los vértices de algún modo para
indicar que se puede hacer el cruce, pero hay que hacerlo de modo que dos vértices
unidos por un arco no tengan la misma etiqueta y tratando de usar el número mínimo
de etiquetas. Visto así, el problema se vuelve un caso particular de un importante
problema llamado el problema del coloreado de un grafo que básicamente consiste en
asignar a cada vértice del grafo un color, buscando usar la menor cantidad posible
de colores con la condición de que dos vértices que estén conectados por un arco no
tengan el mismo color.
Pero, mas interesante aun, resulta que muchos otros problemas aparentemente difer-
entes, como el mencionado problema de los cuatro colores o el problema de la pro-
gramación de exámenes en una facultad para mencionar solo dos, también se pueden
modelar como problemas de coloreado de grafos.
5
Grafos
Informalmente un grafo es una idea abstracta que representa conexiones entre obje-
tos. Formalmente un grafo G es una pareja (V, A), donde V es un conjunto cuyos el-
ementos son llamados vértices y A es un subconjunto del conjunto {{u, v}| u, v ∈ V }
cuyos elementos son llamados arcos o aristas. Para referirse a un arco {u, v} se usan
etiquetas como a = {u, v} o simplemente se escribe uv. Los vértices de un grafo
se suelen etiquetar numerandolos como {v1 , . . . , vn } o simplemente con los números
naturales 1, . . . , n.
En los grafos dirigidos, también llamados digrafos, el conjunto de arcos A es un
subconjunto de (V × V ) − ∆, i.e., cada arco es un par ordenado con componentes
distintas. Los grafos se representan (por lo menos en los casos simples) mediante
dibujos en el plano en los que los vértices son puntos o pequeños nodos y los arcos
son líneas o curvas que unen los vértices correspondientes.
6
Grafos
la función φ es:
1 2 3 4 5 6 7 8
φ= E
E A A C B B D
A C C D B D F F
Se dice entonces que, por ejemplo, el arco 1 es incidente con los vértices E y A, y
también que los vértices E y A son incidentes con el arco 1. Si uv es un arco en un
grafo no dirigido, también se dice que u y v son los extremos del arco.
N (v) = {x| xv ∈ A ∨ vx ∈ A}
7
Grafos
Los grados mínimos y máximos de un grafo se representan con δ(G) y ∆(G), respec-
tivamente.
• u = v0 y v = vl .
• vi vi+1 ∈ A i = 0, . . . , l − 1
3 walk en inglés.
8
Grafos
9
Grafos
10
Grafos
Proposición 1 Si (Ak )i,j = m, entonces hay m paseos distintos para ir del vértice
i al vértice j en exactamente k pasos.
Para l = 1, . . . , n:
− Si ail = 1, hay un arco que conecta el vértice i con el vértice l. Por hipótesis
de inducción mlj nos dice que hay mlj paseos distintos de longitud k del
vértice l al vértice j. Entonces también hay mlj paseos distintos del arco i al
arco j (que empiezan con el arco il) de longitud k + 1.
Así, la anterior suma nos da el total de paseos distintos del vértice i al vértice j
de longitud k + 1.
11
Grafos
a b c d e f g h
1 1 0 1 1 0 0 0 0
2 0 0 0 0 1 1 1 0
3 0 1 1 0 1 0 0 0
4 0 0 0 1 0 1 0 1
5 1 1 0 0 0 0 0 0
6 0 0 0 0 0 0 1 1
Otra forma muy usada para representar grafos es usando listas de adyacencia. Aquí
un grafo se puede representar como un diccionario en el que las claves son los nom-
bres de los vértices y los valores son conjuntos o listas A formados por los vértices
conectados con la clave.
ui → Ai = [vi1 , . . . , vik ]
Para los digrafos la orientación de los arcos es ui vik . Por ejemplo, la representación
con listas de adyacencia del grafo de la figura 1.10 es (Scala):
12
Grafos
Figura 1.10
Para cada caso en particular, una representación puede ser mas conveniente que otra.
Por ejemplo, si se quiere determinar si en un grafo existe un arco uv, la representación
matricial requiere tiempo constante mientras que la representación con listas de
adyacencia requiere un tiempo O(|V |). Y no solamente influye la representación del
grafo, también puede influir la relación entre el número de vértices y el número de
arcos. Las siguientes son dos definiciones relacionadas con esto último:
Digrafos Acíclicos
Cuando se trabaja con digrafos (como por ejemplo en las redes Bayesianas) un prob-
lema muy común consiste en determinar si el digrafo no tiene ciclos. Un algoritmo
que resuelve este problema se basa en algunas propiedades de los digrafos como la
siguiente:
13
Grafos
Después se crea una lista L con aquellos vértices v para los que d− (v) = 0
En caso de que no existan vértices con d− (i) = 0, según el lema 1, el algoritmo debe
retornar que el digrafo no es acíclico.
El algoritmo también puede retornar un ordenamiento topológico de los vértices. Un
ordenamiento topológico es una enumeración ϕ de los vértices tal que para cada
arco ij se cumpla que ϕ(i) < ϕ(j). También puede verse como un cambio en las
etiquetas de los vértices de modo que para cada arco ij se cumpla que i < j.
k=1
Mientras L 6= ∅ haga
Elimine el primer vértice v de L
ϕ(v) ← k; k ← k + 1
Para cada w ∈ Av haga
d− (w) ← d− (w) − 1
Si d− (w) = 0 agrege w a L
14
Grafos
Una estrategia para resolver este problema consiste en recorrer todo el grafo ha-
ciendo corto-circuito en cada vértice. El corto circuito consiste en agregar arcos que
conecten todos los predecesores del vértice con todos los sucesores del vértice. El
siguiente es un seudocódigo para este algoritmo; pred(v, G) es el conjunto formado
por los vértices predecesores de v en el digrafo G y suc(v, G) el conjunto formado
por los vértices sucesores:
Para cada v en G
Para cada x en pred(v, G)
Para cada y en suc(v, G)
agregar (x, y) a los arcos
Supongamos que el grafo está representado como una lista de adyacencia de la forma:
G = [(v1 , sv1 ), (v2 , sv2 ), . . . , (vn , svn )]
cerraduraTrans(G)=
vs= map(G, (x,_) -> x )
foldl(vs
(inG,x) -> cortoc(x, (suc x inG))
inG)
15
Grafos
3. Mientras Q 6= ∅
Sacar el primer elemento de Q, llamemoslo v.
Para cada arco vw
Si w no ha sido visitado
i. Marcarlo como visitado
ii. Meter w a la cola
Y después de 3i:
Si w no ha sido explorado, haga dist(w) = dist(v) + 1
16
Grafos
Explorar(vértice v)
Marcar v como visitado
Para cada arco vw en E haga
si w no visitado
Explorar(w)
DFS(grafo G)
Todos los vértices se marcan inicialmente como no visitados.
Para v=1 hasta n haga
Si v no visitado
Explorar(w)
Explorar(vértice v)
Marcar v como visitado
previsitar(v)
Para cada arco vw en E haga
si w no visitado
Explorar(w)
posvisitar(v)
17
Grafos
Inicializar ck en 1.
previsitar(v)
pre(v) ←ck
ck ←ck + 1
posvisitar(v)
pos(v) ←ck
ck ←ck + 1
1.5 Isomorfismo
18
Grafos
n 1 2 3 4 5 6 7 8 9
g 1 2 8 64 1024 32768 2 097 152 268 435 456 236
gni 1 2 4 11 34 156 1044 12 346 274 668
Tabla 1.1 Número de grafos y de grafos no isomorfos.
La pregunta inmediata es por un algoritmo que determine si dos grafos dados son
isomorfos o no. Nuevamente se podría pensar en usar alguna propiedad matemática
de sus representaciones. Dos matrices A1 y A2 de tamaño n × n son equivalentes
por permutaciones si una se obtiene a partir de la otra haciendo un reordenamiento
de sus filas y el correspondiente reordenamiento de columnas ,i.e., si hay una matriz
de permutación P tal que A1 = P A2 P −1 .
Puede demostrarse que dos (di)grafos, G1 y G2 , son isomorfos si y solo si sus matrices
de adyacencia, A1 y A2 , son equivalentes por permutaciones. Y las matrices son
equivalentes si pertenecen a la misma clase de equivalencia. Este resultado puede
ser la base para un algoritmo ‘ingenuo’ que determine si dos grafos son isomorfos
como el siguiente (ver D. Joyner)
Para i=1, 2
pi ←clase de equivalencia por permutaciones de Ai
A0i ←elemento lexicográficamente maximal de pi
Si A01 = A02 entonces los grafos son isomorfos.
19
Grafos
Supongamos que un probador quiere probarle a un juez que sabe que dos grafos
G0 , G1 son isomorfos. El probador conoce el isomorfismo π entre los grafos pero no
quiere que nadie mas lo conozca. El siguiente ejemplo sencillo ilustra el proceso:
1 2 3 4 5
π=
a c e b d
20
Grafos
π ρ
G0 G1 ρ(G1 ) = H
−→ −→
El isomorfismo que el probador le entrega al juez es entonces:
a b c d e
2 1 5 3 4
Un grafo G = (V, A) es conexo si para toda partición del conjunto V en dos sub-
conjuntos no vacíos X, Y , hay por lo menos una arista con un extremo en X y el
otro extremo en Y . O lo que es equivalente, si para cada par de vértices u, v en el
grafo, hay por lo menos una trayectoria de u a v.
En un grafo G se define la siguiente relación en el conjunto V:
Si u, v ∈ V, uRv si y solo si hay una trayectoria de u a v.
Esta relación es una relación de equivalencia y sus clases de equivalencia se llaman
las componentes conexas del grafo.
Una pequeña modificación al algoritmo DFS permite encontrar cuantas componentes
conexas tiene un grafo enumerandolas, con la variable cc, y ubicando a cada vértice
en una de esas componentes conexas, su número de componente conexa, ncc. La
idea principal es que la función Explorar encuentra la componente conexa de v.
Entonces simplemente se trata de usar un contador que cambie cada vez que termine
la exploración de un vértice.
Explorar(vértice v)
Marcar v como visitado
ncc ← cc
Para cada arco vw en E haga
si w no visitado
Explorar(w)
21
Grafos
DFS(grafo G)
cc ← 1
Todos los vértices se marcan inicialmente como no visitados.
Para v=1 hasta n haga
Si v no visitado
Explorar(w)
cc ← cc + 1
Proposición 2 En todo grafo, la suma de los grados de los vértices debe ser par
pues:
X
d(v) = 2|A|
v∈V
Corolario 2 En todo grafo G hay un número par de vértices con grado impar.
Si se particiona el conjunto V en dos subconjuntos, Vp con los vértices de grado par
y Vi con los vértices de grado impar se tiene que:
X X X
d(v) = d(v) + d(v) = 2|A|
v∈V v∈Vp v∈Vi
22
Grafos
y si a un número par se le suma otro número y el resultado es par, ese otro número
debe ser par.
n−1
Proposición 3 Sea G un grafo con n vértices. Si δ ≥ 2 , entonces G es conexo.
pues k1 + k2 + 1 = k + 1 y n1 + n2 = n.
23
Grafos
Dem. Sea v0 v1 . . . vk una trayectoria maximal en G. Todos los vecinos del vértice
vk deben estar en la trayectoria, pues si alguno no lo está la trayectoria se podría
extender y no sería maximal. Por lo tanto k ≥ d(vk ) ≥ δ(G).
Sea i el valor mínimo para el que vi vk ∈ A. Entonces vi . . . vk vi es un ciclo de
longitud mayor o igual a d(vk ) + 1 ≥ δ(G) + 1.
cc(G) = cc(G0 ) ≥ |V | − n ≥ |V | − (n + 1)
cc(G) = cc(G0 ) − 1 ≥ |V | − n − 1 = |V | − (n + 1)
24
Grafos
25
Grafos
C = I ∨ A ∨ A2 ∨ · · · ∨ Am
donde m es el número de arcos del grafo, Cij será igual a 1 si y solo si hay una
trayectoria del vértice i al vértice j pues en el peor de los casos la trayectoria
que une estos vértices pasa por todos los arcos del grafo. Se incluye la matriz I
pues es posible llegar de un vértice a él mismo en 0 pasos. Por lo tanto la fila
i de la matriz C ∧ C t tendrá un 1 en la columna j si y solo si los vértices i y j
están en la misma componente fuertemente conexa.
26
Grafos
se tiene lo siguiente:
Cij = 0 si y solo si Dij = 0
Cij = 1 si y solo si Dij > 0
Obviamente la serie seguramente no es convergente. Pero de serlo, la matriz D
tendría la siguiente propiedad:
(I − A)D = D − AD
= I + A + A2 + · · · − A − A 2 − · · ·
=I
var b = eye(n)
var d = inv(b - a)
var dt = d~
var c = zeros(n)
for (i<- 0 to n-1){ for (j<- 0 to n-1) c(i,j)= d(i,j)*dt(i,j)}
11 Graph Algorithms In The Language Of Linear Algebra. Jeremy Keper, John Gilbert. eds. Chapter
3. Charles M. Rader. Siam
27
Grafos
1.138 0.071 0.071 0.071 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.071 1.138 0.071 0.071 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.071 0.071 1.138 0.071 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.071 0.071 0.071 1.138 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 1.306 0.163 0.163 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.163 1.306 0.163 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.163 0.163 1.306 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.306 0.163 0.163
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.163 1.306 0.163
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.163 0.163 1.306
1.9 k−conectividad
28
Grafos
Dem. Supongamos primero que λ(G) > δ(G) y sea v un vértice de grado δ(G). Si
se eliminan los δ(G) arcos incidentes con v el grafo se desconecta y por lo tanto
λ(G) ≤ δ(G); contradicción.
Supongamos ahora que κ(G) > λ(G). Sea S un conjunto de arcos con |S| = λ(G)
y tal que G − S es no conexo. Se pueden eliminar λ(G) vértices de G escogidos de
manera que el grafo se desconecta. Por lo tanto κ(G) ≤ λ(G); contradicción.
• uv.
• Una trayectoria uT v en G − uv
29
Grafos
− Qv
Del teorema de Whitney se deduce que un grafo con por lo menos 3 vértices es
2−conexo si y solo si cualquier par de vértices pertenecen a un ciclo común.
30
Grafos
31
Grafos
Una primera observación importante es que el tamaño del corte mínimo en G/uv es
por lo menos tan grande como el tamaño del corte mínimo en G, pues todo corte en
G/uv tiene su correspondiente corte es G con igual cardinalidad. La idea principal
del algoritmo consiste entonces en hacer contracciones hasta tener un grafo con un
solo arco y por lo tanto con un único corte.
El algoritmo Min-Cut
1. G0 ← G
2. i = 0
b. Gi+1 ← Gi /ai
c. i ← i + 1
32
Grafos
Pero es claro, como se ve en la figura, que el tamaño de ese único corte no necesaria-
mente corresponde al tamaño del corte mínimo del grafo original G. ¿ Qué utilidad
tiene entonces este procedimiento? Para garantizar que el tamaño del corte único
sea el mismo que el del corte mínimo de G se deberían contraer arcos que no estén
en un corte minimal; pero para hacer esto hay que conocer el corte minimal de G!
La clave está en calcular la probabilidad de que el tamaño del único corte final
sea el del corte mínimo en G. Si G tiene un corte mínimo de tamaño k, entonces
|A| ≥ kn/2 y por lo tanto la probabilidad de que un arco elegido aleatoriamente esté
en un corte mínimo es como máximo 2/n. Si la elección aleatoria continua hasta
tener un grafo G0 con solamente dos vértices se tiene el siguiente resultado:
Saber, por ejemplo, que para un grafo con 100 vértices (que es un grafo pequeño)
la probabilidad de que Min-Cut retorne una solucíon correcta es mayor a 0,0001980
no parece de gran utilidad. ¿Cómo hacer que esa probabilidad sea mayor? Para
aumentar la probabilidad de obtener un corte mínimo correcto, se puede ejecutar
Min-Cut varias veces guardando el mínimo de todas las ejecuciones . El algoritmo
MinCutRep consiste en ejecutar Min-Cut n(n − 1) veces, y se tiene entonces este
resultado
Así:
2 n(n−1) − 2 n(n−1)
1− ≤ e n(n−1) = e−2 ' 0.14
n(n − 1)
El algoritmo de Dijkstra
Consideremos un grafo con pesos positivos. Dada una trayectoria T entre dos vér-
tices u, v, se define el costo de esa trayectoria, c(T ), como
X
c(T ) = δ(ai )
ai ∈T
33
Grafos
Dijkstra(G: grafo, δ)
Inicialización.
2. Mientras X 6= V ,
De todos los arcos (v, w) ∈ A tal que v ∈ X, w ∈
/X
b. Agregar w∗ a X.
Figura 1.17
34
Grafos
X s a c b d
A s a c b d
0 4 5 7 10
B s a c b d
∅ sa sc sc, cb sa, ad
Tabla 1.2 Resultado parcial
del algoritmo de Dijkstra.
X s a c b d e g f h
A s a c b d e g f h
0 4 5 7 10 12 14 14 16
B s a c b d e g f h
∅ sa sc sc, cb sa, ad sc, cb, be sa, ad, dg sa, ad, df sa, ad, dg, gh
35
Grafos
Sea L[v] el costo de la ruta de costo mínimo desde s hasta v. Se debe probar que
A[v] = L[v].
Caso base. X = [s]. A[s] = L[s] = 0.
Hipótesis inductiva: ∀v ∈ X A[v] = L[v] y B[v] es la ruta de menor costo desde
s hasta v.
En el siguiente paso el algoritmo selecciona un nuevo vértice w∗ usando el criterio
voraz de Dijkstra y hace A[w∗] = A[v∗] + δ(v ∗ w∗). Probemos que toda trayectoria
s hasta w∗ tiene un costo mayor o igual a ese valor.
Sea P cualquier trayectoria desde s hasta w∗. En algún momento la trayectoria P
debe pasar del conjunto X al conjunto V − X, digamos en el arco yz. El criterio
voraz de Dijkstra asegura que
A[v∗] + δ(v ∗ w∗) ≤ A[y] + δ(yz) ≤ A[y] + δ(yz) + c(zw∗)
donde c(zw∗) es el costo de ir del vértice z al vértice w∗ que no puede ser negativo.
Por lo tanto, usando la hipótesis inductiva:
L[w∗] = L[v∗] + δ(v ∗ w∗)
Los problemas en teoría de grafos dan origen a algoritmos que, en muchas ocasiones,
a su vez crean nuevas ideas matemáticas. Consideremos un grafo con pesos. En este
caso su matriz de adyacencia C no es binaria; ahora la componente cij de esta matriz
corresponde al peso del arco que conecta los vértices vi , vj . Si los vértices no son
adyacentes cij no es cero, es ∞.
Entonces las componentes de la i−esima fila de esa matriz, ci1 , ci2 , . . . cin son los
pesos de los arcos del vértice vi a todos los demás vértices. Y las componentes de
la j−esima columna de esa matriz, c1j , c2j , . . . cnj son los pesos de los arcos que de
36
Grafos
todos los vértices llegan al vértice vj . Esto se puede ilustrar con la figura 1.19 (no
todos los arcos necesariamente existen)
Por ejemplo:
0 3 1 2 4 3 2 2 3
A = 2 1 0B = 0 1 1 A min. + B = 1 1 2
3 2 1 2 1 3 2 2 3
12 Graph Algorithms In The Language Of Linear Algebra. Jeremy Keper, John Gilbert. eds. Chapter
3. Charles M. Rader. Siam
37
Grafos
Se puede probar por inducción que (An )ij es el valor de la trayectoria de menor
costo para ir del vértice i al vértice j en n pasos (teniendo presente que un paso
puede ser ir de un vértice a él mismo).
Según el principio de Bellman, todas las subtrayectorias de una trayectoria óptima
deben ser también óptimas. Aplicando este principio se deduce que la exponencial
diamante tiene una propiedad similar a la exponencial usual:
A(p+q) = Ap min. + Aq
38
Grafos
1.11 Árboles
Un grafo sin ciclos es llamado un bosque. Un árbol es un grafo conexo sin ciclos.
Un arco en un grafo conexo es llamado un puente si al eliminar el arco el grafo
resulta no conexo.
Dem. Supongamos que en algún árbol T hay un arco vw que no es puente. Entonces
al eliminar este arco el grafo sigue siendo conexo y por lo tanto debe existir alguna
trayectoria P = w, v2 , . . . , v. Pero entonces al agregar el arco vw al inicio de esta
trayectoria se obtendría un ciclo en el árbol original. Contradicción.
Proposición 10 Todo árbol con por lo menos 2 vértices tiene por lo menos dos
hojas.
39
Grafos
Supongamos que la propiedad es cierta para todo árbol con menos de n vértices y
sea T un árbol con n vértices.
Sea a un elemento cualquiera de A. Como a es puente, T − a tiene dos componentes
conexas que son árboles T1 = (V1 , A1 ), T2 = (V2 , A2 ). Por hipótesis de inducción:
|v1 | = |A1 | + 1 |v2 | = |A2 | + 1
pero |V1 | + |V2 | = |V | y |A1 | + 1 + |A2 | = |A| (se suma 1 por la arista a que se
eliminó) y por o tanto |V | = |A| + 1
Dem. Hay que probar que el grafo es conexo. Supongamos que G tiene componentes
conexas Gi = (Vi , Ai ), i = 1, . . . , k.
Cada componente conexa es un árbol (no hay ciclos) y por lo tanto
|Vi | = |Ai | + 1, i = 1, . . . , k
pero
k
X k
X
|V | = |Vi | y |A| = |Ai |
i=1 i=1
y entonces:
k
X k
X
n − 1 = |A| = |Ai | = |Vi | − 1 = n − k
i=1 i=1
y por lo tanto k = 1.
40
Grafos
El código de Prüfer
ii. En la primera fila aparecen todos los vértices, menos el cero, exactamente una
vez.
Sin embargo este código (llamado el código padre) no es óptimo pues no toda sucesión
de n − 1 enteros corresponde a un árbol.
Pero se puede hacer la siguiente variante. Los vértices que aparecen en la primera
fila del código padre se pueden ordenar de la siguiente forma: Se escoje un vértice
de grado 1 (distinto de 0) con la menor etiqueta, se pone en el arreglo y se eliminan
41
Grafos
vértice y arco del árbol. Se continua así hasta listar todos los arcos. El resultado
obtenido es llamado el código de Prüfer extendido. El siguiente es un ejemplo.
1 2 5 6 4 8 9 10 11 3 12 13 14 7
11 11 4 4 3 3 0 0 3 0 7 7 7 0
Tabla 1.4 Código de Prüfer extendido.
El segundo de los anteriores resultados parece ser una desventaja; ¿En qué orden
deben ir los vértices? Pero este código tiene dos propiedades muy interesantes
Sorprendente!!
42
Grafos
Teorema de Cayley
Para un conjunto de n vértices hay nn−2 posibles árboles
Un árbol con raíz, denotado (T, r), es un árbol en el que hay un vértice distinguido
r llamado la raíz.
Dos árboles con raíz (T, r), (T 0 , r0 ) son isomorfos, denotado con T ' T 0 , si existe
un isomorfismo de grafos φ : T → T 0 tal que φ(r) = r0 .
Un árbol plantado es un árbol con raíz en el que los hijos de cada vértice están en
algún orden lineal. Un isomorfismo entre árboles plantados, denotado con T ∼ = T 0 , es
un isomorfismo de árboles con raíz que preserva el orden en los hijos de cada vértice.
Dos árboles pueden ser isomorfos como árboles con raíz, pero no ser isomorfos como
árboles plantados como se muestra en la figura 1.24.
A cada árbol plantado se le puede asignar recursivamente un código binario de la
siguiente manera:
43
Grafos
Nótese que en el código resultante debe haber un número par de bits y el número
de ceros debe ser igual al número de unos. Pero esta no es una condición suficiente
para que una cadena de bits sea el código de un árbol plantado como se puede ver
con la cadena 0001110000101111.
Toda codificación debe permitir reconstruir un árbol a partir de un código dado.
Con el siguiente método recursivo se puede reconstruir el árbol:
44
Grafos
ii. Todo código de longitud 2(n + 1) n > 1 debe ser de la forma 0A1. A a su vez
debe ser de la forma A1 . . . At . A1 es el segmento inicial de A más corto con
igual número de ceros y unos, y así sucesivamente.
La anterior codificación se puede extender para el caso de árboles con raíz cambiando
el segundo paso de la codificación así:
ii) Suponga que cada hijo w de un vértice v tiene asignado código A(w). Se enumeran
los hijos de v como w1 w2 . . . wt de modo que (usando el orden lexicográfico):
A(w1 ) ≤ A(w2 ) ≤ · · · ≤ A(wt )
Demostración
Si |V | = 2, C(G) = G.
Si no, sea T 0 = (V 0 , A0 ) el árbol resultante al eliminar todas las hojas de T .
V 0 = {v ∈ V |d(v) > 1} A0 = {vw ∈ A|d(v) > 1, d(w) > 1}
i. Si C(T ) = {v} el código de T es el código del árbol con raíz (T, v).
ii. Si C(T ) = {u, v}, T − uv tiene dos componentes conexas T1 , T2 . Sea A el código
de (T1 , u) y B el código de (T2 , v)
Si A ≤ B, el código de T es el de (T, u)
Si no, el código de T es el de (T, v)
45
Grafos
La anterior proposición parece más que obvia. Sin embargo vamos a mirar tres
demostraciones diferentes con el fin de analizar sus diferencias.
46
Grafos
Ai−1 ∪ {ai } Si (V, Ai−1 ∪ {ai })no tiene ciclos
Ai =
Ai−1 En otro caso
El algoritmo termina cuando |Ai | = n − 1 o cuando i = m. En el primer caso
T = (V, Ai ) es un árbol de cubrimiento. Si el algoritmo termina con k = |Ai | < n−1
el grafo es no conexo con n − k componentes.
El anterior es un algoritmo para encontrar un árbol de cubrimiento. Existen métodos
computacionalmente muy eficientes para verificar la condición: Si (V, Ai−1 ∪ {ai })
no tiene ciclos. Y se puede demostrar que es correcto (ver [5]).
Los algoritmos para recorrer grafos BFS y DFS también se pueden modificar fácil-
mente para construir árboles de cubrimiento (ver [6], cap 5).
kruskal[G=(V, A)]
47
Grafos
Figura 1.26
Se puede ver que el algoritmo de Kruskal obliga a que se cumpla la primera condición.
Una variante del algoritmo de Kruskal consiste en ir borrando arcos del grafo, esco-
giendo siempre para borrar al más costoso y manteniendo la conexidad.
48
Grafos
vértice y en cada paso añadir una nueva hoja u a T hasta que todos los vértices
se hayan unido. u se escoje de modo que el arco que lo conecta a T (el único arco
en la estructura E) sea el de peso mínimo entre los arcos que conectan un vértice
de T con los vértices que aun no estan en T. Nuevamente la versión del algoritmo
que se presenta acá muestra claramente la idea tras el algoritmo. Existen versiones
diferentes, usando por ejemplo la matriz de pesos (ver [6]).
El algoritmo Prim
PRIM(G,l: T)
2. Escoja un vértice s ∈ V
L[s] ← 0
E[s] ← ∅
T EM P ← V
T ←∅
3. Mientras T EM P 6= ∅ :
b. T EM P ← T EM P − u
c. T ← T ∪ E[u]
d. Para todo uv ∈ A:
Si v ∈ T EM P y L[v] > l(uv)
L[v] ← l(uv)
E[v]←{ uv }
4. T
49
Grafos
L v4 v2 v3 v5 v6 v7 v1 v8
0 6 5 6 3 5 4 4
E v4 v2 v3 v5 v6 v7 v1 v8
∅ v1v2 v4v3 v4v5 v5v6 v6v7 v3v1 v6v8
Tabla 1.5 Estructuras de datos resultantes con el algoritmo Prim
50
Grafos
∀uv ∈ A, u ∈ V ∨ v ∈ V
i.e., para todo arco del grafo, por lo menos uno de sus vértices adyacentes pertenece
a S.
Un clique K en un grafo G es un subgrafo K de G completo. El número de vértices
en el clique mas grande en un grafo G es llamado el número clique del grafo, ω(G)
Hay muchos problemas importantes y difíciles relacionados con las anteriores defini-
ciones. Veamos algunos de ellos.
Figura 1.28
51
Grafos
S=∅
Para i = 1 hasta |V | haga
Para j = 1 hasta |S| haga
Si Sj ∪ {vi } es independiente
Sj ← Sj ∪ {vi }, salir
Si no j ← j + 1
Si j > |S| entonces
Sj ← {vi }
S ← S ∪ Sj
Figura 1.29
52
Grafos
Los arcos son todos los pares vi vj con vi ∈ V1 y vj ∈ V2 , excepto los casos en que
j = i+1. Para estos grafos el algoritmo retorna n/2 conjuntos como solución cuando
el caso óptimo son solamente dos conjuntos.
Pero una propiedad interesante del algoritmo piVoraz es que, si se tiene alguna
partición que tenga la propiedad dada, pero que no necesariamente sea minimal, los
vértices del grafo se pueden permutar de modo que al aplicar el algoritmo se pueda
obtener una solución posiblemente mejor, como lo expresa el siguiente teorema 14
Dado un grafo G = (V, A), encontrar un cubrimiento por vértices S que minimice
|S|.
El siguiente es un algoritmo voraz de aproximación para este problema:
C:= ∅
mientras A 6= ∅ haga
seleccione cualquier arco uv ∈ A
C:= C ∪{u, v}
remueva todos los arcos incidentes con u o con v de A
retorne C
El algoritmo es correcto pues solo se remueven arcos que ya están cubiertos. Pero
no necesariamente retorna la solución óptima. Lo que puede verse es que retorna
una 2-aproximación a la solución del problema, pues si S es el conjunto formado
por todos los arcos seleccionados por el algoritmo, entonces |C| = 2|S|. Y como
14 R.M.R. Lewis. A Guide to Graph Colouring. Algorithms and Applications. Springer International
Publishing Switzerland 2016. p31
53
Grafos
todo cubrimiento debe tener por lo menos un vértice de cada arco de S, entonces
opt ≥ |S|. por lo tanto 2opt ≥ 2|S| = |C|.
Tres de los seis problemas NP-completos básicos que proponen son de la teoría de
grafos, dos de ellos tratados en esta sección, el otro más adelante.
• Clique
Dado un grafo G=(V, A) y un entero k ≤ |V |, ¿ tiene G un clique de tamaño k
o mayor?
Demostración
Sea Ḡ = (V, Ā) el grafo complemento de G.
15 Michael R. Garey, David S. Johnson. Computers And Intractability. A Guide to the Theory of
NP-Completeness. W. H. Freeman and Company
54
Grafos
1.14 Emparejamientos
16 Matching en inglés
55
Grafos
Figura 1.31
56
Grafos
Dirigir arcos: X → Y si e ∈/ M ; Y → X si e ∈ M .
Agregar s, t y conectarlos con los vértices libres en X y Y.
Correr BFS y retornar la ruta más corta, P , de s a t.
retorna P − {s, t}
57
Grafos
Match-Bipartito (G)
M =∅
Repetir:
P = Trayectoria-de-Aumento (G, M )
M =M 4P
hasta que P = ∅
58
Grafos
Como todo cubrimiento por vértices de G debe cubrir a M , no pueden haber cubrim-
ientos con menos de |M | vértices.
La demostración del anterior teorema es constructiva pues dado un grafo permite en-
contrar un cubrimiento. Para el ejemplo de la figura 1.33, si se sigue la demostración
se encuentra que U = {2, 5, 8, 11}.
Dem.
⇒ Sea S cualquier subconjunto de X. Si hay un emparejamiento que cubre X,
M (S) ⊆ N (S) y entonces |S| = |M (S)| ≤ |N (S)| para todo S ⊆ U .
⇐ Por inducción fuerte
Si |X| = 1 el resultado es inmediato.
59
Grafos
i. M (x) 6= y
ii. y x M (x)
iii. x y M (y)
El algoritmo de Gale-Shapley
60
Grafos
1. Agregar y a P (x).
61
Grafos
Una trayectoria de Euler en un grafo G es una trayectoria que incluye cada arco del
grafo. Un tour de Euler es una trayectoria de Euler cerrada. Un grafo conexo G es
Euleriano si tiene un tour de Euler.
i. G es Euleriano.
Dem. i) ⇒ ii): Sea T un tour de Euler que inicia en algún vértice v0 ∈ V . Sea v
cualquier vértice diferente de v0 . Cada vez que T llega a v por algún arco, debe salir
por un arco diferente para regresar a v0 , i.e., cada visita del tour a v usa dos arcos.
Como el tour debe recorrer todos los arcos, d(v) debe ser par. Para v0 , cada vez que
T sale, debe regresar. Por lo tanto d(v0 ) también debe ser par.
ii) ⇒ iii): Como δ(G) ≥ 2, G debe tener un ciclo C1 . Si no tuviera ciclos sería
un árbol y los árboles deben tener hojas. Si se eliminan los arcos de este ciclo, el
grado de cada vértice en el ciclo se reduce en dos y sigue siendo par. Si quedan
vértices aislados se pueden remover. Sea G1 el grafo resultante. Si G1 no es vacío se
puede repetir el mismo argumento para llegar a un grafo G2 y continuar asi hasta
llegar a Cn = ∅. El grafo G debe ser entonces la unión arco-disyunta de los ciclos
C1 , . . . , Cn−1 .
62
Grafos
63
Grafos
Si el grafo tiene exactamente dos vértices de grado impar existen trayectorias Eule-
rianas que empiezan en uno de esos vértices y terminan en el otro. Los anteriores
algoritmos se pueden adaptar de inmediato para encontrar esas trayectorias. sim-
plemente se agrega un arco más que conecte los dos vértices impares, se corre el
algoritmo y después de tener el ciclo Euleriano se elimina el arco que se agregó.
Se tiene un grafo G con pesos positivos y se busca un paseo que recorra todos los
arcos del grafo, partiendo de un vértice determinado y volviendo a él, y que tenga
peso total mínimo.
64
Grafos
Otro problema muy similar al de los ciclos de Euler, pero que curiosamente en el
mundo de la complejidad computacional está en sus antípodas es el problema de los
ciclos Hamiltonianos. Un ciclo Hamiltoniano en un grafo es un ciclo que pasa por
todos los vértices del grafo. Los autores de [4] escriben: ‘’Si bien los grafos Eulerianos
admiten una caracterización elegante, aún no se conoce una caracterización decente
de los grafos Hamiltonianos. De hecho, es uno de los problemas no resueltos más
difíciles en teoría de grafos; es un problema NP-completo. Se conocen muchas
65
Grafos
condiciones suficientes para que un grafo sea Hamiltoniano; sin embargo ninguna de
ellas resulta ser una condición necesaria elegante.
El siguiente es un ejemplo de una de esas condiciones. ω(H) es el número de com-
ponentes del grafo H.
Dem. Sea C un ciclo de Hamilton en el grafo G. Es claro que ω(G − S) ≤ ω(C − S).
Si se remueve un vértice v del grafo, C − v es una trayectoria y ω(C − v) = 1. Y
al remover cualquier vértice de una trayectoria, o el número de componentes de la
trayectoria queda igual (si es un vértice extremo), o aumenta en 1, de modo que
ω(C − S) nunca podrá ser mayor que |S|.
66
Grafos
67
Grafos
2. Para i = 1, . . . , n
Sea ci el primer elemento de Li
Para cada j, i < j y xi xj ∈ A, Lj := Lj − ci
El problema con este algoritmo es que el resultado depende no solamente del grafo
sino también de la enumeración de los vértices (se puede repetir el anterior ejemplo
con otra enumeración); y por esto diferentes enumeraciones pueden producir difer-
entes coloreados. Es posible que el algoritmo use una cantidad de colores mucho
más grande que el número cromático del grafo.
17 La demostración se puede consultar en Robert A. Wilson. Graphs, Colourings and the Four-Colour
Theorem. Oxford University Press
68
Grafos
i Li ci
1 (1) 1
2 (2) 2
3 (1, 3) 1
4 ( 2, 3, 4) 2
5 (1, 3, 4, 5) 1
6 (2, 3, 4, 5, 6) 2
7 (3, 4, 5, 6, 7) 3
También se puede plantear el problema del coloreado de arcos, que consiste en asignar
a cada arco de un grafo un color de forma que arcos que tengan un vértice en común
tengan distintos colores. Se define el número arco-cromático de G, χ´(G), como
el menor número de colores necesarios para arco-colorear el grafo G. Un resultado
interesante para este problema es que el equivalente del teorema de Brooks muestra
que para cualquier grafo G, χ´(G) solamente puede ser uno de dos posibles valores.
69
Grafos
Evidente si n = 3.
Si n > 3, se escogen dos vértices u, v unidos por una diagonal. Primero se asigna
el color 1 a u y el color 2 a v. Esta diagonal separa al grafo en dos subgrafos
triangulados que, por inducción son 3−coloreables y la unión de esos coloreados es
una coloración para el grafo. completo.
Finalmente, todo triángulo tiene un vértice de color 1 y hay a lo más b n3 c con este
color. Esos son los puntos en los que se ubican los guardas y todo el museo queda
vigilado.
70
Grafos
Un grafo planar es un grafo que se puede dibujar en un plano de forma tal que sus
arcos no se intersecten. Las regiones delimitadas por los arcos de un grafo planar
son llamadas sus caras.
• Pueden aparecer arcos paralelos y la región entre ellos sería una cara. Si esto
sucede se pueden unir los dos arcos paralelos en uno solo de modo que se reduce
la cantidad de arcos en dos, el número de caras en uno y el número de vértices
en uno y entonces el número v − a + c tampoco cambia.
v − a + c = (a + 2) − (a + 1) + 1 = 2
ii. G tiene por lo menos un ciclo. Seleccione un árbol span y un arco uv que esté en
el ciclo pero no en el árbol. Si se elimina ese arco, el número de caras se reduce
71
Grafos
Dem. Supongamos que el grafo K5 fuera planar. Como en ese grafo v = 5, a = 10,
por la fórmula de Euler el número de caras debe ser 7. Ahora, como cada arco limita
dos caras se tiene que 2a = pc donde p es el número promedio de lados en todas las
caras del grafo. Pero p ≥ 3 y por lo tanto 2a ≥ 3c. Reemplazando los valores de a
y c se concluye que 20 ≥ 21; imposible.
Dem. K3,3 es un grafo bipartito y por lo tanto no tiene ciclos impares. Entonces
toda cara debe tener por lo menos 4 arcos de borde. Sea S la suma de todos los
arcos borde de todas las caras de K3,3 . Entonces S ≥ 4c.
Pero al sumar todos los arcos borde, cada arco se cuenta 2 veces y por lo tanto
S ≤ 2a. Así:
a 9
4c ≤ 2a i.e. c ≤ =
2 2
Por la fórmula de Euler:
c=a−v+2=9−6+2=5
y entonces 5 ≤ 92 . Absurdo.
Uno de los resultados más famosos en teoría de grafos, debida a Kazimiers Kura-
tovski, es una caracterización de los grafos no planares que básicamente establece
que los culpables de la no planaridad de un grafo son esencialmente K3,3 y K5 . Para
entender el teorema es necesaria la siguiente definición. Una subdivisión de un grafo
G es un grafo H que se puede obtener de G mediante la operación de insertar un
número arbitrario de vértices nuevos en cualquier arco. G se considera una sub-
división de sí mismo. Dos grafos H y H’ son llamados homeomorfos si ambos son
isomorfos a subdivisiones del mismo grafo G.
72
Grafos
Para los grafos planares también hay resultados importantes respecto al problema
del coloreado.
Dem. Supongamos que existe un grafo planar en el que d(v) ≥ 6 para todo vértice
v. Entonces:
X
6v ≤ d(v) = 2a ⇒ a ≥ 3v
v∈V
2. d(v) = 5. Los 5 vecinos del vértice v no pueden ser todos adyacentes entre
sí, pues si lo fueran el grafo contendría a K5 y no sería planar. Se escogen
dos vecinos de v, n1 y n2 , no adyacentes. Estos dos vecinos se pueden unir en
un único vértice para tener un nuevo grafo con un vértice menos ( no importa
si aparecen arcos paralelos , se pueden considerar uno solo). Nuevamente por
hipótesis de inducción este nuevo grafo es 5-coloreable. Al volver a separar a n1 y
n2 y regresar al grafo inicial se tiene un grafo 5-coloreado en el que n1 y n2 tienen
el mismo color pero no hay problema porque estos vértices no son adyacentes.
73
Grafos
[1] Dieter Jungnickel. Graphs, Networks and Algorithms. Fourth Edition. Algo-
rithms and Computation in Mathematics - Volume 5. Springer, 2013.
[2] Gross Jonathan, Yellen Jay, Zhang Ping, eds. Handbook of Graph Theory.
Second edition. Discrete Mathematics and its Applications. CRC Press.
[6] Santanu Saha Ray. Graph Theory with Algorithms and its Applications. Springer
India 2013.
[8] Higgins Peter M. Nets, Puzzles, and Postmen. Oxford University Press. 2007
[9] Lovász L. et al. Discrete Mathematics, Elementary And Beyond. Springer 2003.
[10] Dr. Herbert Fleischner. Algorithms in Graph Theory. TU Wien, Database and
Artificial Intelligence Group.
[11] Reinhard Diestel. Graph Theory. Springer - Verlag. Nueva York, 2000.
[12] Richard J. Trudeau. Dots and Lines. The Kent State University Press. 1976.
74