Está en la página 1de 209

Grafos y Combinatoria

Javier Tejel

Grados de Matemáticas y Físicas de la Universidad de


Zaragoza
Grafos y Combinatoria. Javier Tejel III

Estos apuntes son el resultado de organizar el material de trabajo utilizado durante varios años en la
enseñanza de la asignatura “Grafos y Combinatoria”, en diferentes grados y programas de la Universidad
de Zaragoza. En particular, en los Grados de Matemáticas y de Físicas, y en los programas conjuntos de
Físicas y Matemáticas, y de Matemáticas e Informática. Gran parte de estos materiales fueron preparados
por el profesor Alfredo García Olaverri.
Con este material se pretende facilitar la labor de estudio, dando una visión completa, rápida y senci-
lla, tanto desde el punto de vista teórico como práctico, de los diferentes aspectos básicos que aparecen
en los campos de la Combinatoria y la Teoría de Grafos. Se incluyen bastantes ejemplos ilustrativos y
se proponen un gran número de ejercicios, para que se pueda practicar sobre las técnicas y conceptos
explicados. Al final de los apuntes, se proporcionan además las soluciones a esos ejercicios en un anexo.
Estos apuntes no deberían verse como un libro de introducción a la Combinatoria y la Teoría de
Grafos, pues en ellos sólo se recogen los aspectos más importantes que se enseñan durante las aproxima-
damente 60 horas correspondientes a la asignatura. Deben pensarse más bien como una herramienta para
facilitar el estudio de la asignatura. En la bibliografía de las correspondientes guías docentes se reco-
miendan otros libros y manuales para completar y ampliar los contenidos presentados en estos apuntes.
Los apuntes están estructurados en cinco capítulos. Los dos primeros dedicados a la Combinatoria y
los otros tres a la Teoría de Grafos. En el primero de los capítulos se estudian los problemas básicos que
aparecen en combinatoria, además de algunas técnicas básicas para la resolución de dichos problemas. En
el segundo de los capítulos, se da una visión general sobre las funciones generatrices, una herramienta
muy potente para el estudio de problemas de tipo combinatorio, así como su uso en la resolución de
algunas ecuaciones de recurrencia. El tercero de los capitulos está dedicado a introducir la noción de
grafo y a estudiar los primeros problemas sobre grafos: recorrido de un grafo, cálculo de componentes
conexas, etc. En el cuarto de los capítulos se estudian los grafos con costes y se dan los algoritmos básicos
de cálculo de caminos óptimos, de árboles más cortos y de resolución de problemas de planificación de
proyectos. Por último, en el quinto capítulo se estudia el problema del máximo flujo y algunas de sus
aplicaciones.
Índice general

I Elementos de combinatoria 1

1. Combinatoria elemental 2
1.1. Cuatro principios básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2. Variaciones, permutaciones y combinaciones . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.1. Multisets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3. Coeficientes binomiales o números combinatorios . . . . . . . . . . . . . . . . . . . . . 10
1.4. Problemas de distribución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4.1. Bolas iguales y cajas distintas . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4.2. Bolas distintas y cajas iguales . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4.3. Bolas distintas y cajas distintas . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.4.4. Bolas iguales y cajas iguales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.5. Recurrencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.5.1. Coeficientes binomiales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.5.2. Números de Stirling de segunda clase . . . . . . . . . . . . . . . . . . . . . . . 20
1.5.3. Números de Bell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.5.4. Problemas 1’ y 2’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.5.5. Número de particiones de un entero . . . . . . . . . . . . . . . . . . . . . . . . 23
1.5.6. Problema de las propinas (soluciones enteras positivas de una ecuación lineal) . . 24
1.6. El principio de inclusión-exclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.6.1. Derangements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.6.2. Problemas 1’ y 2’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.7. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

2. Funciones generatrices 39
2.1. Funciones generatrices ordinarias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.1.1. Series de potencias formales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.1.2. Algunos ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.1.3. Función generatriz desde el punto de vista analítico . . . . . . . . . . . . . . . . 44
2.1.4. Teorema Binomial generalizado . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.2. Funciones generatrices racionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.2.1. Recurrencias lineales homogéneas con coeficientes constantes . . . . . . . . . . 48
2.2.2. Recurrencias lineales no homogéneas con coeficientes constantes . . . . . . . . 54
2.2.3. Teorema de Schur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
2.3. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

II Teoría de grafos 64

3. Introducción a la teoría de grafos 65


3.1. Grafos no dirigidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
3.1.1. Caminos y ciclos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

V
VI Índice general

3.1.2. Grafos conexos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73


3.1.3. Teorema de Euler para ciclos eulerianos . . . . . . . . . . . . . . . . . . . . . . 73
3.1.4. Árboles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
3.2. Grafos dirigidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.2.1. Caminos y ciclos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
3.2.2. Conectividad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
3.2.3. Grafos acíclicos dirigidos. Sort topológico . . . . . . . . . . . . . . . . . . . . . 85
3.3. Recorrido de un grafo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
3.3.1. Algoritmo BFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
3.3.2. Algoritmo DFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
3.3.3. Componentes fuertemente conexas. Bases y antibases . . . . . . . . . . . . . . . 105
3.4. Algunos problemas de recuento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
3.4.1. Paseos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
3.4.2. Árboles generadores. Teorema matrix-tree . . . . . . . . . . . . . . . . . . . . . 113
3.5. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

4. Grafos con costos 123


4.1. Cálculo de caminos más cortos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
4.1.1. Algoritmo de Dijkstra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
4.1.2. Algoritmo de Bellman-Ford . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
4.1.3. Algoritmo de Ford para un DAG . . . . . . . . . . . . . . . . . . . . . . . . . . 136
4.2. Técnicas PERT-CPM de planificación de proyectos . . . . . . . . . . . . . . . . . . . . 143
4.3. Árboles generadores de costo mínimo . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
4.3.1. Algoritmo de Prim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
4.3.2. Algoritmo de Kruskal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
4.4. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

5. Flujo en redes y aplicaciones 161


5.1. Problema de máximo flujo en una red . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
5.1.1. Algoritmo de Ford y Fulkerson . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
5.1.2. Algoritmo de Edmonds-Karp . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
5.1.3. Teorema de máximo flujo-mínimo corte . . . . . . . . . . . . . . . . . . . . . . 174
5.2. Variantes y extensiones del problema de máximo flujo . . . . . . . . . . . . . . . . . . . 175
5.2.1. Arcos sin capacidad superior . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
5.2.2. Varios orígenes y destinos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
5.2.3. Capacidades en los nodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
5.2.4. Redes no dirigidas y redes mixtas . . . . . . . . . . . . . . . . . . . . . . . . . 178
5.2.5. Restricciones inferiores sobre la capacidad . . . . . . . . . . . . . . . . . . . . 180
5.3. Aplicaciones a conectividad en grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
5.3.1. Teoremas de Menger para arcos . . . . . . . . . . . . . . . . . . . . . . . . . . 183
5.3.2. Teoremas de Menger para nodos . . . . . . . . . . . . . . . . . . . . . . . . . . 187
5.3.3. Teorema de Hall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
5.4. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Parte I

Elementos de combinatoria

1
Capítulo 1

Combinatoria elemental

Todos nosotros nos hemos enfrentado alguna vez a algún problema de tipo combinatorio. Por ejem-
plo, si tenemos una baraja española de 40 cartas, ¿de cuántas formas posibles se pueden elegir seis de
ellas? O, si una heladería vende helados de siete sabores distintos, ¿de cuántas formas distintas se pueden
comprar dos helados? Mientras que la respuesta a la primera de las cuestiones es 3838380, la respuesta
a la segunda es 28.
La combinatoria tiene sus orígenes en el estudio de los juegos de azar, durante los siglos XVII y
XVII, y podría describirse en líneas generales como la rama de las matemáticas que estudia la existencia,
enumeración, análisis y optimización de estructuras discretas. Dado un conjunto de objetos y un con-
junto de reglas, la combinatoria trata de dar respuesta a preguntas como las siguientes: si existe alguna
elección de objetos que satisfaga las reglas dadas, cuántas elecciones hay que satisfagan esas reglas, qué
propiedades adicionales tendrán esas elecciones, o cuál sería la elección óptima en algún sentido.
Algunos ejemplos clásicos son los siguientes:

Un cuadrado mágico de orden n es una matriz n × n construida con los n2 primeros números natu-
rales, de forma que la suma de los números de cada fila, cada columna, y cada diagonal principal
es un mismo número s. Para n = 3, un ejemplo de cuadrado mágico es el siguiente:
 
8 1 6
 3 5 7 
4 9 2

La pregunta asociada a este problema es para qué valores de n se pueden construir cuadrados
mágicos. La respuesta es que para n = 2 no es posible construir un cuadrado mágico, y para n ≥ 3
existen algoritmos que permiten construir cuadrados mágicos.

Dado un tablero de ajedrez 8 × 8 y 32 piezas de dominó de tamaño 2 × 1, todas de ellas iguales,


la pregunta es de cuántas formas distintas se puede cubrir el tablero de ajedrez con esas 32 fichas.
Como las fichas son iguales, la diferencia en los recubrimientos radica en si las piezas de dominó
se colocan de forma horizontal o vertical en el tablero. En 1961, M.E. Fisher demostró que hay
24 · (901)2 recubrimientos distintos.

Consideremos un mapa plano, donde todos los países del mapa son regiones conexas. ¿Cuál es el
número mínimo de colores que necesitamos para colorear cada nación de un color, de forma que
dos naciones con frontera común tengan colores distintos? La respuesta a esta pregunta la da el
conocido Teorema de los cuatro colores, que afirma que para colorear un mapa geográfico plano
sin que dos países colindantes tengan el mismo color, basta con cuatro colores diferentes.

En este capítulo, nos vamos a centrar en los problemas básicos de la combinatoria enumerativa y en
las técnicas básicas para resolverlos.

2
Grafos y Combinatoria. Javier Tejel 3

1.1. Cuatro principios básicos


Antes de pasar a estudiar los primeros problemas de la combinatoria enumerativa, vamos a dar en esta
sección cuatro principios básicos, muy sencillos, que nos serán muy útiles en algunas demostraciones y
en la resolución de problemas.
El primero de ellos es el principio del palomar o principio de Dirichlet, que establece lo siguiente.

Principio 1.1 (Principio del palomar). Si n + 1 objetos se colocan en n cajas, entonces al menos alguna
de las cajas contendrá dos objetos o más.

La demostración de este principio es bastante evidente, pues si en cada caja se coloca a lo más un
objeto, entonces tendríamos a lo más n objetos, lo que contradice que tenemos n + 1 objetos.
Este principio es un caso particular del siguiente resultado más general.

Teorema 1.1 (Versión fuerte del principio del palomar). Sean m1 , m2 , . . . , mn enteros positivos. Si
m1 + m2 + . . . + mn − n + 1 objetos se colocan en n cajas, entonces o la primera caja contiene al menos
m1 objetos, o la segunda caja contiene al menos m2 objetos, ..., o la n-ésima caja contiene al menos mn
objetos.

Demostración. Supongamos que, para i = 1, . . . , n, la caja i contiene menos de mi objetos. Entonces, el


total de objetos en las cajas sería a lo más (m1 − 1) + (m2 − 1) + . . . + (mn − 1) = m1 + m2 + . . . + mn − n,
lo que contradice que el número de objetos es m1 + m2 + . . . + mn − n + 1. Por tanto, en alguna caja i hay
al menos mi elementos.

Por ejemplo, si hemos resuelto 29 ejercicios en una semana, entonces hay un día en el que hemos re-
suelto al menos cinco ejercicios, o si en una clase hay 75 estudiantes, entonces hay al menos 7 estudiantes
que han nacido en el mismo mes.
El segundo de los principios es el principio de adición.

Principio 1.2 (Principio de adición). Supongamos que un conjunto S se puede particionar en m sub-
conjuntos S1 , . . . , Sm , disjuntos dos a dos. El número de elementos en S se puede determinar a través de
la suma del número de elementos en cada uno de los subconjuntos, es decir, |S| = |S1 | + . . . + |Sm |.

La demostración de este principio también es bastante evidente. Cualquier elemento x de S ha de


estar en alguno de los subconjuntos. Como los subconjuntos son disjuntos dos a dos, x sólo puede estar
en uno de los subconjuntos. Por tanto, para contar los elementos de S nos basta con contar los elementos
de cada uno de los subconjuntos y sumar.
Por ejemplo, si queremos calcular cuántos grados ofrece la universidad de Zaragoza, podríamos
dividir el problema en subproblemas, calculando cuántos grados ofrece cada una de las facultades de la
que consta la universidad.
Hay que resaltar en el ejemplo anterior que estamos suponiendo que un grado no es ofertado a la
vez en varias facultades. Si eso sucediera, estaríamos generando un sobreconteo aplicando el principio
de adición. Cuando los subconjuntos S1 , . . . , Sm no son disjuntos, entonces para contar el número de
elementos de S hay que aplicar una técnica más avanzada llamada el principio de inclusión-exclusión,
que veremos en la sección 1.6.
Una consecuencia inmediata de este principio es el principio de la resta.

Principio 1.3 (Principio de la resta). Sea A un conjunto contenido en otro conjunto U. Sea A el com-
plemento de A, es decir, A = {x ∈ U | x ∈/ A}. Entonces el número de elementos en A viene dado por
|A| = |U| − |A|.

Como A y A son disjuntos por definición, y U = A ∪ A, se tiene que |U| = |A| + |A| por el principio
de adición, y en consecuencia |A| = |U| − |A|.
El cuarto y último de los principios es el principio del producto.
4 Capítulo 1. Combinatoria elemental

Principio 1.4 (Principio del producto). Si un proceso de recuento puede describirse como una sucesión
de 2 pasos independientes entre sí, con n1 posibles resultados en el paso 1 y n2 resultados en el paso 2,
entonces el número total de resultados posibles en el proceso es n1 · n2 .

Este principio puede demostrarse, por ejemplo, usando el principio de adición. Sean a1 , . . . , an1 los
posibles resultados en el primer paso y sea S el conjunto de resultados del proceso. Entonces S puede
particionarse en n1 subconjuntos disjuntos S1 , . . . , Sn1 , donde Si contiene todos los resultados del proceso
en los que el resultado en el primer paso es ai . Por el principio de adición, |S| = |S1 | + . . . + |Sn1 |. Al ser
los dos pasos independientes, para cualquier i se tiene que |Si | = n2 , por lo que |S| = n1 · n2 .
Este principio puede generalizarse cuando hay m pasos independientes. Así, si un proceso de recuento
puede describirse como una sucesión de m pasos independientes entre sí, con n1 posibles resultados en
el paso 1, n2 resultados en el paso 2 y así sucesivamente, entonces el número total de resultados posibles
en el proceso es n1 · n2 · . . . · nm .
Por ejemplo, si un restaurante ofrece tres primeros platos, tres segundos platos y dos postres, el
número de menús distintos que se podrían pedir con un primero, un segundo y un tercero es 3 · 3 · 2 = 18.
Para el primer plato tenemos tres posibilidades (primer paso), para el segundo plato tenemos otras tres
(segundo paso) y para el postre tenemos dos posibilidades (tercer paso).

1.2. Variaciones, permutaciones y combinaciones


Los primeros problemas básicos de combinatoria tratan sobre el número de formas de seleccionar
objetos de un conjunto, bien siguiendo ciertas reglas para hacer la selección, bien de forma que los
objetos seleccionados cumplan ciertas propiedades.
Comencemos con el problema más simple, en el que nos dan un conjunto S con n elementos distintos
y queremos seleccionar r de esos n elementos. Hay dos preguntas básicas relacionadas con este problema:

1. De cuántas formas diferentes podemos seleccionar r objetos de ese conjunto S.

2. Cuántas selecciones distintas de r objetos podemos obtener de ese conjunto S.

Así, si S = {a, b, c, d} y queremos seleccionar 2 elementos, entonces tenemos 4 · 3 = 12 formas


distintas de hacer la selección. Pero selecciones distintas, es decir subconjuntos de S con dos elementos,
hay 6.
Cuando se resuelve el problema 1 se suele decir también que se buscan subconjuntos ordenados con
r elementos (ó secuencias de longitud r). Para el problema 2, se suele decir que se buscan subconjuntos
no ordenados.
Hay que resaltar que no estamos interesados en cuáles son esos subconjuntos (ordenados o no ordena-
dos), sino en conocer su número. Aunque ciertamente una forma de calcular ese número de subconjuntos
es generarlos todos. Para el conjunto S = {a, b, c, d} del ejemplo, si r = 2, entonces los 12 subconjuntos
ordenados (secuencias) son {ab, ac, ad, ba, bc, bd, ca, cb, cd, da, db, dc} y los 6 subconjuntos (no ordena-
dos) son {{a, b}, {a, c}, {a, d}, {b, c}, {b, d}, {c, d}}.
El siguiente teorema da respuesta a los problemas 1 y 2.

Teorema 1.2. Sea S un conjunto de n elementos distintos.

1. Las formas diferentes de seleccionar r objetos de S (variaciones de n elementos tomados de r en


r) es:
V (n, r) = n(n − 1) . . . (n − r + 1)
Si r = n (permutaciones de n elementos), entonces

V (n, n) = n(n − 1) . . . 1 = n!
Grafos y Combinatoria. Javier Tejel 5

2. El número de selecciones distintas de r objetos de S (combinaciones de n elementos tomados de


r en r) es:  
n n(n − 1) . . . (n − r + 1)
C(n, r) = =
r r!

Demostración. Para demostrar 1, supongamos 1 ≤ r ≤ n. Si r = 1, hay n posibles elecciones para el


elemento de la secuencia. Por tanto, V (n, 1) = n. Si r > 1, una vez elegido el primer elemento (de n
posibles formas) quedan n − 1 elementos de S, y de entre ellos hemos de elegir secuencias de longitud
r − 1. Aplicando el principio del producto, tenemos

V (n, r) = n V (n − 1, r − 1)

Repitiendo el mismo razonamiento para V (n − 1, r − 1),V (n − 2, r − 2) . . ., obtenemos

V (n, r) = n V (n − 1, r − 1) = n(n − 1) V (n − 2, r − 2) = ...


= n(n − 1) . . .V (n − (r − 1), 1) = n(n − 1) . . . (n − r + 1)

Para demostrar 2, si generamos los C(n, r) subconjuntos no ordenados de S y ordenamos los ele-
mentos de cada subconjunto en las r! formas posibles, entonces obtendremos los V (n, r) subconjuntos
ordenados de S. Por lo tanto,
C(n, r) · r! = V (n, r)
es decir,
V (n, r) n(n − 1) . . . (n − r + 1)
C(n, r) = =
r! r!

A los números nr se les suele llamar coeficientes binomiales. Si se multiplica y divide por (n − r)!,


es fácil comprobar que


 
n n(n − 1) . . . (n − r + 1) n(n − 1) . . . (n − r + 1)(n − r)! n!
C(n, r) = = = =
r r! r! (n − r)! r! (n − r)!

En la próxima sección estudiaremos algunas propiedades adicionales de los coeficientes binomiales.


Veamos ahora algunos ejemplos de aplicación del teorema anterior.

Ejemplo 1.1. A una jefatura de policía llegan a la vez 6 personas sin cita previa para renovar el carnet
de identidad.

¿De cuántas formas podrán pasar esa personas a renovarse el carnet de identidad?

Si ese día sólo pueden ser atendidas 4 personas sin cita previa, ¿de cuántas formas distintas pueden
pasar 4 de esas 6 personas a renovarse el carnet de identidad?

Solución. La respuesta a la primera pregunta es V (6, 6) = 6! = 720, puesto que cualquier orden (per-
mutación) de las 6 personas es válido. La respuesta a la segunda cuestión es V (6, 4) = 6 · 5 · 4 · 3 = 360,
puesto que ahora hay que formar secuencias ordenadas con 4 personas de las 6.

Ejemplo 1.2. Un presidente debe elegir a 5 de sus 20 colaboradores para 5 ministerios. ¿De cuántas
formas puede hacerlo?

Solución. La respuesta es V (20, 5) = 20 · 19 · 18 · 17 · 16 = 1860480. Para el primer ministerio puede


elegir a cualquier de sus 20 colaboradores. Una vez elegido, para el segundo ministerio puede elegir a
cualquiera de los 19 colaboradores restantes, y así sucesivamente.

Ejemplo 1.3. En una empresa se va a formar un grupo de trabajo con 4 de sus 16 trabajadores. ¿Cuántos
grupos de trabajo distintos podrían formarse?
6 Capítulo 1. Combinatoria elemental

16·15·14·13
Solución. La respuesta es C(16, 4) = 4! = 1820, pues se tata de elegir subconjuntos no ordenados
de tamaño 4.

La cantidad V (n, r) también da el número de aplicaciones inyectivas de un conjunto R de r elementos


en un conjunto S de n elementos. Recordad que una aplicación es inyectiva si a elementos distintos de R
les corresponden elementos distintos de S. Entonces, para el primer elemento de R tendremos n posibili-
dades para elegir su imagen. Una vez elegida su imagen, para el segundo elemento de R tendremos n − 1
posibilidades para elegir su imagen, y así sucesivamente. Análogamente, es fácil ver que el número de
aplicaciones biyectivas (a elementos distintos de R les corresponden elementos distintos de S y viceversa)
entre dos conjuntos R y S de tamaño n es V (n, n) = n!.

Corolario 1.1. Sea R un conjunto de r elementos distintos y sea S un conjunto de n elementos distintos,
con r < n. El número de aplicaciones inyectivas de R en S, f : R → S, es V (n, r).

Corolario 1.2. Sean R y S dos conjuntos con n elementos distintos cada uno. El número de aplicaciones
biyectivas de R en S, f : R → S, es V (n, n) = n!.

Nota 1.1. Si S contiene n elementos y r es un entero 1 ≤ r ≤ n, el primer apartado del teorema anterior
nos dice que el número de subconjuntos ordenados es V (n, r) = n(n − 1) . . . (n − r + 1). Notar que si r es
un entero mayor que n, la fórmula anterior nos da el valor 0, lo cual también coincide con el número de
subconjuntos ordenados que tenemos de ese tamaño, pues no hay ninguno. Igualmente, si r > n, entonces
C(n, r) = V (n,r)
r! vale 0, que coincide con el número de subconjuntos de ese tamaño, que no hay.
Por otra parte, el conjunto 0/ siempre es un subconjunto de S, y aunque no tiene sentido ordenar sus
elementos, se suele definir por convenio que V (n, 0) = 1. De esta forma, C(n, 0) = n0 = V (n,0)

0! = 1, y por
tanto C(n, 0) nos da también el número de subconjuntos de tamaño 0 de S (el conjunto 0). / Por convenio,
también se define V (0, 0) = 0! = 1, con lo que C(0, 0) = 00 = 1.

Nota 1.2. Aunque hemos definido V (n, r) y C(n, r) para valores de n enteros, estas cantidades se pueden
definir para cualquier valor x real. Dado un entero r ≥ 0, se puede definir el polinomio V (x, r) en x como
(
x(x − 1) . . . (x − r + 1) si r > 0
V (x, r) =
1 si r = 0

Este polinomio de grado r evaluado en un entero n > 0 nos da el número de subconjuntos ordenados de
tamaño r que contiene un conjunto con n elementos distintos. Igualmente, se puede definir el polinomio
 
x V (x, r)
C(x, r) = =
r r!

Este polinomio (como el anterior de grado r) da el número de subconjuntos de tamaño r que contiene un
conjunto con n elementos distintos, cuando se evalúa en un entero n > 0.

1.2.1. Multisets
En muchas ocasiones, los elementos del conjunto S no son distintos, y se tienen elementos repetidos.
En esos casos, se dice que S es un multiset. Por ejemplo, el conjunto {a, a, a, a, b, b, b, c, d, d} (abrevia-
damente {4 ∗ a, 3 ∗ b, 1 ∗ c, 2 ∗ d}) es un multiset.
Para multisets se pueden plantear las cuestiones equivalentes a 1 y 2. Dado un multiset S con n
elementos y un entero 0 ≤ r ≤ n, las preguntas serían ahora:

1’ Calcular cuantas secuencias (ó submultisets ordenados) con r elementos contiene S.

2’ Calcular cuantos submultisets (no ordenados) con r elementos contiene S.


Grafos y Combinatoria. Javier Tejel 7

Las respuestas a 1’ y 2’ van a depender claramente no sólo de r y de n, sino también del número k
de elementos distintos que contiene S y del número de veces n1 , n2 , . . . , nk que cada elemento aparece
repetido en S. Observar que ni ha de ser positivo para cualquier i y que n1 + n2 + . . . + nk = n. En
el multiset anterior, S = {4 ∗ a, 3 ∗ b, 1 ∗ c, 2 ∗ d}, tenemos que k = 4, n1 = 4, n2 = 3, n3 = 1 y n4 =
2. Para este ejemplo, si r = 2 la respuesta a 1’ es 15 y a 2’ es 9. Las 15 secuencias de longitud 2
son {aa, ab, ac, ad, ba, bb, bc, bd, ca, cb, cd, da, db, dc, dd} y los 9 submultisets son {{a, a}, {a, b}, {a, c},
{a, d}, {b, b}, {b, c}, {b, d}, {c, d}, {d, d}}.
En general, no existen fórmulas cerradas que nos den la solución a los problemas 1’ y 2’. Para
resolver estos problemas, se suelen utilizar recurrencias o el principio de inclusión-exclusión, técnicas
que veremos en las secciones 1.5 y 1.6, respectivamente.
Hay un caso particular para el que sí existe una fórmula cerrada que resuelve el problema 1’.

Teorema 1.3. Sea S un multiset que consta de k elementos distintos a1 , a2 , . . . , ak , cada uno de ellos
repetido n1 , n2 , . . . , nk veces. Si ni > 0, para todo i, y r = n = ∑ki=1 ni , entonces el número de secuencias
ordenadas de S (permutaciones con repetición) es

n!
n1 ! . . . nk !

Demostración. Queremos calcular el número de formas distintas de ordenar estos n elementos, o dicho
de otra forma, el número de secuencias e1 e2 . . . en , donde cada ei es un elemento de S y cada elemento ai
aparece exactamente ni veces en esa secuencia. Observar que a1 aparecerá en n1 posiciones, y por tanto
hay C(n, n1 ) formas de posicionar los elementos ai . Una vez colocados los elementos a1 en la secuencia,
podemos colocar los elementos a2 en las n − n1 posiciones que quedan de C(n − n1 , n2 ) formas distintas.
Igualmente, después de colocados los a1 y a2 , los elementos a3 pueden colocarse de C(n − n1 − n2 , n3 )
formas distintas y así sucesivamente. Por tanto el número buscado es

n!
C(n, n1 )C(n − n1 , n2 ) . . .C(n − n1 − n2 − . . . − nk−1 , nk ) =
n1 ! . . . nk !

Nota 1.3. Notar que para k = 2, el teorema anterior da n1n+n 2



1
. Es decir, el número de subconjuntos de
tamaño n1 de un conjunto de n = n1 + n2 elementos coincide con el número de secuencias de longitud n
formadas usando sólo dos símbolos, digamos los símbolos ◦ y |, donde el símbolo ◦ aparece exactamente
n1 veces y el símbolo | aparece exactamente n2 . Podíamos haber demostrado directamente que estas dos
cantidades coinciden. En efecto, para especificar una secuencia de n = n1 + n2 símbolos, n1 de los cuales
son ◦ y los otros n2 son |, basta con especificar un subconjunto de n1 elementos del conjunto {1, 2, . . . , n},
que indicará en qué posiciones de la secuencia hay ◦ (en las otras posiciones habrá |), y viceversa.

Veamos algún ejemplo de aplicación.

Ejemplo 1.4. ¿Cuántas palabras distintas se pueden formar con todas las letras de la palabra patata?

Solución. Como se trata de calcular permutaciones de un multiset, donde la “a” se repite tres veces, la
6!
“t” se repite dos veces y la “p” se repite una vez, la solución será 3!2! = 60.

Ejemplo 1.5. ¿De cuántas formas se pueden permutar los elementos del multiset {1, 1, 2, 2, 3, 4, 5, 6}, de
forma que el primer y último elemento sean distintos?

Solución. Para encontrar la solución, podemos dividir el problema en cuatro subproblemas disjuntos y
aplicar el principio de adición. Los cuatro casos a considerar van a depender de cuáles son el primer y
último dígito: el uno y el dos (y hay dos posibilidades, el 1 el primero y el 2 el último o viceversa), el
uno y otro número distinto del dos (y hay ocho posibilidades), el dos y otro número distinto (y hay otras
ocho posibilidades), ni el 1 ni el 2 (y hay 12 posibilidades).
8 Capítulo 1. Combinatoria elemental

En el primer caso, fijados el 1 y el 2, los seis elementos restantes se pueden permutar de 6! formas.
En el segundo, fijados el 1 y el otro número, se pueden permutar los elementos restantes de 6! 2! formas
(el dos se repite dos veces). En el tercero, fijados el 2 y el otro número, el resto se puede permutar de
6!
2! formas (el uno se repite dos veces). En el cuarto, fijados el primer número y el último, el resto de los
6!
elementos se pueden permutar de 2!2” formas (el uno se repite dos veces y el 2 se repite dos veces).
6! 6! 6!
En total, 2 · 6! + 8 · 2! + 8 · 2! + 12 · 2!2! formas. Notar que, en cada uno de los subproblemas, estamos
aplicando el principio del producto para contar el número de permutaciones, donde en el primer paso
exploramos las posibilidades para el primer y último dígito, y en el segundo paso las posibilidades para
el resto de los dígitos.

Existe otro caso especial de multiset S en el que los cálculos son sencillos. Es el caso en el que
S contiene n elementos distintos y cada elemento de S se puede utilizar tantas veces como se desee,
no existiendo por tanto límite en el número de veces que un mismo objeto es seleccionado. Decimos
entonces que seleccionamos r objetos de un conjunto S de n elementos distintos, pero permitiendo un
número arbitrario de repeticiones de cualquier objeto. Para este caso particular, las cuestiones 1 y 2
quedan de la siguiente forma.

1∞ Calcular de cuantas formas diferentes podemos seleccionar r elementos de un conjunto S con n


elementos, permitiendo repeticiones arbitrarias de elementos. O equivalentemente, cuantas secuen-
cias de longitud r podemos formar con elementos del conjunto S, permitiendo repeticiones.

2∞ Calcular cuantas selecciones de r elementos podemos obtener de un conjunto S con n elementos,


permitiendo repeticiones.

Por ejemplo, si S = {a, b, c}, hay 9 secuencias ordenadas de tamaño 2, pero sólo 6 selecciones de
tamaño 2. En el primer caso las secuencias son {aa, ab, ac, ba, bb, bc, cc, ca, cb, cc}, y en el segundo caso
las selecciones son {{a, a}, {a, b}, {a, c}, {b, b}, {b, c}, {c, c}}.
El siguiente teorema da respuesta a las preguntas 1∞ y 2∞ .

Teorema 1.4. Sea S un conjunto de n elementos distintos.

1∞ El número de secuencias ordenadas de longitud r > 0 que se pueden formar con los elementos de
S, permitiendo repeticiones (variaciones con repetición), es

V ∞ (n, r) = nr

2∞ El número de secuencias no ordenadas (selecciones) de longitud r > 0 que se pueden formar con
los elementos de S, permitiendo repeticiones (combinaciones con repetición), es
 
∞ n+r−1
C (n, r) =
n−1

Demostración. Demostremos la primera parte. Si r = 1, hay n elecciones para formar una secuencia de
longitud 1, por lo que V ∞ (n, 1) = n. Si r > 1, entonces tenemos n elecciones para el primer elemento
de la secuencia, y una vez elegido ese primer elemento, hemos de elegir secuencias de longitud r − 1 de
entre n elementos. Por tanto,
V ∞ (n, r) = n ·V ∞ (n, r − 1)
Reiterando el proceso,

V ∞ (n, r) = n ·V ∞ (n, r − 1) = n · n ·V ∞ (n, r − 2) = . . . = n · n · . . . ·V ∞ (n, 1) = nr

Para demostrar la segunda parte, supongamos que a1 , . . . , an son los n elementos distintos de S. Con-
sideremos un multiset S′ formado por r símbolos ◦ y n − 1 símbolos |. Veamos que hay una correspon-
dencia biyectiva entre las secuencias de r símbolos ◦ y n − 1 símbolos |, y las selecciones con repetición
Grafos y Combinatoria. Javier Tejel 9

de tamaño r obtenidas de S. A cada secuencia s de S′ le asignaremos un selección con repetición t en S de


la siguiente forma: si s1 , . . . , sn−1 son las posiciones donde aparece el símbolo | en la secuencia s, cons-
truiremos la selección t de S de forma que el elemento ai (i = 1, . . . , n) aparece repetido en t exactamente
ri = si − si−1 − 1 veces (tomando s0 = 0 y sn = r).
Por ejemplo, si n = 4 y r = 7, a la secuencia

| ◦ | ◦ ◦| ◦ ◦ ◦ ◦

le corresponde la selección con repetición

{0 ∗ a1 , 1 ∗ a2 , 2 ∗ a3 , 4 ∗ a4 } = {a2 , a3 , a3 , a4 , a4 , a4 , a4 }

Claramente esta aplicación es inyectiva (a secuencias s distintas les corresponden selecciones con repe-
tición t distintas) y suprayectiva (la selección con repetición r1 ∗ a1 , r2 ∗ a2 , . . . , rk ∗ ak se obtiene de la
secuencia s formada por r1 símbolos ◦, seguidos de un |, después r2 símbolos ◦ y un |,..., y finalmente
rk símbolos ◦). Por tanto, hay tantas selecciones con repetición de tamaño r en S, como secuencias s
(permutaciones con repetición) en S′ . Por el Teorema 1.3, este número es
 
(n + r − 1)! n+r−1
=
(n − 1)! r! n−1

Veamos algunos ejemplos.

Ejemplo 1.6. ¿Cuántos números de cuatro cifras tienen todas sus cifras impares?

Solución. La respuesta es V ∞ (5, 4) = 54 = 625. Para cada una de las cifras, tenemos siempre cinco
posibilidades, los cinco números impares 1, 3, 5, 7 y 9.

Ejemplo 1.7. Una ciudad está pensando en colocar semáforos y gasolineras en 10 cruces de calles. En
algunos cruces no pondrá nada, en otros pondrá sólo semáforos y en el resto semáforo y gasolinera. ¿De
cuántas formas puede hacerlo?

Solución. La respuesta es V ∞ (3, 10) = 310 = 59049. Para cada uno de los cruces, tenemos siempre tres
posibilidades: no poner nada, poner semáforo o poner semáforo y gasolinera.

Ejemplo 1.8. Usando variaciones con repetición, demuestra que el número de subconjuntos de un con-
junto S de n elementos distintos es 2n .

Solución. Sean a1 , . . . , an los n elementos de S. Podemos construir una biyección entre los subconjuntos
de S y las secuencias de tamaño n formadas por ceros y unos. Dada una secuencia s de tamaño n formada
por ceros y unos, la forma de definir un subconjunto t de S es la siguiente: para i = 1, . . . , n, si hay un uno
en la posición i de s, entonces ai pertenecerá a t. Claramente esta aplicación es inyectiva (dos secuencias
distintas definen dos subconjuntos distintos) y suprayectiva (a cada subconjunto de S se le puede asignar
una secuencia de longitud n con ceros y unos). Como el número de secuencias de longitud n con ceros y
unos es 2n (para cada una de las posiciones de la secuencia tenemos dos posibilidades, el cero o el uno),
el número de subconjuntos de S será también 2n .

Ejemplo 1.9. Se lanzan 4 dados iguales. ¿Cuántos resultados diferentes se pueden obtener?

Solución. La respuesta es C∞ (6, 4) = 6+4−1



6−1 = 126. Cada uno de los cuatro dados tiene seis posibili-
dades, pero un mismo resultado, por ejemplo el {1, 4, 3, 5}, se puede obtener de muchas maneras, como
por ejemplo que el primer dado salga 1, el segundo salga 4, el tercero salga 3 y el cuarto salga 5, o que
el primer dado salga 3, el segundo salga 5, el tercero salga 1 y el cuarto salga 4.
10 Capítulo 1. Combinatoria elemental

Ejemplo 1.10. En una heladería que tiene helados de 12 sabores, compramos 4 helados. ¿Cuántas com-
pras distintas podríamos hacer?
Solución. La respuesta es C∞ (12, 4) = 12+4−1

12−1 = 1365. Cada uno de los cuatro helados tiene 12 posi-
bilidades, pero una misma compra se puede obtener de muchas formas, en función de cómo se repartan
los sabores entre los helados.

Nota 1.4. Al igual que se hizo para V (n, r) y C(n, r), se puede definir un polinomio en x de grado r
asociado a V ∞ (n, r) de la forma (
∞ xr si r > 0
V (x, r) =
1 si r = 0
La evaluación de dicho polinomio en un entero n > 0 da las variaciones con repetición de n elementos
tomados de r en r.

1.3. Coeficientes binomiales o números combinatorios


Como ya hemos comentado anteriormente, los coeficientes
 
n n(n − 1) . . . (n − r + 1)
C(n, r) = =
r r(r − 1) . . . 1
suelen denominarse coeficientes binomiales o números combinatorios.
Hay muchas propiedades, relaciones e identidades entre los números combinatorios nr . Estas rela-


ciones pueden probarse, bien utilizando la fórmula de cálculo anterior, o bien por argumentos combina-
torios. Siempre que se pueda, suele ser preferida una demostración combinatoria, pues establece porqué
dos cantidades son iguales. A continuación, se muestran algunas de estas identidades, junto con la idea
fundamental de su demostración.

1. Para r y n enteros tales que r ≥ 0 y n ≥ r,


 
n n!
=
r r! (n − r)!
A partir de la definición de nr , se multiplica y divide por (n − r)!


2. Para r y n enteros tales que r > 0 y n ≥ r,


   
n n
=
r n−r
Si a cada subconjunto de tamaño r le asociamos su complementario, tenemos una biyección entre
los subconjuntos de tamaño r y los subconjuntos de tamaño n − r.
3. Para r > 0 entero,    
n n n−1
=
r r r−1
n

A partir de la definición de r, basta con sacar n del numerador y r del denominador.
4. Fórmula de Pascal. Para r > 0 entero,
     
n n−1 n−1
= +
r r r−1
Además de la demostración basada en la definición de los números combinatorios involucrados,
si n fuese entero, la idea de la demostración combinatoria sería la siguiente: en un subconjunto de
tamaño r de los n elementos, o no está el último elemento y hay que elegir r de los n − 1 restantes
(de n−1r  formas), o está el último elemento y los r − 1 que faltan se eligen entre los n − 1 restantes
(de n−1
r−1 formas).
Grafos y Combinatoria. Javier Tejel 11

5. Para r ≥ 0 entero,        
n n+1 n+r n+r+1
+ +...+ =
0 1 r r
Supongamos que n es entero y que S = {1, 2, . . . , n + r + 1}. La parte derecha de la identidad cuenta
subconjuntos de tamaño r de S. La parte izquierda cuenta también los subconjuntos de tamaño r de
S de una manera distinta. Cuenta subconjuntos de tamaño r cuando el elemento n + r + 1 no está
y se eligen r del resto (de n+r
r formas), subconjuntos de tamaño r cuando el elemento n + r + 1
está, el elemento n + r no está y se eligen r − 1 del resto (de n+r−1

r−1 formas), subconjuntos de
tamaño r cuando los elementos n + r + 1 y n + r están, el elemento n + r − 1 no está y se eligen
n+r−2

r − 2 del resto (de r−2 formas), y así sucesivamente.

6. Para r ≥ 0 entero,        
r r+1 n n+1
+ +...+ =
r r r r+1
Supongamos que n es entero y que S = {1, 2, . . . , n + 1}. La parte derecha cuenta subconjuntos de
tamaño r + 1 de S. La parte izquierda cuenta también esos subconjuntos  de una forma distinta: sub-
r
conjuntos de tamaño r + 1 cuando el mayor elemento es r + 1 (hay r subconjuntos), subconjuntos
de tamaño r + 1 cuando el mayor elemento es r + 2 (hay r+1

r subconjuntos), y así sucesivamente.

Otra identidad muy conocida es la identidad de Vandermonde, que establece lo siguiente.


Teorema 1.5. Dados a, b y r números enteros tales que a > 0, b > 0 y 0 ≤ r ≤ a + b, se tiene que
r     
a b a+b
∑ =
i=0 i r−i r

Demostración. Supongamos que tenemos a + b bolas numeradas 1, . . . , a, a + 1, . . . , a + b. Podemos se-


leccionar a+br subconjuntos de r bolas. Cada subconjunto constará de i bolas de las a primeras (para un
cierto valor de i), que pueden seleccionarse de ai formas distintas, y r −i de las últimas b bolas, que pue-

b

den seleccionarse de r−i formas distintas. Notar que i ha de satisfacer que máx(0, r −b) ≤ i ≤ mı́n(a, r).
b
= 0 cuando i < r −b , y que ai = 0 cuando
 
Sumando entre los posibles valores de i, y aplicando que r−i
i > a, se obtiene la identidad buscada.

En el caso particular de que a = b = r, la identidad anterior nos muestra que


 2  2  2  
r r r 2r
+ +...+ =
0 1 r r
Nota 1.5. La identidad de Vandermonde puede extenderse a números reales (y complejos) a y b.
De entre todas las identidades binomiales, la más conocida es la que damos en el siguiente teorema,
conocido como Teorema binomial.
Teorema 1.6 (Teorema binomial). Para cualquier entero n ≥ 0 y números arbitrarios (reales o comple-
jos) x e y se tiene que
n  
n n r n−r
(x + y) = ∑ xy
r=0 r

Demostración. La demostración es por inducción sobre n. Para n = 0, la identidad es claramente cierta,


puesto que (x + y)0 = 1 y el único sumado de la parte derecha de la igualdad es también 1. Dado n > 0,
supongamos que la identidad es cierta para n − 1. Queremos n
r n−r n
 ver que cuando desarrollamos (x + y) como
suma de potencias de x e y, el coeficiente de x y es r . Aplicando inducción para n − 1, tenemos
!
n−1  
n n−1 n − 1 r n−r−1
(x + y) = (x + y) (x + y) = ∑ xy (x + y)
r=0 r
12 Capítulo 1. Combinatoria elemental

n−1 n−1 n
El coeficiente de xr yn−r al hacer este último producto será
  
r + r−1 , lo cual coincide con r por la
fórmula de Pascal.

En el caso particular de que x = y = 1, el Teorema binomial nos dice que


n  
n n
2 =∑
r=0 r

Como nr cuenta los subconjuntos de tamaño r de un conjunto S de tamaño n, estamos volviendo a




demostrar que el número de subconjuntos de un conjunto S de n elementos distintos es 2n (ver el ejemplo


1.8).

1.4. Problemas de distribución


En la sección 1.2. nos hemos centrado en los problemas de contar secuencias ordenadas o no orde-
nadas de un conjunto S. Otros problemas de conteo básicos son los llamados problemas de distribución.
En estos problemas, se trata de contar de cuántas formas se pueden distribuir una serie de objetos en un
conjunto de compartimentos. Usualmente, a los objetos se les llama bolas y a los compartimentos cajas.
En esta sección vamos a explicar cómo contar las formas de repartir bolas en cajas, dependiendo de
si las bolas se pueden considerar iguales o no, y de si las cajas se pueden considerar iguales o no. En
algunos de los casos, la solución es sencilla, pero en otros no.

1.4.1. Bolas iguales y cajas distintas


Supongamos que tenemos r bolas iguales entre sí y n cajas todas distintas entre sí. En este caso, el
problema de calcular de cuántas formas se pueden colocar las bolas en las cajas es equivalente al pro-
blema de combinaciones con repetición. Las combinaciones con repetición aparecían cuando teníamos
un conjunto S = {a1 , . . . , an } de n elementos distintos y queríamos calcular submultisets (no ordenados)
de tamaño r, donde cualquier elemento de S se podía repetir el número de veces que quisiésemos. Iden-
tificando los n elementos de S con las n cajas distintas, es fácil ver que existe una biyección entre los
submultisets de tamaño r y las formas de meter las r bolas en las n cajas: si en un multiset aparece ni
veces el elemento ai , para i = 1, . . . , n, entonces se colocan ni bolas en la caja i, y viceversa.
Tenemos entonces el siguiente corolario.

Corolario 1.3. Para n y r números enteros  tales que n > 0 y r ≥ 0, el número de formas de repartir r
bolas iguales en n cajas distintas es r+n−1
n−1 .

Hay que notar que estamos permitiendo que haya cajas vacías a la hora de repartir las bolas. Sin
embargo, hay situaciones en las que se exige que haya al menos una bola en cada caja. En ese caso, no
tenemos mas que guardarnos una bola por caja y repartir las r − n bolas restantes de cualquier forma
entre las n cajas.

Corolario 1.4. Para n y r números enteros tales que r ≥ n > 0, el número de formas de  repartir r bolas
r−1
iguales en n cajas distintas, de forma que en cada caja haya al menos una bola, es n−1 .

Veamos algunos ejemplos.

Ejemplo 1.11. ¿De cuántas formas distintas pueden repartirse 13 caramelos iguales entre cuatro niños?

Solución. La respuesta es 13+4−1



4−1 = 560 aplicando el Corolario 1.3, tomando a los niños como las cajas
distintas y a los caramelos como las bolas iguales.

Ejemplo 1.12. ¿De cuántas formas distintas pueden repartirse 13 caramelos iguales entre cuatro niños,
de forma que cada niño reciba al menos un caramelo?
Grafos y Combinatoria. Javier Tejel 13

13−1

Solución. La respuesta es 4−1 = 220, aplicando el Corolario 1.4.

Ejemplo 1.13. Un residente médico tiene que hacer cinco guardias en un hospital durante el mes de
enero, pero no tiene permitido hacer guardias dos días consecutivos. ¿De cuántas formas posibles puede
elegir los cinco días para hacer las guardias?

Solución. La respuesta es 22+6−1



6−1 = 80730. Los cinco días de guardia que se elijan, dividen la secuencia
de los días de enero en seis cajas, en las que hay que colocar el resto de los días no elegidos, con
la restricción de que en las cuatro cajas centrales haya al menos un día para no hacer dos guardias
consecutivas. Luego se trata de repartir 22 días (los 31 de enero, menos los cinco días de las guardias,
menos cuatro días que nos guardamos para colocarlos en las cajas centrales) en 6 cajas.

◦ ◦ ◦| ◦ ◦| ◦ ◦ ◦ ◦| ◦ ◦ ◦ ◦ ◦ ◦| ◦ ◦ ◦ ◦ ◦ | ◦ ◦ ◦ ◦ ◦ ◦

En la figura anterior se representa una posible elección de las guardias (símbolos |), que originan un
reparto de tres días en la primera caja, uno en la segunda (ya nos habíamos guardado un día para esa
caja), tres en la tercera, cinco en la cuarta, cuatro en la quinta y seis en la sexta.

Ejemplo 1.14. ¿Cuál es el número de soluciones enteras y ordenadas de la ecuación x1 +x2 +. . .+xn = r,
con xi ≥ 0 para todo i? ¿Cuál sería ese número si xi > 0 para todo i?

Solución. La respuesta a la primera cuestión es r+n−1



n−1 , pues se trata de repartir r unos (bolas iguales)
r−1

entre las n variables (cajas distintas). Asumiendo r ≥ n, la respuesta a la segunda cuestión es n−1 , pues
a cada variable (caja) hay que asignarle al menos un uno (bola).

Ejemplo 1.15. ¿Cuál es el número de soluciones enteras y ordenadas de la ecuación x1 +x2 +. . .+xn = r,
con xi ≥ bi para todo i, donde los bi son números enteros?
bi +n−1
Solución. La respuesta es r−∑n−1

. Haciendo el cambio yi = xi − bi para todo i, el número de solu-
ciones que nos piden es el mismo que el número de soluciones de la ecuación y1 + y2 + . . . + yn = r − ∑ bi ,
con yi ≥ 0 para todo i.

Hay que resaltar que si los xi tuviesen también una cota superior xi ≤ ni , entonces ya no se pueden
repartir tantos unos como queramos a las variables (ya no aparecen combinaciones con repetición), y el
problema se transforma en un problema de tipo 2’, que más adelante veremos cómo resolver.

Ejemplo 1.16. Dado un entero r > 0, una composición de r en n partes, 1 ≤ n ≤ r, es una secuencia
(a1 , a2 , . . . , an ) de números enteros positivos tales que ∑ni=1 ai = r. Por ejemplo, las composiciones de
r = 5 en tres partes son (3, 1, 1), (1, 3, 1), (1, 1, 3), (2, 2, 1), (2, 1, 2), (1, 2, 2). ¿Cuál es el número de com-
posiciones de r en n partes? ¿Cuál es el número de composiciones de r en cualquier número de partes?
r−1

Solución. La respuesta a la primera pregunta es n−1 , puesto que, por definición, el número de com-
posiciones de r en n partes coincide con el número de soluciones enteras y positivas de la ecuación
r−1

x1 + x2 + . . . + xn = r, que acabamos de ver que es el número combinatorio n−1 . La respuesta a la se-
r−1 r−1
gunda cuestión es ∑rn=1 n−1 . Cambiando el índice de sumación, la cantidad anterior es ∑r−1
 
n=0 n , que
por el Teorema binomial es 2r−1 .

1.4.2. Bolas distintas y cajas iguales


El problema de contar de cuántas formas pueden colocarse r bolas distintas en n cajas iguales es
equivalente a un problema clásico en combinatoria, como es el de encontrar el número de particiones
de un conjunto S.
Dado un conjunto S de r elementos distintos, una partición de S es una colección de bloques no
vacíos, de forma que cada elemento de S pertenezca exactamente a uno de los bloques. Por ejemplo,
si queremos particionar el conjunto S = {1, 2, 3, 4} en dos bloques no vacíos, hay 7 formas de hacerlo:
14 Capítulo 1. Combinatoria elemental

(1)(234), (2)(134), (3)(124), (4)(123), (12)(34), (13)(24) y (14)(23). Por contra, sólo hay una forma de
particionar ese conjunto en un bloque (el bloque (1234)) y sólo hay una forma de particionar el conjunto
en cuatro bloques (los bloques (1)(2)(3)(4)). Observar que la partición (1)(234) y la partición (342)(1)
son la misma. No importa el orden de los bloques, ni el orden de los elementos en cada bloque.
Identificando los bloques con las cajas y los elementos de S (que son distintos) con las bolas, el
problema de calcular el número de formas de colocar r bolas distintas en n cajas iguales es equivalente
al de calcular el número de particiones de un conjunto S de r elementos distintos en n bloques no vacíos.
Hay que notar que, a diferencia del caso de bolas iguales y cajas distintas, en el que se permitían cajas
vacías, ahora no estamos permitiendo cajas (bloques) vacías.
No existe una fórmula cerrada para calcular el número de particiones de un conjunto de r elementos
distintos en i bloques, aunque sí métodos iterativos.
Definición 1.1. Dado un conjunto S de r elementos distintos, al número de particiones de S en i bloques
se le denota por S2 (r, i). A estos números S2 (r, i) se les conoce con el nombre de números de Stirling de
segunda clase (o de segunda especie).
Debido a la equivalencia entre el problema de las particiones de un conjunto y el problema de repartir
bolas distintas en cajas iguales, se tiene el siguiente corolario.
Corolario 1.5. Para cualesquiera enteros r ≥ n ≥ 1, el número de formas de distribuir r bolas distintas
en n cajas iguales, sin que ninguna caja esté vacía, es S2 (r, n).
Algunas propiedades evidentes de los números de Stirling de segunda clase son las siguientes.

S2 (r, 1) = 1 para r > 0, pues si sólo hay un bloque, todos los elementos del conjunto deben ir a ese
bloque.
S2 (r, r) = 1 para r > 0, pues si tenemos r bloques, cada elemento debe ir en un bloque distinto.
S2 (r, i) = 0 si i > r, pues si hay más bloques que elementos, alguno de los bloques estaría vacío, lo
que contradice la definición de partición.
S2 (r, 0) = 0 si r > 0, puesto que si no hay bloques, no se puede formar ninguna partición.
S2 (0, 0) = 1 por convenio.

Aunque todavía no hemos llegado a la sección de las recurrencias, el siguiente teorema muestra cómo
obtener de forma recurrente los números de Stirling de segunda clase.
Teorema 1.7. Para r > 1 y 1 ≤ i ≤ r − 1, se tiene

S2 (r, i) = S2 (r − 1, i − 1) + i S2 (r − 1, i)

Demostración. Vamos realizar una demostración combinatoria de este resultado. Por conveniencia, su-
pondremos que el conjunto S que queremos particionar es S = {1, 2, . . . , r}. La parte izquierda de la
igualdad cuenta las formas de particionar S en i bloques. Veamos que la parte de la derecha también
cuenta esa cantidad. En una partición de S en i bloques, o el elemento r va sólo en un bloque o no.
Si r va sólo en un bloque, los r − 1 elementos restantes se tienen que particionar en i − 1 bloques, de
S2 (r − 1, i − 1) formas distintas. En otro caso, el elemento r irá en uno de los bloques (i posibilidades) en
los que se pueden particionar los r − 1 elementos restantes en i bloques (S2 (r − 1, i) formas).

Nota 1.6. Hay que notar que, como S2 (r, i) = 0 si i > r, entonces la identidad del teorema sigue siendo
cierta para i ≥ r. Además, definiendo S2 (0, i) = 0 para i > 0, entonces la identidad anterior también es
válida cuando r = 1 e i ≥ 1. En definitiva, la identidad del teorema es cierta para r > 0 y 1 ≤ i.
Destacar por último que si se permiten cajas vacías, podemos usar sólo una caja, o dos, o tres, ...,
para repartir las bolas. Entonces, el número de formas de colocar r bolas distintas en n cajas iguales es
∑ni=1 S2 (r, i), donde i representa el número de cajas que se usan para repartir las bolas.
Grafos y Combinatoria. Javier Tejel 15

Nota 1.7. Además de los números de Stirling de segunda clase, también se definen los números de
Stirling de primera clase, que cuentan estructuras combinatorias en las que no vamos a entrar.
Una manera sencilla de definir estos números es la siguiente. Recordar que V (x, r) = x(x − 1) . . . (x −
r + 1) era un polinomio en x de grado r, que claramente tiene coeficientes enteros. Los coeficientes de
ese polinomio (salvo el signo) se denominan números de Stirling de primera clase. En particular, se
denota por S1 (r, i) al coeficiente de xi en V (x, r) multiplicado por (−1)r−i . Por ejemplo, como

V (x, 5) = x5 − 10x4 + 35x3 − 50x2 + 24x

los números de Stirling de primera clase S1 (5, i), para i = 0, . . . , 5, son 0, 24, 50, 35, 10 y 1. Notar que, de
acuerdo con la definición, S1 (r, i) = 0 si i > r. Además, puesto que V (x, 0) = 1, se tiene que S1 (0, 0) = 1
(pero S1 (r, 0) = 0 si r > 0).
Al igual que los números de Stirling de segunda clase, no es difícil demostrar que si 1 ≤ i ≤ r − 1,
los números de Stirling de primera clase satisfacen la siguiente recurrencia

S1 (r, i) = S1 (r − 1, i − 1) + (r − 1) S1 (r − 1, i)

Nota 1.8. Una manera alternativa de definir los números de Stirling de segunda clase, a partir de los
polinomios V (x, r), es la siguiente. El polinomio xr se puede expresar como combinación lineal de los
polinomios V (x, r),V (x, r − 1), . . . ,V (x, 1),V (x, 0). Los coeficientes de esa combinación lineal son pre-
cisamente los números de Stirling de segunda clase. Concretamente, S2 (r, i) es el número por el que hay
que multiplicar a V (x, i) para que la suma de esas cantidades, desde i = 0 hasta i = r, nos dé xr . Por
ejemplo, se puede ver fácilmente que

x5 = V (x, 5) + 10 V (x, 4) + 25 V (x, 3) + 15 V (x, 2) +V (x, 1)

por lo que los números S2 (5, i), para i = 0, . . . , 5, son 0, 1, 15, 25, 10 y 1. No es difícil comprobar que
esos números son precisamente el número de particiones de 5 elementos en 0, 1, 2, 3, 4 y 5 bloques,
respectivamente.

1.4.3. Bolas distintas y cajas distintas


En la sección anterior hemos visto que había 7 (S2 (4, 2)) formas de particionar el conjunto 1,2,3,4 en
2 bloques no vacíos: (1)(234), (2)(134), (3)(124), (4)(123), (12)(34), (13)(24), (14)(23).
Si los bloques son ahora distinguibles, entonces no es lo mismo (1)(234) que (234)(1). En el primer
caso estamos incluyendo el 1 en el primer bloque (caja), mientras que en el segundo estamos incluyendo
2, 3 y 4 en ese bloque. En el ejemplo, si los bloques son distinguibles, entonces hay 14 (S2 (4, 2) 2!) formas
de distribuir los cuatro elementos: (1)(234), (234)(1), (2)(134), (134)(2), (3)(124), (124)(3), (4)(123),
(123)(4), (12)(34), (34)(12), (13)(24), (24)(13), (14)(23), (23)(14). Como los bloques son distinguibles,
lo que estamos haciendo es, fijada una partición, permutar los contenidos de los bloques.
Esa idea permite demostrar el siguiente teorema.

Teorema 1.8. Para cualesquiera enteros r ≥ n ≥ 1, el número de formas de distribuir r bolas distintas en
n cajas distintas, sin que ninguna caja esté vacía, es S2 (r, n) n!.

Demostración. Si S = {1, 2, . . . , r}, podemos particionar S en n bloques de S2 (r, n) formas. Dada una
de esas particiones, etiquetamos sus bloques de 1 a n. Cualquier permutación de esas etiquetas, origina
una forma distinta de colocar las bolas en las distintas cajas; si la etiqueta i está en la posición j de la
permutación, entonces asignamos los elementos del bloque i a la caja j. Por tanto, el número de formas
de distribuir r bolas distintas en n cajas distintas, sin que ninguna caja esté vacía, es S2 (r, n) n!.

Observar que si se permiten cajas vacías, el problema se transforma en un problema de variacio-


nes con repetición, pues para cada una de las bolas tenemos siempre las n cajas disponibles. Así, si se
permiten cajas vacías, habrá V ∞ (n, r) = nr formas de colocar r bolas distintas en n cajas distintas.
16 Capítulo 1. Combinatoria elemental

Una consecuencia del teorema anterior es que el número de aplicaciones suprayectivas entre un
conjunto R de tamaño r y otro S de tamaño n es también S2 (r, n) n!. No hay mas que identificar los
elementos de S con los bloques (cajas) y los elementos de R con las bolas. Recordad que una función es
suprayectiva si todo elemento de S es la imagen de como mínimo un elemento de R.

Corolario 1.6. El número de funciones suprayectivas de un conjunto R de r elementos distintos y un


conjunto S de n elementos distintos, f : R → S, es S2 (r, n) n!.

1.4.4. Bolas iguales y cajas iguales


Analicemos por último el caso en el que las bolas son idénticas y las cajas también son idénticas.
Supongamos que tenemos 7 bolas iguales y 2 cajas iguales. Al ser las cajas iguales, colocar 3 bolas en
la primera caja y 4 en la segunda, es lo mismo que colocar 4 bolas en las primera caja y 3 en la segunda.
Sin embargo, sí que es diferente colocar 2 bolas en un caja y 5 en la segunda. En ambos casos, estamos
descomponiendo el número siete en dos sumandos (en un caso 3 y 4, y en el otro 2 y 5). De hecho, las
formas de colocar siete bolas iguales en dos cajas iguales son 3 (1 y 6, 2 y 5, y 3 y 4), que se corresponden
con las diferentes formas de particionar el número 7 en dos sumandos positivos, sin importar el orden de
los sumandos.
Esto conduce a que el problema de calcular de cuántas formas se pueden colocar r bolas iguales
en n cajas iguales es equivalente al conocido problema de particionar un número r en n sumandos
positivos, sin importar el orden de los sumandos.

Definición 1.2. Sean a1 ≥ a2 ≥ . . . ≥ an ≥ 1 enteros positivos tales que a1 + a2 + . . . + an = r. Entonces


a la secuencia (a1 , a2 , . . . , an ) se la denomina una partición del entero r. Al número total de particiones
de r se le denota por p(r), y al número de particiones de r en exactamente n sumandos se le denota por
pn (r), con lo que p(r) = ∑rn=1 pn (r).

Por ejemplo, si r = 5, entonces las particiones de 5 son

{(5), (4, 1), (3, 2), (3, 1, 1), (2, 2, 1), (2, 1, 1, 1), (1, 1, 1, 1, 1)}

Por tanto, p1 (5) = 1, p2 (5) = 2, p3 (5) = 2, p4 (5) = 1, p5 (5) = 1, y en total p(5) = 7.


Hay que notar que el número de particiones de un entero, p(r), es también el número de soluciones
de
y1 + 2y2 + . . . + ryr = r
con yi ≥ 0 para todo i, ya que cada partición viene especificada por cuantas veces usamos el sumando 1
(y1 veces), el sumando 2 (y2 veces), ..., el sumando r (yr veces).
Como el problema de colocar bolas idénticas en cajas idénticas es equivalente al problema de parti-
cionar r en n sumandos positivos, se tiene el siguiente resultado.

Corolario 1.7. El número de formas de colocar r bolas iguales en n cajas iguales es pn (r).

Como sucedía con los números de Stirling de segunda clase, no existe una fórmula explícita para el
cálculo de pn (r). En la sección 1.5 se verá cómo calcular pn (r) y p(r) de forma recurrente.

1.5. Recurrencias
En muchos problemas combinatorios no interesa resolver sólo un problema individual, sino resolver
una secuencia de problemas individuales, que usualmente dependen de uno o varios parámetros. Por
ejemplo, denotando por hn al número de permutaciones de S = {1, 2, . . . , n}, tendríamos una secuencia
de números h0 , h1 , h2 , . . . hn , . . ., cuyo término general sería hn = n!. Una forma alternativa de calcular hn
hubiese sido hn = n hn−1 , que permite calcular hn en función de un valor de la secuencia previamente
calculado.
Grafos y Combinatoria. Javier Tejel 17

A una identidad como la anterior, hn = n hn−1 , se la conoce como fórmula de recurrencia. En gene-
ral, una fórmula de recurrencia para una secuencia de números f0 , f1 , . . . , fn , . . . es una identidad que
permite calcular un valor de la secuencia fn en función de valores f j calculados previamente.
Otro ejemplo de recurrencia más complicado lo tenemos en el Teorema 1.7, donde a través de la
identidad S2 (r, i) = S2 (r − 1, i − 1) + i S2 (r − 1, i), podemos obtener los números de Stirling de segunda
clase S2 (r, i), en función de otros números de Stirling previamente calculados.
Además de permitir un cálculo iterativo de una secuencia de valores, las fórmulas de recurrencia
tienen otros usos interesantes. Por ejemplo, en ocasiones permiten ver que dos cantidades (o dos secuen-
cias) son iguales. También permiten dar información sobre el orden de magnitud del término general
de una secuencia f0 , f1 , . . . , fn , . . ., o una fórmula exacta sobre el valor de fn cuando se sabe resolver la
recurrencia. Volveremos sobre estas cuestiones en el capítulo 2.
Mientras tanto, veamos algunos ejemplos de recurrencias.

Ejemplo 1.17. Dado el conjunto S = {1, 2, . . . , n}, calcular el número de subconjuntos de S que no
contengan dos números consecutivos.

Solución. Llamemos fn a ese número, para n ≥ 1. Claramente, f1 = 2 (el conjunto 0/ y el conjunto {1}),
f2 = 3 (0,/ {1}, {2}), f3 = 5 (0, / {1}, {2}, {3}, {1, 3}), ..., e incluso se podría definir f0 = 1 ¿Pero
cuánto es f10 o f1000 ? Una forma de calcular esos números es la siguiente. De los subconjuntos que
buscamos, algunos contendrán el número n y otros no. Los que no contienen a n han de ser subconjuntos
de {1, 2, . . . , n−1} y sin contener números seguidos. Luego hay exactamente fn−1 de ellos. Por otra parte,
los subconjuntos que sí contienen a n no pueden contener al número n − 1, puesto que no puede haber
números seguidos. Luego al n le acompañan subconjuntos de {1, 2, . . . , n − 2} sin números consecutivos,
que hay fn−2 de ellos. Por tanto, fn verifica la fórmula de recurrencia

fn = fn−1 + fn−2

válida para cualquier n ≥ 2.


Dados los valores iniciales f0 = 1, f1 = 2, podemos ver la fórmula de recurrencia anterior como
un método de cálculo de fn para todos los valores de n: cada fn se obtiene sumando los dos valores
anteriores. Los primeros valores de fn son

n 0 1 2 3 4 5 6 7 8 9 10 11
fn 1 2 3 5 8 13 21 34 55 89 144 233

Observar sin embargo que la fórmula de cálculo anterior nos dice muy poco sobre cómo crece la
función fn , o de qué orden de magnitud son esos números. Claramente fn ≤ 2n , pues subconjuntos de un
conjunto de tamaño n hay 2n y fn cuenta sólo algunos de éllos. Pero a partir de un cierto n, ¿será fn menor
que 2n /10, o menor que 2n/2 ? Cuestiones como éstas se pueden resolver usando funciones generatrices.
El ejemplo anterior es un caso particular de las conocidas como secuencias de Fibonacci. Una suce-
sión de Fibonacci es una sucesión f0 , f1 , f2 , . . . , fn , . . . que responde a la recurrencia fn = fn−1 + fn−2 .
Las secuencias de Fibonacci suelen aparecer con frecuencia en problemas de tipo combinatorio e in-
cluso algunos números de Fibonacci aparecen en la naturaleza. Veamos a continuación otro ejemplo de
sucesión de Fibonacci.

Ejemplo 1.18. Calcular el número de secuencias de bits b1 , b2 , . . . , bn , donde cada bi vale 0 ó 1, verifi-
cando que
b1 ≤ b2 ≥ b3 ≤ b4 ≥ b5 ≤ . . .
Por ejemplo, si n = 1, tenemos las secuencias (0) y (1), si n = 2, sólo hay tres secuencias válidas, que
son (0, 0), (0, 1), (1, 1), y si n = 3, las secuencias válidas son (0, 0, 0), (0, 1, 0), (0, 1, 1), (1, 1, 0), (1, 1, 1).
18 Capítulo 1. Combinatoria elemental

Solución. Llamemos fn a ese número que queremos calcular. Vemos que f1 = 2, f2 = 3 y f3 = 5, y


queremos encontrar una fórmula para fn .
Lo primero que observamos es que, definiendo bi = 1 − bi para todo i, la secuencia b1 , b2 , . . . , bn
verifica b1 ≤ b2 ≥ b3 ≤ b4 ≥ b5 ≤ . . ., si y sólo si, la secuencia b1 , b2 , . . . , bn verifica b1 ≥ b2 ≤ b3 ≥ b4 ≤
b5 ≥ . . .. Por tanto, hay tantas secuencias de bits b1 , b2 , . . . , bn verificando b1 ≤ b2 ≥ b3 ≤ b4 ≥ b5 ≤ . . .,
como secuencias de bits verificando b1 ≥ b2 ≤ b3 ≥ b4 ≤ b5 ≥ . . .. En otras palabras, fn también cuenta
las secuencias de bits b1 , b2 , . . . , bn verificando que b1 ≥ b2 ≤ b3 ≥ b4 ≤ b5 ≥ . . .
Las secuencias fn que buscamos las vamos a dividir en dos tipos: las que empiezan en 0 y las que
empiezan en 1. Si b1 = 0, entonces b2 , b3 , . . . , bn es una secuencia de n − 1 bits verificando que b2 ≥
b3 ≤ b4 ≥ b5 ≤ b6 ≥ . . . (y hay fn−1 de estas secuencias). Recíprocamente, añadiendo un 0 delante, cada
una de estas secuencias b2 , b3 , . . . , bn tal que b2 ≥ b3 ≤ b4 ≥ b5 ≤ b6 ≥ . . . da una secuencia distinta de
longitud n de las que buscamos. Por tanto, secuencias empezando con 0 (b1 = 0) hay exactamente fn−1 .
Si por el contrario b1 = 1, necesariamente el siguiente bit b2 ha de ser 1 y el resto de bits b3 , b4 , . . . , bn
es una secuencia de longitud n − 2 verificando que b3 ≤ b4 ≥ b5 ≤ b6 . . . (y hay fn−2 de estas secuencias).
De nuevo, cada una de estas secuencias b3 , b4 , . . . verificando que b3 ≤ b4 ≥ b5 ≤ b6 . . . produce una
secuencia de longitud n de las que buscamos, añadiéndole dos bits 1 delante. Por tanto, hay exactamente
fn−2 secuencias comenzando en 1.
En consecuencia, tenemos que fn cumple la relación de recurrencia
fn = fn−1 + fn−2
que vuelve a ser una recurrencia correspondiente a una sucesión de Fibonacci. Definiendo f0 = 1, la
recurrencia anterior es válida para n ≥ 2, y las condiciones iniciales son f0 = 1 y f1 = 2, las mismas que
las del ejemplo anterior.
A continuación mostramos un ejemplo de recurrencia que se puede resolver de manera fácil.
Ejemplo 1.19. Sea S = {1, 2 . . . , n}, y sea P(S) la familia de 2n subconjuntos de S. Dado k > 0, calcular
el número de secuencias (S1 , S2 , . . . , Sk ) formadas por subconjuntos de S verificando que
S1 ∩ S2 ∩ . . . ∩ Sk = 0/
Por ejemplo, si k = 3 y n = 2, P(S) está formado por los cuatro subconjuntos {0, / {1}, {2}, {1, 2}} y
/ {1}) o ({1, 2}, {2}, {1})
secuencias de tres subconjuntos con intersección vacía son, por ejemplo, ({1}, 0,
(así, hasta 49 secuencias de tres subconjuntos disjuntos).
Solución. Fijado el entero k, llamemos fn al número de secuencias formadas por k subconjuntos de S
con intersección vacía. Dada una de estas secuencias (S1 , S2 , . . . , Sk ), el elemento n no puede estar en los
k subconjuntos, pues entonces n estaría en la intersección. Por tanto, n estará en i de ellos, con 0 ≤ i < k.
Si quitamos el elemento n de esos i subconjuntos a los que pertenece, obtendremos una secuencia de
k subconjuntos de S − {n} con intersección vacía. Esto nos dice que cada secuencia de k subconjuntos
de S con intersección vacía puede obtenerse desde una secuencia de k subconjuntos de S − {n} con
intersección vacía, añadiendo a i < k de esos subconjuntos el elemento n. Además, secuencias distintas
de S − {n} producen secuencias distintas de S. Como hay ki formas de seleccionar los i subconjuntos
dónde añadir el elemento n, tenemos que fn verifica la recurrencia
k−1  
k
fn = ∑ fn−1
i=0 i

o equivalentemente
k−1  
k
fn = fn−1 ∑ = (2k − 1) fn−1
i=0 i
Como la secuencia (0, / . . . , 0)
/ 0, / siempre aparece, ha de ser f0 = 1, y por tanto,
fn = (2k − 1) fn−1 = (2k − 1)2 fn−2 = . . . = (2k − 1)n f0 = (2k − 1)n
Grafos y Combinatoria. Javier Tejel 19

En el ejemplo anterior, hemos sido capaces de resolver la recurrencia, y de esa forma podemos dar
cuál es el comportamiento de fn en función de n, y no en función de otros valores f j . La solución a la
recurrencia nos dice que el orden de magnitud de fn es (2k − 1)n .
Veamos otro ejemplo.

Ejemplo 1.20. Supongamos que tenemos una tira de papel dividida en n casillas.

1 2 3 n

Calcular el número de formas distintas de colorear esas n casillas con tres colores (rojo, azul y negro),
de forma que no haya dos celdas de color rojo consecutivas.

Solución. Llamemos fn a ese número. Es fácil ver que f1 = 3 (o rojo, o azul, o negro) o f2 = 8 (todas las
posibles combinaciones de dos de los colores, excepto la combinación rojo-rojo), y queremos encontrar
una fórmula para fn . Observemos que coloreados teniendo la primera casilla de color azul hay fn−1 ,
ya que podemos considerar las (n − 1) casillas siguientes como una tira de ese tamaño. Igualmente,
coloreados con la primera casilla coloreada en negro habrá también fn−1 . Sin embargo, si la primera
casilla está coloreada en rojo, la forma de colorear las restantes n − 1 casillas ya no es fn−1 , puesto que
la segunda casilla (primera en la tira restante de longitud (n − 1)) ha de ser azul o negra. Pero de nuevo,
en esa tira restante de longitud (n − 1) comenzando en azul habrá fn−2 formas de colorear el resto, y
comenzando en negro el mismo número. Por tanto,

fn = 2 fn−1 + 2 fn−2

para n ≥ 3, con las condiciones iniciales f1 = 3 y f2 = 8. Definiendo f0 = 1, la recurrencia anterior es


válida para n ≥ 2, con las condiciones iniciales f0 = 1 y f1 = 3.

1.5.1. Coeficientes binomiales


Por definición, C(n, r) se puede obtener realizando el cálculo n (n−1) ...r! (n−r+1) . A través de la fórmula
de Pascal, vamos a ver un método recurrente alternativo para el cálculo de los coeficientes binomiales,
que involucra sumas en lugar de productos y divisiones.
En la sección 1.3, vimos la fórmula de Pascal para los coeficientes binomiales, que nos dice que, para
r > 0,      
n n−1 n−1
= +
r r r−1
Podemos interpretar esta igualdad como una identidad entre números combinatorios, o como una fórmula
de recurrencia para el cálculo de los coeficientes binomiales. De hecho, la fórmula dice que para calcular
C(n, r), el número de subconjuntos de tamaño r > 0 de un conjunto de n elementos, nos basta conocer
el número de subconjuntos de tamaños r y r − 1 de un conjunto con n − 1 elementos. A su vez, los
subconjuntos de un conjunto de n − 1 elementos se conocerán a partir de los de uno de n − 2 elementos,
y así sucesivamente. Observa que la fórmula de recurrencia que se tiene ahora,

C(n, r) = C(n − 1, r) +C(n − 1, r − 1)

es una fórmula que depende de dos índices, n y r.


En particular, a través de esta recurrencia, si conocemos el número de subconjuntos de tamaño r
del conjunto 0/ (un conjunto con n = 0 elementos), y conocemos también el número de subconjuntos
de tamaño r = 0 para cualquier n > 0, que serían las condiciones iniciales para esta recurrencia en dos
índices, podemos calcular todos los números C(n, r) simplemente haciendo sumas. Como C(0, 0) = 1
/ C(0, r) = 0, si r > 0, y C(n, 0) = 1, (pues un conjunto con n elementos
(subconjuntos de tamaño 0 del 0),
tiene un subconjunto con r = 0 elementos), tenemos un método de calcular C(n, r).
Mirando los valores de C(n, r) como una tabla de números, donde conocemos los valores de la fila
0 y los de la columna 0, podemos ir calculando todas las filas de esa tabla. Para rellenar la entrada de la
20 Capítulo 1. Combinatoria elemental

fila n columna r, simplemente ponemos en esa casilla el resultado de sumar el número de encima de esa
casilla y su predecesor en esa fila de arriba.
Los primeros valores obtenidos son

n\r 0 1 2 3 4 5 6 7 8 Suma
0 1 0 0 0 0 0 0 0 0 1
1 1 1 0 0 0 0 0 0 0 2
2 1 2 1 0 0 0 0 0 0 4
3 1 3 3 1 0 0 0 0 0 8
4 1 4 6 4 1 0 0 0 0 16
5 1 5 10 10 5 1 0 0 0 32
6 1 6 15 20 15 6 1 0 0 64
7 1 7 21 35 35 21 7 1 0 128
8 1 8 28 56 70 56 28 8 1 256

1.5.2. Números de Stirling de segunda clase


En la sección 1.4.2, vimos que el número de particiones de un conjunto de r elementos distintos en i
bloques era el número de Stirling de segunda clase S2 (r, i). En el Teorema 1.7 y la Nota 1.6, se demuestra
que estos números satisfacen que
S2 (r, i) = S2 (r − 1, i − 1) + i S2 (r − 1, i)
para r > 0 e i ≥ 1. Como sabemos que S2 (0, 0) = 1, S2 (r, 0) = 0 si r > 0, y S2 (0, i) = 0 si i > 0, estas
condiciones iniciales permiten calcular de forma recursiva todos los valores de S2 (r, i). Los primeros
valores de S2 (r, i) se muestran en la siguiente tabla.

r\i 0 1 2 3 4 5 6 7 8 Suma
0 1 0 0 0 0 0 0 0 0 1
1 0 1 0 0 0 0 0 0 0 1
2 0 1 1 0 0 0 0 0 0 2
3 0 1 3 1 0 0 0 0 0 5
4 0 1 7 6 1 0 0 0 0 15
5 0 1 15 25 10 1 0 0 0 52
6 0 1 31 90 65 15 1 0 0 203
7 0 1 63 301 350 140 21 1 0 877
8 0 1 127 966 1701 1050 266 28 1 4140

Se ha añadido a la tabla una columna adicional, la columna suma, que nos da el número de particiones
de un conjunto de r elementos. Así, para r = 3, hay 5 formas ((1, 2, 3), (1)(2, 3), (2)(1, 3), (3)(1, 2) y
(1)(2)(3)) de particionar el conjunto S = {1, 2, 3}: una forma de particionar el conjunto en un bloque
(S2 (3, 1)), tres formas de particionar el conjunto en dos bloques (S2 (3, 2)) y una forma de particionar el
conjunto en tres bloques (S2 (3, 3)).

1.5.3. Números de Bell


En la sección anterior hemos calculado el número total de particiones de un conjunto de r elementos
de forma recursiva utilizando los números de Stirling de segunda clase. Hay una forma alternativa de
realizar el cálculo recursivo de estas cantidades a través de los números de Bell. Para r > 0, el número
de Bell Br se define como
r
Br = ∑ S2 (r, i)
i=0
Grafos y Combinatoria. Javier Tejel 21

y no es mas que el número total de particiones de un conjunto S de r elementos distintos. Observa que
se ha incluido el sumando S2 (r, 0), que es cero por definición puesto que no se puede particionar un
conjunto en 0 bloques.
Los números de Bell satisfacen la siguiente recurrencia.

Teorema 1.9. Si r ≥ 1, entonces


     
r−1 r−1 r−1
Br = B0 + B1 + . . . + Br−1
0 1 r−1

Demostración. En cualquier partición de S = {a1 , a2 , . . . , ar }, el elemento ar puede estar


 acompañado en
su bloque por otros j elementos, donde j puede varíar de 0 a r − 1. Fijado j, hay r−1 j formas de elegir
esos j elementos. Los restantes r − 1 − j elementos los podemos particionar de Br−1− j formas. Por tanto,

r−1  
r−1
Br = ∑ Br−1− j
j=0 j

identidad equivalente a la del enunciado. Para que sea válida la identidad, hemos de suponer B0 = 1 y
0

0 = 1.

Nota 1.9. Este mismo razonamiento también puede utilizarse para dar un método alternativo para cal-
cular los números de Stirling de segunda clase S2 (r, i). El elemento ar puede ir en su clase con otros j
elementos, con 0 ≤ j ≤ r − i, y el resto se particiona en i − 1 clases. Por tanto,
r−i  
r−1
S2 (r, i) = ∑ S2 (r − 1 − j, i − 1)
j=0 j

1.5.4. Problemas 1’ y 2’
En la sección 1.2.1, dejamos pendiente la resolución de los problemas 1’ y 2’. Vamos a ver aquí cómo
resolverlos usando recurrencias.
Supongamos que S es un multiset con elementos a1 , . . . , ak , repetidos n1 , . . . , nk veces, respectivamen-
te. Definamos n = ∑ki=1 ni . En el problema 1’ queríamos calcular el número de submultisets ordenados de
tamaño r ≤ n del multiset S. A ese número lo denotaremos por V ′ (r, k). El siguiente argumento permite
calcular V ′ (r, k) de forma recursiva.
En uno de esos submultisets ordenados, el elemento ak puede aparecer i veces, donde i puedeir desde
0 hasta mı́n(r, nk ). Si aparece i veces, podemos colocar en el submultiset los i elementos ak de ri formas
distintas. Una vez colocados los elementos ak , lo que queda es un problema de calcular submultisets
ordenados de tamaño r − i, usando los elementos a1 , . . . , ak−1 , repetidos n1 , . . . , nk−1 veces. Por tanto,
para k > 1, se tiene la siguiente recurrencia

mı́n(r,nk )  
′ r
V (r, k) = ∑ V ′ (r − i, k − 1)
i=0 i

Si k = 1, entonces S es un multiset en el que se tiene el elemento a1 repetido n1 veces. Claramente,


V ′ (r, 1) = 1, siempre que r ≤ n1 . Estas son las condiciones iniciales para la recurrencia.

Ejemplo 1.21. Dado el multiset S = {a, a, a, a, b, b, b, c, d, d}, calcular cuántos submultisets ordenados
de tamaño 6 se pueden formar con los elementos de S.

Solución. El valor que nos piden calcular es V ′ (6, 4), que va a valer 1490. Para obtenerlo, vamos a
construir una tabla con todos los valores V ′ (r, k), cuando 0 ≤ r ≤ 10 y 1 ≤ k ≤ 4, utilizando la recurrencia
anterior.
22 Capítulo 1. Combinatoria elemental

k\r 0 1 2 3 4 5 6 7 8 9 10
1 1 1 1 1 1 0 0 0 0 0 0
2 1 2 4 8 15 25 35 35 0 0 0
3 1 3 8 20 47 100 185 280 280 0 0
4 1 4 15 53 175 535 1490 3675 7700 12600 12600

Si k = 1, es decir sólo tenemos las a’s para formar los submultisets ordenados, claramente V ′ (r, 1) = 1
si r ≤ 4 y V ′ (r, 1) = 0 en otro caso. Con sólo 4 a’s no podemos formar submultisets ordenados de tamaño
mayor que 4.
A modo de ejemplo, vamos a ver cómo calcular V ′ (4, 2), que sale 15. Como k = 2, ahora tenemos
que formar submultisets ordenados de tamaño 4, usando las 4 a’s y las 3 b’s. En uno de esos submultisets,
la b puede aparecer cero veces, una vez, dos veces o tres veces. Como mı́n(r, n2 ) = mı́n(4, 3) = 3, en el
cálculo de V ′ (4, 2) van a aparecer cuatro sumandos. Por tanto,
       
′ 4 ′ 4 ′ 4 ′ 4
V (4, 2) = V (4, 1) + V (3, 1) + V (2, 1) + V ′ (1, 1) = 15
0 1 2 3

Para calcular V ′ (6, 4), la d puede aparecer cero veces, una vez o dos veces. Ya que mı́n(r, n4 ) =
mı́n(6, 2) = 2, en el cálculo van a aparecer tres sumandos. Así,
     
′ 6 ′ 6 ′ 6
V (6, 4) = V (6, 3) + V (5, 3) + V ′ (4, 3) =
0 1 2
= 1 · 185 + 6 · 100 + 15 · 47 = 1490

Nota 1.10. La recurrencia anterior es válida para k = 1, siempre que definamos V ′ (0, 0) = 1 y V ′ (r, 0) = 0,
para r > 0.

La forma de resolver el problema 2’ es muy similar a la descrita anteriormente. En el problema 2’,


dado S un multiset con elementos a1 , . . . , ak , repetidos n1 , . . . , nk veces, respectivamente, tenemos que
calcular el número de submultisets (no ordenados) de tamaño r. Sea C′ (r, k) dicha cantidad. Como antes,
en un submultiset de tamaño r, el elemento ak puede aparecer i veces, donde i puede variar desde 0 hasta
mı́n(r, nk ). Una vez elegidas las i copias de ak , lo que queda es un problema de calcular submultisets de
tamaño r − i, usando los elementos a1 , . . . , ak−1 , repetidos n1 , . . . , nk−1 veces. Por tanto, para k > 1, se
tiene la siguiente recurrencia
mı́n(r,nk )
C′ (r, k) = ∑ C′ (r − i, k − 1)
i=0
Si k = 1, entonces S es un multiset en el que se tiene el elemento a1 repetido n1 veces. Claramente,
C′ (r, 1) = 1, siempre que r ≤ n1 . Estas son las condiciones iniciales para la recurrencia.

Ejemplo 1.22. Siguiendo con el ejemplo anterior, dado el multiset S = {a, a, a, a, b, b, b, c, d, d}, calcular
cuántos submultisets de tamaño 6 se pueden formar con los elementos de S.

Solución. El valor que nos piden calcular es C′ (6, 4), que va a valer 20. Para obtenerlo, vamos a construir
una tabla con todos los valores C′ (r, k), cuando 0 ≤ r ≤ 10 y 1 ≤ k ≤ 4, utilizando la recurrencia previa.

k\r 0 1 2 3 4 5 6 7 8 9 10
1 1 1 1 1 1 0 0 0 0 0 0
2 1 2 3 4 4 3 2 1 0 0 0
3 1 3 5 7 8 7 5 3 1 0 0
4 1 4 9 15 20 22 20 15 9 4 1
Grafos y Combinatoria. Javier Tejel 23

Si k = 1, es decir sólo tenemos las a’s para formar los submultisets, claramente C′ (r, 1) = 1 si r ≤ 4
y C′ (r, 1)= 0 en otro caso. Con sólo 4 a’s no podemos formar submultisets de tamaño mayor que 4.
Vamos a calcular a modo de ejemplo C′ (2, 2), que sale 3. Como k = 2, ahora tenemos que formar
submultisets de tamaño 2, usando las 4 a’s y las 3 b’s. Como mı́n(r, n2 ) = mı́n(2, 3) = 2, en el cálculo de
C′ (2, 2) van a aparecer tres sumandos, que corresponden a que la b aparezca cero veces, una vez o dos
veces. Por lo tanto,
C′ (2, 2) = C′ (2, 1) +C′ (1, 1) +C′ (0, 1) = 3

Para calcular C′ (6, 4), la d puede aparecer cero veces, una vez o dos veces, ya que mı́n(r, n4 ) =
mı́n(6, 2) = 2. Así,

C′ (6, 4) = C′ (6, 3) +C′ (5, 3) +C′ (4, 3) = 5 + 7 + 8 = 20

1.5.5. Número de particiones de un entero


En la sección 1.4.4, definimos pn (r) como el número de formas de expresar un entero r > 0 como
suma de n enteros positivos decrecientes. Así, si r = 8 y n = 3, el número de formas de expresar 8 como
suma de 3 enteros positivos decrecientes es p3 (8) = 5, cardinal del conjunto {6 + 1 + 1, 5 + 2 + 1, 4 +
3 + 1, 4 + 2 + 2, 3 + 3 + 2}. En esta sección, vamos a ver cómo calcular pn (r) de forma recursiva.
Lo primero que hay que observar es que pn (r) vale 0 si n = 0 (no hay sumandos) o n > r (hay más
sumandos que r). Además, pn (r) vale 1, si n = 1 o n = r. En los demás casos, es decir, cuando 1 < n < r,
pn (r) cumple la relación:
pn (r) = pn−1 (r − 1) + pn (r − n)

ya que, o bien el último sumando es 1, y el resto es una partición de r − 1 en n − 1 sumandos, o todos los
sumandos son mayores o iguales a 2, y restando 1 a cada uno de los n sumandos obtenemos una partición
de r − n en n sumandos.
Esta fórmula de recurrencia permite calcular pn (r), y también el número de particiones del entero
r, p(r) = ∑rn=1 pn (r). La siguiente tabla muestra cuánto vale pn (r), para 1 ≤ n ≤ r y r ≤ 15. También
muestra cuánto vale p(r), para r ≤ 15.

r\n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Suma
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2
3 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 3
4 1 2 1 1 0 0 0 0 0 0 0 0 0 0 0 5
5 1 2 2 1 1 0 0 0 0 0 0 0 0 0 0 7
6 1 3 3 2 1 1 0 0 0 0 0 0 0 0 0 11
7 1 3 4 3 2 1 1 0 0 0 0 0 0 0 0 15
8 1 4 5 5 3 2 1 1 0 0 0 0 0 0 0 22
9 1 4 7 6 5 3 2 1 1 0 0 0 0 0 0 30
10 1 5 8 9 7 5 3 2 1 1 0 0 0 0 0 42
11 1 5 10 11 10 7 5 3 2 1 1 0 0 0 0 56
12 1 6 12 15 13 11 7 5 3 2 1 1 0 0 0 77
13 1 6 14 18 18 14 11 7 5 3 2 1 1 0 0 101
14 1 7 16 23 23 20 15 11 7 5 3 2 1 1 0 135
15 1 7 19 27 30 26 21 15 11 7 5 3 2 1 1 176
24 Capítulo 1. Combinatoria elemental

1.5.6. Problema de las propinas (soluciones enteras positivas de una ecuación lineal)
En esta sección vamos a ver un último ejemplo interesante del uso de las recurrencias. Dicho ejemplo
se conoce con el nombre del problema de las propinas. En dicho problema, queremos dejar una propina
por un valor de r, usando n tipos de monedas, cuyos valores son v(1), . . . , v(n), respectivamente. La
pregunta es de cuántas formas se puede dejar esa propina de valor r usando esos n tipos de monedas.
Sea P(r, k) el número de formas de dar una propina de valor r usando solamente los k primeros tipos
de monedas. Claramente, el tipo k de moneda puede usarse un máximo de ⌊r/v(k)⌋ veces. Si la moneda
de tipo k se utiliza i veces, desde i = 0 hasta i = ⌊r/v(k)⌋, lo que queda es un problema de dar una propina
de valor r − v(k) · i, usando monedas de los k − 1 primeros tipos. Por tanto, para k > 1, se tiene
⌊r/v(k)⌋
P(r, k) = ∑ P(r − v(k) · i, k − 1)
i=0

Si k = 1, es decir, sólo tenemos un tipo de moneda, es inmediato ver que P(r, 1) = 0, si r no es múltiplo
de v(1), y P(r, 1) = 1 en caso contrario. Estas serías las condiciones iniciales para la recurrencia.
Notar que ha de ser P(0, k) = 1, para k > 0, pues siempre hay una forma de no dejar propina. Notar
también que, a lo largo de todo el razonamiento, se está asumiendo que se tiene un número ilimitado de
monedas de cada tipo. Si el número de monedas fuese limitado, entonces el sumatorio no iría de 0 hasta
⌊r/v(k)⌋, sino hasta mı́n(⌊r/v(k)⌋, nk ), siendo nk el número de monedas disponibles de tipo k.
Por ejemplo, si hubiésemos usado la recurrencia anterior para calcular de cuántas formas se puede
dejar una propina de 50 céntimos, usando monedas de 1, 2, 5, 10, 20 y 50 céntimos, la respuesta hubiese
sido P(50, 6) = 451.
Este último número es también el número de soluciones enteras y positivas de la ecuación

x1 + 2x2 + 5x3 + 10x4 + 20x5 + 50x6 = 50

pues especificar una propina es decir cuántas monedas de valor 1 usamos (x1 ), cuantas de valor 2 usamos
(x2 ) , etcétera.
En general, si la propina es de valor r y las monedas de valores v(1), v(2), . . . , v(k), el problema de
las propinas es equivalente al número de soluciones enteras y positivas de la ecuación

v(1) · x1 + v(2) · x2 + . . . + v(k) · xk = r

Un método más eficiente de resolver el problema es usar la siguiente recurrencia, cuando k > 1
(
P(r, k − 1) si r < v(k)
P(r, k) =
P(r − v(k), k) + P(r, k − 1) si r ≥ v(k)

Si el valor de la última moneda v(k) es superior a la propina r que queremos dar, no podemos usar
monedas de valor v(k), por lo que las formas de dar esa propina, P(r, k), son las mismas que las formas
de dar la propina usando los primeros k − 1 tipos de monedas, P(r, k − 1). Por contra, si el valor de la
última moneda es a lo más r, entonces podemos decidir si usar monedas de tipo k o no. Si no las usamos,
tenemos las formas de dar la propina r usando los primeros k − 1 tipos de monedas, P(r, k − 1). Y si
decidimos usarlas, descontamos v(k) a la propina r para asegurarnos de que estamos usando al menos
una moneda de tipo k, y calculamos las formas de dar una propina r − v(k), usando los primeros k tipos
de monedas, P(r − v(k), k).

Ejemplo 1.23. Supongamos que vamos a dar una propina de 15 céntimos y tenemos monedas de 1, 2 y
5 céntimos para darla. ¿De cuántas formas distintas podemos dar esa propina?

Solución. Como tenemos tres tipos de monedas, lo que tenemos que calcular es P(15, 3), que va a valer
18. Para obtener este valor, vamos a construir una tabla con todos los valores P(r, k), cuando 0 ≤ r ≤ 15
y 1 ≤ k ≤ 3, utilizando la segunda de las recurrencias propuestas.
Grafos y Combinatoria. Javier Tejel 25

k\r 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8
3 1 1 2 2 3 4 5 6 7 8 10 11 13 14 16 18

Si k = 1, es decir, sólo usamos las monedas de un céntimo, P(r, 1) es siempre 1, pues siempre se
puede conseguir dar una propina de valor r usando ese tipo de monedas. El valor P(15, 3) lo obtenemos
a partir de P(15, 2) = 8 (no usamos monedas de cinco céntimos) y de P(10, 3) = 10 (usamos al menos
una moneda de cinco céntimos).

1.6. El principio de inclusión-exclusión


En la sección 1.1, vimos el principio de adición, como un método para contar los objetos de un
conjunto S, cuando S se podía particionar en m subconjuntos S1 , . . . , Sm disjuntos. En ese caso, |S| =
|S1 | + . . . + |Sm |. Si los subconjuntos no son disjuntos, la cosa se complica, y entonces hay que aplicar
otros métodos de conteo.
Uno de estos métodos de conteo, que es muy útil en la práctica, es el conocido como principio de
inclusión-exclusión. Dicho método es una extensión de la siguiente idea. Sean A y B dos subconjuntos
de un conjunto S. Se desea contar el número de elementos de S que no están en la unión de A y B. La
solución al problema no es descontar a S los elementos de A y los elementos de B, es decir, |S \ (A ∪ B)| =
|S|−|A|−|B|, pues se estarían descontando dos veces los elementos comunes a A y B, sino que la solución
es |S \ (A ∪ B)| = |S| − |A| − |B| + |A ∩ B|.
Si en lugar de dos subconjuntos A y B de S, tuviésemos tres conjuntos A, B y C de S, la forma de
contar los elementos de S que no están en la unión de esos tres subconjuntos sería |S \ (A ∪ B ∪ C)| =
|S| − |A| − |B| − |C| + |A ∩ B| + |A ∩C| + |B ∩C| − |A ∩ B ∩C|.
Generalizando esta idea, el principio de inclusión-exclusión nos dice que si tenemos un conjunto S
y una serie E1 , . . . , Er de subconjuntos de S, la forma de contar los elementos de S que no están en la
unión de los Ei es la siguiente: al cardinal de S se descuentan los cardinales de cada uno de los conjuntos
individuales Ei , se suman los cardinales de las dobles intersecciones entre los conjuntos Ei , se restan los
cardinales de las triples intersecciones, y así sucesivamente.
En el siguiente teorema se demuestra dicha generalización, donde n j representa la suma de los car-
dinales de todas las intersecciones que involucran a j de los subconjuntos Ei .

Teorema 1.10 (Principio de inclusión-exclusión). Sea S un conjunto con n elementos y E1 , . . . , Er


subconjuntos de S (no necesariamente distintos). Para cualquier subconjunto M de índices de {1, . . . , r},
sea n(M) el número de elementos de S en i∈M Ei . Para 1 ≤ j ≤ r, sea n j = ∑|M|= j n(M). Entonces el
T

número de elementos de S que no están en ninguno de los subconjuntos Ei es


r
[
|S − Ei | = n − n1 + n2 − n3 + . . . + (−1)r nr
i=1

Demostración. Observar que si tenemos varios subconjuntos S1 , S2 , S3 de S, una forma de calcular una
expresión como |S1 | − |S2 | + |S3 | es contar, para cada elemento x ∈ S, cuanto contribuye ese elemento a
esa expresión. Por ejemplo, si un elemento x está en los tres subconjuntos S1 , S2 y S3 , entonces contribuye
como 1 − 1 + 1 = 1, y si pertenece a S1 y S3 , pero no a S2 , entonces contribuye con 1 − 0 + 1 = 2. La
suma de las contribuciones de cada elemento de S nos ha de dar |S1 | − |S2 | + |S3 |.
Vamos a demostrar la validez de la fórmula dada en el teorema, viendo la contribución de cual-
quier elemento x ∈ S. Notar que, como ya hemos comentado anteriormente, n = |S|, n1 = ∑ki=1 |Ei |, n2 =
∑i̸= j |Ei ∩ E j |, . . ., representan sumas de cardinales de subconjuntos de S.
Tomemos un elemento x ∈ S. Supongamos que x no pertenece a ninguno de los Ei . Su contribución
en la parte izquierda de la igualdad es entonces 1 y su contribución neta en la suma de la derecha
26 Capítulo 1. Combinatoria elemental

también es 1, pues sólo aparece en n (pertenece a S). Supongamos ahora que x está en exactamente
k > 0 subconjuntos Ei . Su contribución en la izquierda es claramente 0. En la derecha,kla contribución
k k
de x en n es 1 = 0 (pertenece a S), su contribución en n1 es 1 (pues pertenece a 1 subconjuntos
Ei ), su contribución a n2 es 2k (pues está en 2k conjuntos Ei ∩ E j ), y así sucesivamente. Por tanto, su
 

contribución neta en la derecha es


       
k k k k
− + − . . . + (−1)k
0 1 2 k

Aplicando el Teorema binomial con x = 1 e y = −1, tenemos que


       
k k k k
0 = (1 − 1)k = − + − . . . + (−1)k
0 1 2 k

con lo que la contribución en la derecha es 0, como en la izquierda.

Veamos algunos ejemplos de aplicación.

Ejemplo 1.24. Un comercial tiene que visitar dos veces a dos de sus clientes (1 y 2), pero no quiere
hacer dos visitas consecutivas al mismo cliente. Así, la visita 1212 estaría permitida, pero no la visita
1221. ¿De cuántas formas puede organizar las visitas?

Solución. Definamos los siguientes conjuntos.

S: formas de organizar las visitas sin ningún tipo de restricción.

E1 : formas de organizar las visitas, visitando consecutivamente al cliente 1.

E2 : formas de organizar las visitas, visitando consecutivamente al cliente 2.

Con estas definiciones, lo que nos pide el enunciado es que calculemos |S\(E1 ∪E2 )|, que por el principio
de inclusión-exclusión será |S \ (E1 ∪ E2 )| = |S| − |E1 | − |E2 | + |E1 ∩ E2 |. Las formas de visitar a los
clientes sin restricciones son las permutaciones de dos unos y de dos doses, que es |S| = 2!4!2! = 6. Las
formas de visitar consecutivamente al cliente 1 son las permutaciones de un bloque de dos unos y dos
doses, es decir, |E1 | = 3!
2! = 3. Análogamente, |E2 | = 3. Por último, las formas de visitar consecutivamente
al cliente 1 y al cliente 2 son las permutaciones de un bloque de dos unos y un bloque de dos doses, es
decir, |E1 ∩ E2 | = 2! = 2. Por tanto, |S \ (E1 ∪ E2 )| = 6 − 3 − 3 + 2 = 2.

Al ser tan sencillo el ejemplo anterior, una mera exploración de las posibles formas de organizar las
visitas nos habría dado que las dos formas legales de organizar las visitas eran 1212 y 2121, sin necesidad
de aplicar el principio de inclusión-exclusión.

Ejemplo 1.25. ¿Cuántos números enteros hay entre 0 y 99999, ambos incluidos, de forma que contengan
al menos un 2, un 5 y un 8?

Solución. Definamos los siguientes conjuntos.

S: números de 0 a 99999 sin ningún tipo de restricción.

E1 : números de 0 a 99999 que no contengan un 2.

E2 : números de 0 a 99999 que no contengan un 5.

E3 : números de 0 a 99999 que no contengan un 8.


Grafos y Combinatoria. Javier Tejel 27

Con estas definiciones, lo que nos pide el enunciado es que calculemos |S \ (E1 ∪ E2 ∪ E3 )|, que por el
principio de inclusión-exclusión, será |S \ (E1 ∪ E2 ∪ E3 )| = |S| − |E1 | − |E2 | − |E3 | + |E1 ∩ E2 | + |E1 ∩
E3 | + |E2 ∩ E3 | − |E1 ∩ E2 ∩ E3 |.
Números de 0 a 99999 sin ningún tipo de restricción hay |S| = 105 , pues para cada uno de los
posibles dígitos del número tenemos 10 posibilidades. Números de 0 a 99999 sin un dos hay |E1 | = 95
(ahora el 2 no se puede usar). Análogamente, |E2 | = |E3 | = 95 . Números sin un dos y sin un cinco hay
|E1 ∩ E2 | = 85 . Igualmente, |E1 ∩ E3 | = |E2 ∩ E3 | = 85 . Por último, números sin un dos, ni un cinco, ni
un ocho hay |E1 ∩ E2 ∩ E3 | = 75 . Por tanto, la solución es

|S \ (E1 ∪ E2 ∪ E3 )| = 105 − 3 · 95 + 3 · 85 − 75

Resaltar por último que, en las aplicaciones del principio de inclusión-exclusión, los conjuntos Ei
que se definen son siempre conjuntos que recogen las situaciones prohibidas, tal y como ha sucedido en
los ejemplos anteriores.

1.6.1. Derangements
Una aplicación interesante del principio de inclusión-exclusión, está relacionada con los llamados
“derangements”. Dada una permutación π de los números {1, 2, . . . , n}, se dice que π es un derangement
si ninguno de los números {1, 2, . . . , n} aparece en su posición natural en π, es decir π(i) ̸= i. Así, la
permutación (2, 3, 1) es un derangement, pues el uno no aparece en la primera posición (π(1) = 3), el
dos no aparece en la segunda posición (π(2) = 1) y el tres no aparece en la tercera posición (π(3) = 2).
Si dn es el total de derangements de R = {1, 2, . . . , n}, ¿cuánto vale dn ? Veamos cómo calcular dn
mediante el principio de inclusión-exclusión. Definamos los siguientes conjuntos.
S: permutaciones de los elementos de R.
Para i = 1, . . . , n, Ei es el conjunto de permutaciones π de R tales que π(i) = i (el número i aparece
en su posición natural en π).
Por el principio de inclusión-exclusión, dn = |S \ ( ni=1 Ei )|. Claramente, |S| = n!. Dado i (y hay n1
S 

formas de elegir i), es claro también que |Ei | = (n − 1)!, pues una vez fijado el i en su posición natural,
el resto de los números se pueden permutar de (n − 1)! formas distintas. Dados i y k (y hay n2 formas
de elegir i y k), se tiene que |Ei ∩ Ek | = (n − 2)!, pues fijados el i y el k en sus posiciones naturales, el
resto de los números se pueden permutar de (n − 2)! formas distintas. En general, elegidos j números
{i1 , . . . , i j } (y hay nj formas de hacerlo), se tiene que |Ei1 ∩ . . . ∩ Ei j | = (n − j)!. En consecuencia,
n n n
(−1) j
 
n j n!
dn = ∑ (−1)
j
(n − j)! = ∑ (−1) j j! (n − j)!
(n − j)! = n! ∑
j!
j=0 j=0 j=0

Utilizando el desarrollo en serie de potencias de la función ex , se puede dar una aproximación de dn .


j j
El desarrollo en serie de ex es ∑∞j=0 xj! , por lo que e−1 es ∑∞j=0 (−1)
j! . Para n suficientemente grande, se
tiene entonces
dn ≈ n! e−1 ≈ n! 0,367879
Por otra parte, si nos pidiesen cuál es el número de permutaciones conteniendo exactamente k puntos
fijos, la respuesta sería  
n
dn−k
k
puesto que podemos elegir de nk formas distintas los k puntos que van a esta fijos, y el resto han de ser


derangements de n − k elementos.
A continuación, vamos a ver un ejemplo de aplicación de los derangements a un problema de cálculo
de probabilidades.
28 Capítulo 1. Combinatoria elemental

Ejemplo 1.26. En un día lluvioso, un grupo de 10 personas entra en un bar, cada una de ellas llevando
su propio paraguas. Al entrar, dejan los 10 paraguas en un paragüero. A la salida del bar, cada una de las
personas coge aleatoriamente un paraguas del paragüero. ¿Cuál es la probabilidad de que ninguna salga
con su paraguas? ¿Cuál la probabilidad de que exactamente tres de las personas salgan con su paraguas?

Solución. Para el cálculo de la probabilidad de que ninguna de las personas salga con su paraguas,
utilizaremos la regla de Laplace, que nos dice que la probabilidad que buscamos es el cociente entre
todas aquellas formas en las que ninguna persona se lleva su propio paraguas y todas las formas posibles
en que las personas pueden coger los paraguas. La primera de las cantidades es d10 y la segunda 10!. Por
tanto, esa probabilidad es
d10 10!
≈ ≈ 0,367879
10! 10! e
Para el cálculo de la probabilidad de que exactamente tres de las personas salgan con su paraguas, volve-
mos a utilizar la regla de Laplace. Ahora, esa probabilidad será el cociente entre todas las formas en que
exactamente tres de las personas se llevan su paraguas y todas las  formas posibles en que las personas
pueden coger los paraguas. La primera de esas cantidades es 10 3 d7 y la segunda 10!, como antes. En
consecuencia, la probabilidad pedida es
10

3 d7 1
≈ ≈ 0,061313
10! 3! e

1.6.2. Problemas 1’ y 2’
En la sección 1.5.4, aprendimos a resolver un problema de tipo 2’ usando recurrencias. En este
apartado, vamos a ver un método alternativo de resolver ese tipo de problemas usando el principio de
inclusión-exclusión. La idea básica del método es la siguiente: se asume que se puede utilizar cada uno
de los elementos distintos del multiset de partida un número ilimitado de veces, se construyen todos los
submultisets posibles (con infinitas repeticiones) del tamaño prefijado, y luego se descuentan los que no
pueden ser generados con sólo los elementos del multiset de partida.
Vamos a detallar el método a través del ejemplo 1.22, en el que se nos pedía calcular el número de
submultisets de tamaño 6 del multiset R = {a, a, a, a, b, b, b, c, d, d}. La solución que encontramos usando
recurrencias fue 20.
Para aplicar inclusión-exclusión, definimos los siguientes conjuntos.

S: submultisets de tamaño 6, usando un número ilimitado de copias de los elementos {a, b, c, d}.

E1 : submultisets de tamaño 6, usando un número ilimitado de copias de los elementos {a, b, c, d},
de forma que contengan más de 4 a’s.

E2 : submultisets de tamaño 6, usando un número ilimitado de copias de los elementos {a, b, c, d},
de forma que contengan más de 3 b’s.

E3 : submultisets de tamaño 6, usando un número ilimitado de copias de los elementos {a, b, c, d},
de forma que contengan más de una c.

E4 : submultisets de tamaño 6, usando un número ilimitado de copias de los elementos {a, b, c, d},
de forma que contengan más de 2 d’s.

Observar que la definición de los conjuntos prohibidos Ei se hace en función del número de copias
de cada uno de los elementos distintos del multiset de partida R. Así, como R sólo contiene 4 copias de
a, no podemos permitir que nuestros submultisets tengan más de 4 a’s.
Con estas definiciones, la solución a nuestro problema vendrá dada por |S \ (E1 ∪ E2 ∪ E3 ∪ E4 )|, que
podremos calcular a través del principio de inclusión-exclusión.
Grafos y Combinatoria. Javier Tejel 29

En primer lugar, claramente |S| = 6+4−1



4−1 = 84, puesto que S no es más que el conjunto de las combi-
naciones con repetición de tamaño 6 del conjunto {a, b, c, d}. Para el cálculo de |E1 |, como necesitamos
submultisets con más de 4 a’s, elegimos 5 a’s para nuestro submultiset y el resto de los elementos  son
las combinaciones con repetición de tamaño 1 del conjunto {a, b, c, d}. Por tanto, |E1 | = 1+4−1 4−1 = 4.
Para el cálculo de |E2 |, elegimos 4 b’s para nuestro submultiset y el resto de los elementos  son las com-
binaciones con repetición de tamaño 2 del conjunto {a, b, c, d}. Por tanto, |E2 | = 2+4−1 4−1  = 10. Usando
4+4−1 3+4−1

el mismo tipo de razonamiento, se obtiene que |E3 | = 4−1 = 35 y que |E4 | = 4−1 = 20.
Vamos con las dobles intersecciones. Para contar los elementos en E1 ∩ E2 , tenemos que construir
submultisets con al menos 5 a’s y al menos 4 b’s. Pero eso es imposible ya que el tamaño de nuestros
submultisets es 6. Por tanto, E1 ∩ E2 = 0/ y |E1 ∩ E2 | = 0. Por el mismo motivo, |E1 ∩ E3 | = |E1 ∩ E4 | =
|E2 ∩ E4 | = 0. Con respecto a E2 ∩ E3 , tenemos que |E2 ∩ E3 | = 1, pues con  al menos 4 b’s y al menos 2
1+4−1
c’s solo está el submultiset (b, b, b, b, c, c). Por último, |E3 ∩ E4 | = 4−1 = 4, ya que elegidas 2 c’s y 3
d’s, el resto son combinaciones con repetición de tamaño 1 del conjunto {a, b, c, d}.
Usando argumentos similares, no es difícil ver que las intersecciones triples y la cuádruple son vacías.
En definitiva,
|S \ (E1 ∪ E2 ∪ E3 ∪ E4 )| = 84 − 4 − 10 − 35 − 20 + 1 + 4 = 20
Señalar por último que el principio de inclusión-exclusión también permite resolver el problema
de contar cuántos submultisests ordenados de tamaño r se pueden obtener a partir de un multiset (pro-
blema 1’), pero los cálculos en general son más complicados. La metodología es similar a la descrita
anteriormente para resolver problemas de tipo 2’, y hay que contar submultisets ordenados permitiendo
repeticiones ilimitadas, descontando después submultisets prohibidos de acuerdo a la composición del
multiset de partida.
Por ejemplo, ya calculamos mediante recurrencias que el número de submultisests ordenados de
tamaño 6 del multiset R = {a, a, a, a, b, b, b, c, d, d} era 1490 (ejemplo 1.21). Para resolver el problema
aplicando el principio de inclusión-exclusión, habría que definir S como el conjunto de submultisets
ordenados de tamaño 6, usando un número ilimitado de copias de los elementos {a, b, c, d}. El conjunto
E1 seria el conjunto de submultisets ordenados de tamaño 6, usando un número ilimitado de copias de los
elementos {a, b, c, d}, de forma que contengan más de 4 a’s. Los conjuntos E2 , E3 y E4 se definirían de
forma análoga a E1 , de forma que contengan más de 3 b’s, más de una c y más de 2 d’s, respectivamente.
Mientras que calcular |S| es sencillo, pues no son más que variaciones con repetición, calcular cuánto
vale cualquiera de los |Ei |, o cualquiera de las intersecciones entre los Ei , es más delicado.
En el caso de S, el total de submultisests ordenados de tamaño 6 con repeticiones ilimitadas no
es mas que |S| = 46 = 4096. Sin embargo, para calcular |E1 |, la solución no sería |E1 | = 65 41 = 24


(elegimos cinco a’s, que colocamos de 65 formas distintas, y el resto son submultisets de tamaño 1


con los elementos {a, b, c, d}), puesto que generaríamos sobreconteo, sino que la solución correcta sería
|E1 | = 65 31 + 66 30 = 19 (distinguimos si tenemos 5 a’s ó 6 a’s). Para E2 , E3 y E4 , tendríamos |E2 | =

6 6 6
 2  1  0
4 3 + 5 3 + 6 3 = 154, |E3 | = 1909 y |E4 | = 694.
En cuanto a las intersecciones, sólo E2 ∩ E3 y E3 ∩ E4 son no vacías. En el caso de E2 ∩ E3 , tenemos
que |E2 ∩ E3 | = 4!6!2! = 15, pues hay que permutar 4 b’s y 2 c’s. En el caso de E3 ∩ E4 , hay que distinguir
los casos en los que se tengan exactamente 2 c’s y 3 d’s, 2 c’s y 4 d’s, y 3 c’s y 3 d’s. Así, |E3 ∩ E4 | =
6 5! 1 6! 6!
5 2! 3! 2 + 2! 4! + 3! 3! = 155. En definitiva,

|S \ (E1 ∪ E2 ∪ E3 ∪ E4 )| = 4096 − 19 − 154 − 1909 − 694 + 15 + 155 = 1490

1.7. Ejercicios propuestos


En esta sección encontraréis los enunciados de varios problemas de combinatoria básica. Los prime-
ros ejercicios son en general un poco más sencillos que los siguientes. A algunos de los ejercicios hay
que dedicar un poco de tiempo para encontrar el mejor enfoque para resolverlos. Las soluciones a los
ejercicios no se encuentran aquí, sino en el último capítulo, con el objetivo de que penséis los problemas
antes de mirar sus soluciones.
30 Capítulo 1. Combinatoria elemental

1. Supongamos que queremos repartir 10 medallas entre 50 alumnos. Para cada uno de los siguientes
apartados, ¿de cuántas formas podemos hacerlo? La solución dependerá de si las medallas son
idénticas o no, y de si se permite a algún alumno recibir más de una medalla.

a) Las medallas son idénticas y está prohibido que un alumno reciba más de una medalla.
b) Las medallas son distintas y está prohibido que un alumno reciba más de una medalla.
c) Las medallas son idénticas y un alumno puede recibir un número arbitrario de éllas.
d) Las medallas son distintas y un alumno puede recibir un número arbitrario de éllas.
e) Hay 2 medallas de oro, 3 de plata y 5 de bronce, idénticas las de cada tipo, y un alumno no
puede recibir más de una.
f) Hay 2 medallas de oro, 3 de plata y 5 de bronce, idénticas las de cada tipo, y un alumno puede
recibir más de una y de todos los tipos.
g) Supongamos que el número de medallas es 50 y el número de alumnos es 10. ¿De cuántas
formas se pueden repartir las medallas si se consideran idénticas y cada alumno ha de recibir al
menos una?

2. Entre los 20 profesores de un departamento, hay que seleccionar a cinco de ellos para formar
un tribunal, que estará compuesto por un Presidente, un Secretario y tres Vocales. Los Vocales
son todos equivalentes y hacen las mismas funciones, pero sus funciones son distintas a las del
Presidente y a las del Secretario. Además, las funciones del Presidente también son distintas a las
del Secretario. Calcular de cuántas formas puede elegirse ese tribunal. Por ejemplo, si ponemos en
una lista (Presidente, Vocal, Vocal, Vocal, Secretario), el tribunal (A, B,C, D, E) es el mismo que
el (A,C, B, D, E), pero distinto del (B, A,C, D, E).

3. En un restaurante hay un menú de precio fijo. Un cliente puede elegir entre 3 platos del tipo
Primeros, {A, B,C}, 4 del tipo Segundos, {D, E, F, G}, y 2 del tipo Postres, {H, I}. Dar fórmulas
para el número de formas de elegir el menú para los siguientes casos.

a) El cliente elige un plato de cada tipo y los platos se sirven en el orden Primeros, Segundos,
Postres.
b) El cliente elige un plato de cada tipo y elige el orden en que los platos se sirven.
c) El cliente puede elegir tres platos arbitrarios distintos, de cualquier tipo. El orden en que se
sirven es fijo (Primeros, Segundos y Postres) y si hay varios del mismo tipo se sirven por orden
alfabético.
d) El cliente puede elegir tres platos de cualquier tipo y un plato puede estar repetido en esa
elección. Por ejemplo, puede pedir (A, A, D). El orden en que se sirven es fijo.
e) El cliente puede elegir tres platos arbitrarios distintos, de cualquier tipo, y elige también en qué
orden se sirven.
f) El cliente puede elegir tres platos de cualquier tipo, pueden estar repetidos, y elige también el
orden en que se sirven.

Supongamos que los segundos platos son más caros que los primeros y éstos más caros que los
postres. Por ello, en el menú se permite elegir tres platos, pero a lo más uno del grupo Segundos, y a
lo más dos pueden ser Primeros o Segundos (es decir, sobre la base Primeros, Segundos y Postres,
puedo cambiar un segundo plato por un primero o un postre, y un primer plato por un postre.) Dar
fórmulas para el número de formas de elegir menú con esta restricción en los siguientes casos.

g) El cliente puede elegir tres platos distintos (por ejemplo un primero y dos postres). El orden en
que se sirven es fijo.
h) El cliente puede elegir tres platos que pueden ser repetidos. El orden en que se sirven es fijo.
Grafos y Combinatoria. Javier Tejel 31

4. En un restaurante hay un menú de precio fijo. Un cliente puede elegir entre 3 primeros platos
{A, B,C}, 4 segundos {D, E, F, G} y 2 postres {H, I}. Dar fórmulas para el número de formas de
elegir el menú para dos personas en los siguientes casos.

a) Cada cliente elige un plato de cada tipo y los platos se sirven en el orden primero, segundo
y postre. El primer plato de cada tipo se sirve al primer cliente, y el segundo de cada tipo al
segundo cliente. Por ejemplo, si el camarero ha anotado A y C como Primeros, E y G como
Segundos, y H y H como postres, el primer cliente ha pedido (A, E, H) (y se le sirve en ese
orden) y el segundo (C, G, H).
b) Los dos clientes quieren compartir todos los platos, por lo que piden dos primeros distintos,
dos segundos distintos y dos postres distintos. En cada uno de los casos no importa el orden, es
decir, da igual pedir de primero (A, B) que pedir (B, A), pues los platos son para compartir. Se
sirven primero los primeros, después los segundos y por último los postres.
c) Cada cliente puede elegir tres platos arbitrarios, puede elegir platos repetidos, y elige también
el orden en que se sirven. Por ejemplo, el camarero puede haber anotado (A, A) como primeros,
(B, D) como segundos y (A, H) como terceros, con lo que al primer cliente le servirá (A, B, A),
y en este orden, y al segundo (A, D, H), y en ese orden.

5. Actualmente cada matrícula de coche consiste en una secuencia de cuatro cifras (10 opciones para
cada cifra) y tres letras (20 opciones, suponiendo que no se usan las vocales, ni Q, ni Ñ).

a) Calcular cuantas matrículas distintas pueden fabricarse.


b) Un testigo de un accidente recuerda que en la matrícula de un coche que se dió a la fuga,
aparecía un dígito repetido dos veces, una letra repetida dos veces, y ninguna otra repetición.
¿Cuántas matrículas satisfacen esa condición?
c) Supongamos que las matrículas se forman con una secuencia de d cifras (10 opciones para
cada cifra), seguida de una secuencia de l letras (20 opciones para cada letra), y que del coche
fugado sabemos que una cifra se repite r1 > 1 veces, una letra se repite r2 > 1 veces, y no hay
más repeticiones. Dar una fórmula para el número de posibles matrículas de ese coche fugado.

6. ¿De cuántas formas podemos ordenar las letras de la palabra PETACA? ¿De cuántas formas si está
prohibido que las tres consonantes vayan seguidas? ¿Y si prohibimos solamente que dos conso-
nantes vayan seguidas? ¿De cuántas formas si lo único prohibido es que las dos A vayan seguidas?

7. Un estudiante tiene que trabajar cinco días en el mes de julio, pero quiere que a lo más uno de esos
días sea domingo. ¿De cuántas formas puede elegir esos cinco días? (Vamos a suponer que julio
tiene cinco domingos este año.)

8. ¿Cuántos números de cuatro cifras hay en los que al menos una de las cifras sea 1? ¿Cuántos hay
con exactamente una, dos, tres, o cuatro cifras valiendo 1?

9. En una clase hay 21 alumnos. Queremos dividirlos en dos grupos no vacíos. ¿De cuántas formas
puede hacerse ese reparto? Entendemos que el reparto S1 , S2 es el mismo que el S2 , S1 , es decir, no
importa el orden de los dos grupos.

10. Un estanque contiene peces de cuatro colores A, B,C y D. Un naturalista saca un pez, anota el
color, y lo devuelve al estanque. Repite esa operación 10 veces y envia un informe con el número
de peces de cada color que ha obtenido. ¿Cuántos informes distintos puede haber? Un informe
puede ser (3A, 2B, 2C, 3D), y otro distinto es (4A, 6C).

11. En un Parlamento con 50 escaños los partidos A, B,C y D han sacado 20, 16, 12 y 2 escaños,
respectivamente. Se quiere hacer una comisión con cinco miembros, y sólo nos interesa el número
de miembros de cada partido que la componen. Por ejemplo, una comisión podría ser 2 del partido
A, 2 del B y 1 del C. ¿De cuántas formas puede elegirse esa comisión? Supongamos ahora que los
32 Capítulo 1. Combinatoria elemental

partidos han acordado que si el partido X tiene más escaños que el partido Y , en la comisión no
puede haber menos representantes de X que de Y (pero el número de representantes puede ser el
mismo). ¿De cuántas formas puede formarse esa comisión con esta restricción?

12. Calcular el número de enteros mayores de 5000 con todas sus cifras distintas, pero donde no
aparecen ni el 2 ni el 7.

13. ¿De cuántas formas distintas pueden sentarse 15 personas en una mesa redonda, si la persona 1 no
puede sentarse al lado de la 2?

14. De un grupo de 10 hombres y 12 mujeres, ¿de cuántas formas se puede elegir una comisión de 5
miembros, en la que al menos haya dos mujeres? ¿Cuántas si además el hombre 1 y la mujer 1 no
pueden pertenecer ambos a la comisión?

15. Diremos que un número es decreciente si todas sus cifras son decrecientes. Por ejemplo 430 y 621
son decrecientes, pero 988 o 978 no lo son. ¿Cuántos números decrecientes hay? ¿Cuántos hay
con 5 cifras?

16. ¿Cuántos subconjuntos de 3 números del conjunto {1, 2, . . . , 20} pueden elegirse con la condición
de que no haya dos números consecutivos?

17. Una clase tiene dos filas de 8 asientos. A la clase acuden 14 estudiantes, 5 de los cuales siempre se
sientan en la primera fila, y 4 siempre en la segunda. ¿De cuántas formas distintas pueden sentarse?

18. En una reunión hay 15 hombres y 20 mujeres. ¿De cuántas formas distintas pueden formarse 15
parejas? ¿Y 10 parejas?

19. ¿Cuál es el número de permutaciones de las letras de la palabra MISSISSIPI?

20. ¿De cuántas formas pueden estar colocadas 5 torres en un tablero de ajedrez 8 × 8, de forma que
ninguna pueda comer a ninguna otra? ¿Cuántas si además exigimos que la primera fila y la primera
columna tengan al menos una torre?

21. En una fila de 20 asientos se sientan 5 hombres y 6 mujeres.

a) Calcular el número de formas distintas de sentarse.


b) Calcular el número de formas distintas de sentarse si no puede haber dos hombres juntos.
c) Dar una fómula para el problema del apartado anterior si hay h hombres, m mujeres y s asientos.

22. ¿Cuántas soluciones enteras tiene la ecuación

x1 + x2 + x3 + x4 = 30

cumpliendo x1 ≥ 2, x2 ≥ 0, x3 ≥ −5, x4 ≥ 8?

23. Supongamos que tenemos 20 palillos consecutivos ocupando 20 plazas.

||||||||||||||||||||

a) ¿De cuántas formas podemos seleccionar 6 palillos de forma que no queden dos huecos segui-
dos?
b) ¿De cuántas formas podemos hacer la selección si entre cada dos palillos seleccionados debe
haber al menos otros dos palillos?
c) Si en lugar de 20 hay n palillos, queremos seleccionar k, y entre dos palillos seleccionados debe
haber al menos l, ¿de cuántas formas podemos hacer esa selección?
Grafos y Combinatoria. Javier Tejel 33

24. ¿De cuántas formas podemos distribuir 10 manzanas indistinguibles y una naranja entre tres niños,
de forma que cada uno obtenga al menos una fruta?

25. Los siete días de la próxima semana, un estudiante va a dedicar 38 horas a preparar un examen.
Desea repartir esas horas de manera que cada día estudie cuatro, cinco o seis horas. ¿De cuántas
formas puede hacer ese reparto de horas? Por ejemplo, un posible reparto es: 6 horas el lunes, 6 el
martes, 4 el miércoles, 5 el jueves, 5 el viernes, 6 el sábado y 6 el domingo.

26. Queremos colocar 20 libros en 5 estanterías, cada una de las cuales puede contener los 20 libros.
Los libros en una estantería siempre se colocan a la izquierda de la estantería. ¿De cuántas formas
distintas pueden colocarse suponiendo que los 20 libros son distintos? ¿Y si son indistinguibles?
¿Qué sucede si tenemos n libros indistinguibles, k estanterías, y cada estantería puede soportar
l ≤ n libros?

27. Hay 2n personas en una fiesta. Cada persona está hablando con otra, por lo que hay n pares de
personas. ¿Cuántas formas distintas de hacer esos pares hay?

28. Supongamos que la siguiente rejilla de tamaño 5 × 6 indica una red de calles.

¿De cuántas formas podemos ir desde la esquina inferior izquierda a la superior derecha con un ca-
mino de longitud mínima? ¿De cuántas formas en una rejilla n × m? ¿Y en una de tres dimensiones
n1 × n2 × n3 ?

29. Encontrar el número de enteros en el rango [1, 10000] que no son divisibles ni por 4, ni por 5, ni
por 6.

30. Determinar el número de submultisets de 12 elementos del multiset S = {4 · a, 3 · b, 4 · c, 5 · d}.


Determinar el número de submultisets de 10 elementos del multiset S = {∞ · a, 4 · b, 5 · c, 7 · d}.

31. Determinar el número de soluciones enteras de la ecuación

x1 + x2 + x3 + x4 = 14

tales que 0 ≤ xi ≤ 8. Calcular dicho número si 1 ≤ xi ≤ 8.

32. Determinar el número de soluciones enteras de la ecuación

x1 + x2 + x3 + x4 = 20

tales que
1 ≤ x1 ≤ 6, 0 ≤ x2 ≤ 7, 4 ≤ x3 ≤ 8, 2 ≤ x4 ≤ 6

33. Determinar el número de permutaciones del multiset

S = {3 · a, 4 · b, 2 · c}

tales que todas las letras del mismo tipo no pueden aparecer seguidas (no 3 a seguidas, ni 4 b, ni 2
c).

34. Demostrar que, para todo entero n > 0, se tiene que 2n


 n
n < 4 . (Usar el Teorema Binomial.)
34 Capítulo 1. Combinatoria elemental

35. Sea m ≥ 1 un entero dado. Encontrar para qué valores enteros de n y k, con n ≥ k ≥ 0, se cumple
la siguiente ecuación    
n n
=m
k+1 k

36. Demostrar que para todo número real r y enteros k y m, con m ≥ k ≥ 0, se cumple
     
r m r r−k
=
m k k m−k

n−1
37. Demostrar que para k y n enteros no negativos tales que k ≤ 2 , se verifica que
   
n n

k k+1
Además, la igualdad sólo se tiene si n = 2k + 1.
n−1
38. Demostrar que para k y n enteros no negativos tales que n ≥ k ≥ 2 , se verifica que
   
n n

k k+1
Además, la igualdad sólo se tiene si n = 2k + 1.

39. Dado un n arbitrario, calcular los valores de k que maximizan


   
n n
y k
k k

40. Demostrar que si k y n son enteros positivos entonces,


     
n n n n

k−1 k+1 k k

41. Una partícula puede estar en cualquiera de los puntos de coordenadas enteras (i, j) del plano.
Cuando está en el punto (i, j) puede moverse a uno de los puntos (i + 1, j), (i − 1, j), (i, j + 1)
o (i, j − 1). Supongamos que la partícula está inicialmente en el punto (0, 0), y después de 2l
movimientos ha vuelto al (0, 0). Hallar una fórmula para el número de formas distintas en las que
puede haber realizado esos 2l movimientos que le permiten volver al origen. Por ejemplo, si 2l = 4,
dos formas distintas de volver al origen con cuatro movimientos serían:

(0, 0) → (0, 1) → (0, 0) → (0, 1) → (0, 0)

(0, 0) → (0, 1) → (1, 1) → (1, 0) → (0, 0)


y en total hay 36 formas distintas de volver al origen con 4 movimientos.

42. Calcular el número de secuencias de longitud n formadas por los símbolos {0, +, −}, pero donde
el número de símbolos + es igual al número de símbolos −. Por ejemplo, si n = 4, las secuencias
(00 + −),(0000), (+ − +−) son legales, pero no lo es (+ + −0).

43. En una fila de 20 asientos se sientan 10 matrimonios (hombre-mujer). ¿De cuántas formas distintas
pueden sentarse si cada pareja se sienta junta (es decir, cada mujer tiene a su derecha o a su
izquierda a su marido)? ¿Y de cuántas formas si hay 6 matrimonios? Generalizar el problema para
el caso de n asientos y r matrimonios.

44. Un estudiante tiene que recibir 8 clases de conducir la próxima semana, de lunes a viernes.
Grafos y Combinatoria. Javier Tejel 35

a) ¿De cuántas formas distintas puede organizar esas clases? Por ejemplo, una opción es todas las
clases el lunes, otra distinta es 4 el lunes y 4 el martes, etc.
b) ¿De cuántas formas distintas puede hacerlo si cada día tiene que dar al menos una clase?
c) ¿De cuántas formas puede hacerlo si el viernes tiene que dar estrictamente más clases que el
martes?

45. Para poner los cinco exámenes del primer semestre de 1º de Matemáticas hay 17 días lectivos
disponibles.

a) Calcular de cuántas formas distintas pueden asignarse fechas a esos exámenes si entre un
examen y el siguiente tiene que haber al menos dos días libres. (Estamos interesados en fe-
chas y no en materias. Si las fechas de los exámenes son los días 3, 7, 11, 14 y 17, nos da igual
si el examen del día 3 es el de Análisis, o el de Álgebra, o el que sea.)
b) Generalizar el resultado anterior para n días lectivos, r exámenes y h días libres entre exámenes
(n = 17, r = 5, h = 2 en el apartado anterior).

46. Sea P = {p1 , p2 , . . . , pn } un conjunto de n ≥ 4 puntos en el plano, colocados en posición convexa,


es decir, los segmentos uniendo los puntos p1 , p2 , . . . , pn−1 , pn , p1 forman un polígono convexo.
Supongamos que no tres diagonales de ese polígono se cortan en un mismo punto. Calcular cuál
es el número de puntos de corte producidos cuando trazamos todas las diagonales.

47. En una clase de 70 alumnos, un profesor propone nueve problemas y da una medalla al primero
que resuelve cada problema. El alumno que resuelve el problema 1 en primer lugar recibe una
medalla de oro. Los primeros que resuelven los problemas 2, 3 ó 4 reciben medallas de plata, y los
que resuelven los problemas 5,6,7,8 ó 9 en primer lugar reciben medallas de bronce. Por supuesto,
un mismo alumno puede ser el primero en resolver varios problemas (o incluso todos), y recibirá
las medallas correspondientes.

a) Calcular de cuántas formas distintas pueden repartirse las medallas.


b) Generalizar el resultado para el caso de m alumnos, n1 medallas de tipo 1, n2 de tipo 2, . . . , nk
de tipo k.

48. En una clase hay 3n alumnos. Supongamos que n de ellos son buenos en la actividad A, otros n son
buenos en la actividad B, y los n restantes son buenos en la actividad C. Queremos agrupar a los
alumnos en grupos de tres, de forma que en cada grupo haya un alumno bueno en cada actividad.
Calcular el número de agrupaciones distintas que podemos hacer, teniendo en cuenta que sólo nos
interesan ternas, no el orden dentro de una terna. Por ejemplo, si n = 2 (por tanto hay 6 alumnos),
hay 4 formas distintas de hacer las ternas.

49. En el segundo cuatrimestre hay 80 días lectivos para trabajar. Un estudiante de Química tiene que
hacer 4 prácticas de laboratorio, y después de cada práctica tiene que elaborar un informe con los
resultados. Hasta que un informe no está entregado y revisado por el profesor, no puede realizar
la siguiente práctica. El profesor devuelve los informes revisados tres días después de haberlos
recibido. Además, el estudiante necesita tres días completos para hacer el informe. ¿De cuántas
formas distintas puede elegir los 4 días para hacer las prácticas, teniendo en cuenta que el último
informe debe entregarlo como muy tarde el día 80?

50. Una compañía de seguros tiene 5 empleados. Un empleado recibe un bonus por cada seguro que
contrata, pero si durante una semana no ha realizado ningún contrato puede sufrir una penalización.
El director ha decidido que, de entre los empleados que no han realizado ningún contrato en la
semana, uno de ellos será penalizado.

a) Supongamos que esta semana se han realizado 7 contratos. Calcular de cuántas formas distintas
pueden haberse repartido los bonus y las penalizaciones (si las hay) esta semana.
36 Capítulo 1. Combinatoria elemental

b) Generalizar el problema anterior para n empleados y r contratos.

51. He hecho una apuesta a la lotería primitiva, es decir, he seleccionado un conjunto de 6 números
en el rango [1, 49]. Sólo si en el sorteo salen esos 6 mismos números tendré un acierto pleno. ¿En
cuántos casos tendré exactamente 5, 4, 3, 2, 1 y 0 aciertos, respectivamente?

52. En una clase hay 30 estudiantes. Queremos formar con ellos un equipo de fútbol (11 jugadores)
y otro de baloncesto (5 jugadores). Calcular de cuántas formas puede hacerse la selección en los
siguientes casos.

a) Un mismo estudiante no puede estar en los dos equipos.


b) Los dos equipos pueden tener en común cualquier número de estudiantes.
c) A lo más 2 estudiantes pueden pertenecer a ambos equipos.
d) Generalizar el apartado anterior para el caso de n estudiantes, dos equipos con m1 y m2 miem-
bros cada uno, y a lo más k estudiantes pueden pertenecer a ambos equipos.

53. Sea S = {1, 2, . . . , k} y n > 0. Queremos hallar el número de secuencias de longitud k + n formadas
con los elementos de S, pero donde sólo uno de los elementos de S puede aparecer repetido en
la secuencia. Por ejemplo si S = {1, 2, 3} y n = 2 las secuencias 11213 ó 12222 son válidas pero
12123 no lo es. Hallar una fórmula para calcular ese número de secuencias.

54. Calcular el número de formas de ordenar los números 1, 2, . . . , n (suponemos n ≥ 4), de forma que
el 1 vaya antes que el 2 y el 3 antes que el 4. ¿Cuántas ordenaciones hay de forma que el 1 vaya
antes que el 2 y antes que el 3, y el 3 vaya antes que el 4?

55. ¿De cuántas formas podemos listar la secuencia {1, 1, 2, 2, 3, 4, 5} de forma que no haya dos nú-
meros iguales consecutivos?

56. ¿Cuántas tablas 2 × 2 podemos rellenar con los símbolos {0, 1, 2, . . . , k}, de forma que no haya
ninguna fila ni ninguna columna con todo ceros?

57. Un camarero tiene que trabajar 20 días en el mes de enero, pero cada fin de semana quiere dejarse
libre el sábado, el domingo o ambos. Supongamos que este mes de enero ha habido 4 fines de
semana.

a) Calcular de cuántas formas puede elegir los 20 días de trabajo.


b) Generalizar el resultado anterior para el caso de un periodo de n días, con k fines de semana, y
donde el camarero tiene que trabajar r días. (En el apartado anterior, n = 31, r = 20 y k = 4).

58. Sea S = {a, b, c, d}. Calcular el número de multisets de tamaño 10 que podemos formar con los
elementos de S, con la condición de que b aparece a lo más 4 veces, c aparece a lo más 5 veces y
d aparece a lo más 2 veces. Por ejemplo, un multiset legal es {5 ∗ a, 3 ∗ b, 2 ∗ d}.

59. Voy a celebrar una fiesta y he comprado licores de 5 tipos: 4 botellas de licor A, 3 del B, 3 del C, 1
del D y otra del E. En mi frigorífico sólo caben 10 botellas de licor. ¿De cuántas formas distintas
puedo llenar el frigorífico?

60. Tenemos un tablero de ajedrez 8 × 8. ¿De cuántas formas podemos colocar 8 torres idénticas de
forma que no se coman entre sí, (es decir, todas las torres tienen que estar en distintas filas y
columnas), y donde está prohibido colocar una torre en cualquiera de las 4 posiciones centrales del
tablero? Si numeramos las filas y columnas de 1 a 8, no podemos colocar torres en las posiciones
(4, 4), (4, 5), (5, 4), (5, 5).
Grafos y Combinatoria. Javier Tejel 37

61. Dar una fórmula para el número de soluciones enteras y mayores o iguales que cero del sistema

x1 + x2 + . . . + xr = n

y1 + y2 + . . . + yr = n
con la condición de que
x1 + y1 ≥ 1, x2 + y2 ≥ 1, . . . , xr + yr ≥ 1
Calcular ese número para r = 4 y n = 10.

62. Dar una fórmula para el número de soluciones enteras y mayores o iguales que cero del sistema

x1 + x2 + . . . + xr = n

sujeto a la condición xi ≤ k para todo i. Calcular ese número para r = 4, n = 10 y k = 7.

63. Calcular el número de soluciones enteras y mayores o iguales que 0 del sistema

x1 + x2 + x3 + x4 + x5 = 18

con la condición

(1 ≤ x1 ≤ 2), (2 ≤ x2 ≤ 3), (2 ≤ x3 ≤ 4), (4 ≤ x4 ≤ 5), (5 ≤ x5 ≤ 6)

64. En un concurso se van a repartir 20 premios entre tres concursantes distintos A, B y C. Calcular el
número de formas distintas de repartir esos premios en los siguientes casos.

a) Los premios son todos idénticos.


b) Los premios son todos distintos.
c) Los premios son idénticos, pero cada concursante debe recibir al menos un premio.
d) Los premios son todos distintos, pero cada concursante debe recibir al menos un premio.

65. ¿Cuántos números enteros hay en el rango [1, 1000000], de forma que la suma de sus cifras sea a
lo más 51? ¿Y cuántos de forma que la suma de sus cifras sea 6?

66. Dado un entero k ≥ 2, sea hn el número de secuencias de longitud n con los símbolos {1, . . . , k},
tales que no hay dos unos consecutivos. Hallar una fórmula de recurrencia para hn .

67. En una fila de n asientos de un cine están sentadas n personas. Antes de empezar la película,
algunos cambian su asiento con el de uno de sus vecinos adyacentes. Supongamos que ninguno
hace más de un cambio de asiento. Encontrar una recurrencia que dé el número de formas distintas
de sentarse haciendo esos cambios de asiento.

68. Supongamos que tenemos 2n puntos en un círculo. Sea hn el número de formas de unir estos
puntos en pares de forma que los correspondientes segmentos no se corten. Hallar una fórmula de
recurrencia para hn .

69. Dar una fórmula para el número de secuencias de longitud n formadas con los símbolos A, B y C,
donde no pueden aparecer dos símbolos iguales consecutivos. Por ejemplo, si n = 5, son legales
ABABA, ABCBA,..., y no son legales ACCBA, ABBBB,.....

70. Sea T un tablero 2×n (2 filas y n columnas). Queremos cubrirlo con fichas de dominó (rectángulos
1 × 2 ó 2 × 1). Encontrar una recurrencia que dé el número de formas de hacerlo.

71. En el juego de la ruleta hay dos colores, rojo y azul. Si hacemos una apuesta a un color y sale ese
color, ganamos lo apostado, y si sale el otro, perdemos lo apostado. Un jugador con mucho dinero
decide apostar siguiendo las siguientes reglas:
38 Capítulo 1. Combinatoria elemental

I) En cuanto gane una apuesta se retira.


II ) La primera vez apuesta un euro.
III ) En la apuesta k-ésima apuesta todo lo que lleva perdido más k.

Así, por ejemplo, si no gana ninguna de las 3 primeras apuestas, jugaría en la primera apuesta
1 euro, en la segunda 3 euros (1 + 2), en la tercera 7 euros (1 + 3 + 3) y en la cuarta 15 euros
(1 + 3 + 7 + 4).

a) Suponiendo que no ha ganado en ninguna de las apuestas anteriores, dar una fórmula (y de-
mostrarla) que nos diga cuánto ha de jugar en la apuesta n.
b) Supongamos que cambiamos la regla III) de hacer las apuestas a la siguiente regla: en la apuesta
k-ésima apuesta todo lo que lleva perdido más 2k. Hallar una fórmula explícita (y demostrarla)
que nos dé lo que se tiene que jugar en la apuesta n siguiendo esta nueva regla.

72. Dado un entero n > 0, una composición de n en k partes es una secuencia (a1 , a2 , . . . , ak ) de nú-
meros enteros positivos tales que ∑ki=1 ai = n. Hallar una fórmula de recurrencia para el número
de composiciones de n dónde cada parte sólo puede valer 1 ó 2. Por ejemplo, si n = 4, hay 5
composiciones válidas, que son: (1, 1, 1, 1), (2, 1, 1), (1, 2, 1), (1, 1, 2), (2, 2).

73. Sea S = {1, 2, . . . , n}. Hallar una fórmula de recurrencia para el número de subconjuntos de S que
no contienen tres números consecutivos. Por ejemplo, si hn es ese número, entonces h0 = 1 (0), /
h1 = 2 (0,
/ 1), h2 = 4 (0, / 1, 2, 12), h3 = 7 (0,
/ 1, 2, 3, 12, 13, 23), h4 = 13 (0,
/ 1, 2, 3, 4, 12, 13, 14,
23, 24, 34, 124, 134).
Capítulo 2

Funciones generatrices

Dentro del campo de la combinatoria, las funciones generatrices son una herramienta muy potente,
que permite abordar los problemas de conteo y enumeración de secuencias desde diferentes puntos de
vista. Por ejemplo, en la sección 1.5, vimos la sucesión de Fibonacci f0 , f1 , f2 , . . . , fn , . . ., como una
sucesión de números que respondía a la fórmula de recurrencia fn = fn−1 + fn−2 . Esta recurrencia permite
ir calculado iterativamente todos los componentes de la sucesión, a partir de unas condiciones iniciales
dadas. Pero, ¿se puede dar una fórmula cerrada para fn , que dependa sólo de n y no de otras cantidades
de la secuencia? ¿De qué orden de magnitud es fn ? ¿Se comportará fn como 5n para n suficientemente
grande? Las diferentes técnicas asociadas a las funciones generatrices tratan de dar respuesta a preguntas
como éstas.
En general, dada una secuencia de números f0 , f1 , f2 , . . . , fn , . . ., el uso de las funciones generatrices
trata de dar respuesta a problemas como los siguientes.

Encontrar una fórmula cerrada para los miembros de la secuencia.

Encontrar una fórmula de recurrencia para dicha secuencia.

Encontrar fórmulas asintóticas para los miembros de la secuencia.

Probar identidades asociadas a esa secuencia.

Aunque existen diferentes tipos de funciones generatrices (ordinarias, exponenciales, ...), en este
capítulo nos vamos a centrar en el estudio de las funciones generatrices ordinarias y algunos de sus usos
dentro del campo de la combinatoria.

2.1. Funciones generatrices ordinarias


Dada una secuencia infinita de números f0 , f1 , . . . , fn , . . . (que incluso pueden ser complejos), su
función generatriz ordinaria F(z), se define como la serie infinita:

f0 + f1 z + f2 z2 + . . . + fn zn + . . .

En forma compacta,

F(z) = ∑ f n zn
n=0

Por abreviar, a lo largo de todo este capítulo omitiremos la palabra ordinaria, con lo que cuando
hablemos de la función generatriz de una secuencia, entenderemos que estamos hablando de su función
generatriz ordinaria.
Por ejemplo, dada la secuencia de infinitos unos, 1, 1, . . . , 1, . . ., su función generatriz F(z) vendrá
dada por 1 + z + z2 + . . . + zn + . . ..

39
40 Capítulo 2. Funciones generatrices

Una de las ventajas que tiene el uso de las funciones generatrices es que una función generatriz puede
interpretarse de dos formas distintas. Por una parte, se puede interpretar como una expresión algebraica,
cuya manipulación formal nos puede permitir descubrir identidades o encontrar fórmulas explícitas para
las secuencias de números. Por otra parte, puede interpretarse como una suma infinita (una serie) para
cada valor de z. En este último caso, si D es el conjunto de valores de z para los que esa serie converge, la
función generatriz puede mirarse como una función F(z) de D en C, que a cada z ∈ D le asigna el valor
de esa suma infinita.
Vamos a ilustrar estas ideas con el ejemplo de la secuencia de infinitos unos, cuya función genera-
triz F(z) viene definida como 1 + z + z2 + . . . + zn + . . .. Desde un punto de vista algebraico, mirando
1 + z + z2 + . . . + zn + . . . como un polinomio de infinitos términos, hubiésemos podido comprobar alge-
braicamente que el producto (1 − z) · (1 + z + z2 + . . . + zn + . . .) = 1 − z + z − z2 + z2 − z3 + . . . vale 1.
Por tanto, (1 − z) · F(z) = 1, con lo que hubiésemos obtenido algebraicamente una forma explícita para
1
la función generatriz de las secuencia infinita de unos, F(z) = 1−z .
1
Si miramos esta forma explícita 1−z de la función generatriz como una función en z, esta función
está definida siempre que |z| ̸= 0. Además. calculando el desarrollo en serie de Taylor de esa función
(n)
F (0) n
en z = 0, obtenemos ∑∞ n=0 n! z = 1 + z + z2 + . . .. Esta última expresión (que es la expresión de
la función generatriz según la definición), es una serie geométrica de razón z desde un punto de vista
1 1
analítico, cuya suma vale 1−z siempre que |z| < 1. Luego 1−z y 1 + z + z2 + . . . coinciden para cualquier
valor de z tal que |z| < 1.

2.1.1. Series de potencias formales


Una vez ilustrado este doble comportamiento de las funciones generatrices, vamos a comentar con
más de detalle la manipulación algebraica de las mismas.
Hemos definido la función generatriz asociada a una secuencia de números f0 , f1 , . . . , fn , . . . como
F(z) = f0 + f1 z + f2 z2 + . . . + fn zn + . . .. A una expresión como la anterior, se la suele denominar una
serie de potencias formal. Una serie de potencias formal es una expresión de la forma

f 0 + f 1 z + f 2 z2 + . . . + f n zn + . . .

donde los números fn se denominan los coeficientes de la serie y f0 , f1 , . . . , fn , . . . es la secuencia de


coeficientes. Dos series son iguales si tienen la misma secuencia de coeficientes.
En la práctica, las series formales se pueden considerar como una extensión de los polinomios y se
pueden definir las mismas operaciones que en los polinomios: sumas, productos, derivadas,... A conti-
nuación, resumimos algunas de las operaciones habituales.
Sean F(z) = ∑n≥0 fn zn y G(z) = ∑n≥0 gn zn las series formales de las secuencias f0 , f1 , . . . , fn , . . . y
g0 , g1 , . . . , gn , . . ., respectivamente.

La suma de dos series formales, F(z) + G(z), es la serie formal ∑n≥0 ( fn + gn ) zn .

Dados a y b números cualesquiera, con a F(z) + b G(z) indicamos la serie formal ∑n≥0 (a fn +
b gn ) zn .

El elemento neutro de la operación suma, que denotaremos por 0, es la serie con todos los coefi-
cientes nulos 0, 0, . . .. Por tanto, F(z) + 0 = F(z).

La serie opuesta de F(z) es −F(z) = ∑n≥0 (− fn ) zn .

El producto de dos series formales, F(z) G(z), es la serie formal H(z) = ∑n≥0 hn zn , donde hn =
∑nk=0 fk gn−k = f0 gn + f1 gn−1 + . . . + fn−1 g1 + fn g0 .

El elemento neutro de la operación producto, que denotaremos por 1, es la serie con coeficientes
1, 0, 0, . . ..
Grafos y Combinatoria. Javier Tejel 41

G(z) es la recíproca de F(z) si el producto de ambas es la serie 1, es decir, si F(z) G(z) = 1. En


1
ese caso, escribiremos G(z) = F(z) .

La derivada F ′ (z) de una serie formal F(z) es la serie formal con término n-ésimo (n + 1) fn+1 , es
decir, F ′ (z) = ∑n≥0 (n + 1) fn+1 zn .
fn−1
La integral 0z f (t)dt de una serie formal F(z) es la serie formal con término n-ésimo
R
n , si n > 0,
y 0, si n = 0.

La condición necesaria y suficiente para que una serie formal tenga recíproca la da el siguiente
teorema.
1
Teorema 2.1. La serie formal F(z) = ∑n≥0 fn zn tiene recíproca, F(z) , si y sólo si, f0 ̸= 0

Demostración. Al multiplicar la serie F(z) por una serie arbitraria G(z) = ∑n gn zn , el coeficiente que
acompaña a zn en ese producto es ∑nk=0 fk gn−k . En particular, f0 g0 es el coeficiente que acompaña a z0 .
Si f0 = 0, entonces f0 g0 = 0 y no podemos obtener la serie 1. Luego f0 ̸= 0 es una condición necesaria
para que exista recíproca.
Veamos ahora que si f0 ̸= 0, entonces existe G(z) = ∑n≥0 gn zn , tal que F(z) G(z) = 1.
Si F(z) G(z) fuese 1, entonces el coeficiente ∑nk=0 fk gn−k que acompaña a zn en ese producto debe ser
siempre 0, excepto si n = 0. En este último caso, ha de ser f0 g0 = 1. Como f0 ̸= 0, para que se cumpla
que f0 g0 = 1 podemos definir g0 como
1
g0 =
f0
Una vez elegido g0 , para que f0 g1 + f1 g0 sea 0 (el coeficiente que acompaña a z en el producto), hay
que definir g1 como
− f1 g0
g1 =
f0
En general, una vez definidos g0 , g1 , . . . , gn−1 , para que ∑nk=0 fk gn−k = 0, hay que definir gn como

− ∑nk=1 fk gn−k
gn =
f0

Con esta elección de g0 , g1 , . . . , gn , . . ., estamos definiendo una serie G(z) tal que F(z) G(z) = 1, como
queríamos demostrar.

Si la secuencia de números es finita f0 , f1 , . . . , fn , la secuencia se puede considerar infinita sin más


que añadir infinitos ceros f0 , f1 , . . . , fn , 0, 0, . . .. En este caso, la función generatriz de una secuencia finita
f0 , f1 , . . . , fn no es mas:

F(z) = f0 + f1 z + . . . + fn zn + 0 zn+1 + 0 zn+2 + . . .

Normalmente, una serie formal con un número finito de coeficientes no nulos se identifica con un poli-
nomio. Así, por ejemplo, se suele escribir 2z − z3 en lugar de 0 + 2z + 0 z2 − z3 + 0 z4 + . . ..
′ (z)
Con todo lo anterior, podemos definir expresiones como z2 FG(z) , que sería la función generatriz
2 ′
correspondiente al producto de la serie z , por la serie de F (z), por la serie recíproca de G(z) (recíproca
respecto de la operación producto).
Reseñar por último, que si tenemos fórmulas explícitas F(z) y G(z) para las funciones generatrices
de las secuencias fn y gn , cualquier manipulación algebraica, como 3F(z)2 − 7G′ (z)G(z), es la fórmula
explícita de la función generatriz de una expresión algebraica ligando los coeficientes fn y gn . En este
ejemplo, 3F(z)2 − 7G′ (z)G(z) sería la función generatriz de la secuencia de coeficientes

hn = 3 ∑ fi f j − 7 ∑ (i + 1)gi+1 g j
i+ j=n i+ j=n
42 Capítulo 2. Funciones generatrices

2.1.2. Algunos ejemplos


En esta sección vamos a ver algunos ejemplos sencillos de manipulación de funciones generatrices y
de obtención de fórmulas explícitas para las mismas.

Ejemplo 2.1. Dada la secuencia, 1, γ, . . . , γ n , . . ., ¿cuál es su función generatriz?

Solución. Multiplicando (1 − γz) y la serie formal F(z) = 1 + γz + γ 2 z2 + . . ., obtenemos que (1 − γz) ·


1
(1 + γz + γ 2 z2 + . . .) = 1. Por tanto, F(z) = 1−γz .

Ejemplo 2.2. Dado un entero  n positivo  n, ¿cuál es la función generatriz de la secuencia finita de los
n n
coeficientes binomiales 0 , 1 , . . . , n ?

Solución. Tomando y = 1 en el Teorema Binomial, se tiene que (1 + x)n = ∑ni=0 ni xi . Por tanto, la


función generatriz de la secuencia finita de los coeficientes binomiales es F(z) = (1 + z)n .

Ejemplo 2.3. Dado un entero positivo k, sea hn el número de soluciones enteras no negativas de la
n+k−1 n+k−1
 
ecuación x1 + x2 + . . . + xk = n. Ya vimos en el ejemplo 1.14 que hn = k−1 = n . ¿Cuál es la
función generatriz de la secuencia infinita h0 , h1 , . . . , hn , . . .?
1
Solución. La función generatriz asociada a esa secuencia es F(z) = (1−z)k y la razón es la siguiente. Por
n+k−1 n 1


una parte, F(z) = ∑n=0 k−1 z por definición. Desarrollemos (1−z)k .

1 1 1 1
= · ·...· (k veces)
(1 − z)k (1 − z) (1 − z) (1 − z)
= (1 + z + z2 + . . .) · (1 + z + z2 + . . .) · . . . · (1 + z + z2 + . . .)
! ! !
∞ ∞ ∞
= ∑ zx 1
· ∑ zx 2
·...· ∑ zx k

x1 =0 x2 =0 xk =0

Al realizar este último producto, zn provendrá de multiplicar un cierto zx1 del primer factor, un cierto zx2
del segundo factor,..., y un cierto zxk del k-ésimo factor, con la condición de que x1 + x2 + . . . + xk = n.
Por tanto, el coeficiente que acompañe a zn en ese producto ha de ser el número de soluciones enteras no
negativas de la ecuación x1 + x2 + . . . + xk = n, que es precisamente n+k−1 n+k−1 1
 
k−1 = n . Por tanto, (1−z)k
es la función generatriz de la secuencia k−1 k n+k−1
  
0 , 1 ,..., n , . . ..

Ejemplo 2.4. ¿Para qué secuencia es (1 + z + z2 + z3 + z4 + z5 )(1 + z + z2 )(1 + z + z2 + z3 + z4 ) su función


generatriz?

Solución. Vamos a argumentar como en el ejemplo anterior. Si realizamos el producto, el termino zn del
resultado se obtiene del producto de un término zx1 del primer factor, un término zx2 del segundo factor,
y un término zx3 del tercer factor, con la condición de que x1 + x2 + x3 = n. Por tanto, el coeficiente
que acompañe a zn en el producto tiene que ser el número de soluciones enteras fn de la ecuación
x1 + x2 + x3 = n, con la restricciones 0 ≤ x1 ≤ 5, 0 ≤ x2 ≤ 2 y 0 ≤ x3 ≤ 4. Luego (1 + z + z2 + z3 + z4 +
z5 )(1 + z + z2 )(1 + z + z2 + z3 + z4 ) es la función generatriz de esa secuencia fn . Notar que fn = 0 si
n > 5 + 2 + 4.

Ejemplo 2.5. Tenemos 3 helados de chocolate, 2 de vainilla, 1 de fresa y 4 de nata en el frigorífico, y


sacamos n de ellos, para n = 0, . . . , 10. ¿Cuál es la función generatriz de la secuencia f0 , . . . , f10 , donde
fn representa las formas de sacar n de esos 10 helados?

Solución. El problema es el inverso del ejemplo anterior. Si x1 es el número de helados de chocolate que
sacamos, x2 el de helados de vainilla, x3 el de helados de fresa y x4 el de helados de nata, las formas fn
de sacar n helados son las soluciones enteras de la ecuación x1 + x2 + x3 + x4 = n, con las restricciones
Grafos y Combinatoria. Javier Tejel 43

0 ≤ x1 ≤ 3, 0 ≤ x2 ≤ 2, 0 ≤ x3 ≤ 1 y 0 ≤ x4 ≤ 4. Por tanto, aplicando el resultado del ejemplo anterior,


la función generatriz será: (1 + z + z2 + z3 )(1 + z + z2 )(z)(1 + z + z2 + z3 + z4 ), o equivalentemente
1 + 4z + 9z2 + 15z3 + 20z4 + 22z5 + 20z6 + 15z7 + 9z8 + 4z9 + z10

Observa que, en realidad, este último ejemplo es exactamente el mismo que resolvimos por recurren-
cia en el ejemplo 1.22. Dado el multiset S = {a, a, a, a, b, b, b, c, d, d}, en ese ejemplo calculábamos el
número de submultisets de tamaño n, para n = 0, . . . 10, usando k de las letras distintas, para k = 1 . . . 4.
La tabla que obtuvimos fue

k\r 0 1 2 3 4 5 6 7 8 9 10
1 1 1 1 1 1 0 0 0 0 0 0
2 1 2 3 4 4 3 2 1 0 0 0
3 1 3 5 7 8 7 5 3 1 0 0
4 1 4 9 15 20 22 20 15 9 4 1

Ahora las a’s juegan el papel de helados de nata, las b’s los de chocolate, la c el de fresa y las d’s los
de vainilla. Los números de la última fila de la tabla son los submultisets de tamaño n, para n = 0 . . . 10,
del multiset S, que coinciden con los coeficientes de los términos zn de la función generatriz calculada
en el ejemplo anterior.
Ejemplo 2.6. ¿Cuál es la función generatriz para la sucesión de Fibonacci, cuando f0 = 0 y f1 = 1?
Solución. El término general de la sucesión de Fibonacci, fn , viene definido a través de la recurrencia
fn = fn−1 + fn−2 , para n ≥ 2. Por definición, la función generatriz es F(z) = ∑∞ n
n=0 f n z . Como f 0 = 0 y
∞ n ∞
f1 = 1, tenemos que F(z) = ∑n=1 fn z = z + ∑n=2 fn z . n

Ya que fn = fn−1 + fn−2 , para n ≥ 2, sustituyendo fn por fn−1 + fn−2 en la expresión anterior y
realizando algunos cálculos, obtenemos
∞ ∞ ∞ ∞
F(z) = z + ∑ fn zn = z + ∑ ( fn−1 + fn−2 ) zn = z + ∑ fn−1 zn + ∑ fn−2 zn
n=2 n=2 n=2 n=2
∞ ∞ ∞ ∞
= z+z ∑ fn−1 zn−1 + z2 ∑ fn−2 zn−2 = z + z ∑ fn zn + z ∑ fn zn 2
n=2 n=2 n=1 n=0
= z + z F(z) + z2 F(z)
Despejando F(z) de la igualdad F(z) = z + z F(z) + z2 F(z), obtenemos que la función generatriz es
z
F(z) =
1 − z − z2

Este último ejemplo ilustra una situación que es común en las relaciones de recurrencia. Las ecua-
ciones de recurrencia no sólo dan un método para calcular un término genérico fn de la secuencia, sino
que generalmente proporcionan una ecuación (o sistema de ecuaciones) que debe cumplir la función
generatriz. Esto permite en muchos casos obtener una forma explícita para la función generatriz.
Nota 2.1. Aunque nosotros no vamos a manejarlas en este curso, cuando la secuencia f0 , f1 , . . . , fn , . . . es
de crecimiento muy rápido en n, en lugar de usar la función generatriz ordinaria se suele usar la llamada
función generatriz exponencial, definida como la serie

zn
Fe (z) = ∑ fn n!
n=0
f1 fn
o lo que es lo mismo, la función generatriz ordinaria correspondiente a la secuencia f0 , 1! , . . . , n! , . . ..
44 Capítulo 2. Funciones generatrices

2.1.3. Función generatriz desde el punto de vista analítico


Uno de los principales usos de la función generatriz cuando se interpreta como una suma infinita para
cada valor de z es que, si se encuentra algebraicamente una fórmula explícita para la función generatriz
F(z), se puede dar el orden de magnitud aproximado de los elementos de la secuencia f0 , f1 , . . . , fn , . . .
Como ya hemos comentado antes, cuando la función generatriz F(z) = ∑∞ n
n=0 f n z se interpreta como
una suma infinita para cada valor de z, habrá valores de z para los que esa serie converja y valores para
los que no. Si D es el conjunto de valores de z para los que la serie converge, la función generatriz puede
mirarse como una función F(z) de D en C, que a cada z ∈ D le asigna el valor de esa suma infinita. Esta
función F(z) es siempre infinitamente diferenciable.
Si sabemos encontrar una fórmula explícita para F(z), podremos determinar los elementos fn me-
diante el desarrollo en serie de Taylor en z = 0 de la función generatriz F(z), es decir,

F (n) (0)
fn =
n!

Además, a través del análisis de las singularidades de la función F(z), también podremos conocer el
orden de magnitud de los elementos de la secuencia f0 , f1 , . . . , fn , . . .. Este orden de magnitud se obtiene
a partir de los siguientes teoremas del análisis complejo, de los que no incluimos demostración. La idea
1 n

fundamental de estos teoremas es que el orden de magnitud de fn es r , donde r es el módulo de la
singularidad de F(z) más cercana al origen. Algunas de las singularidades más comunes son valores de
z que anulan un denominador o valores de z que anulan un radicando.

Teorema 2.2. Sea F(z) = ∑n≥0 fn zn . Existe un número real R llamado radio de convergencia de la
serie, con 0 ≤ R ≤ ∞, tal que la serie converge ∀z ∋ |z| < R, diverge ∀z ∋ |z| > R, y se verifica que
lı́m supn→∞ | fn |1/n = 1/R (entendiendo 1/0 = ∞ y 1/∞ = 0).
Además, la función F(z) es analítica en su disco de convergencia, {z ∈ C | |z| < R}, y debe tener al
menos una singularidad en la frontera de ese disco, {z | |z| = R}.

Teorema 2.3. Recíprocamente, supongamos que la función generatriz de ∑ fn zn es la función F(z) y


que F(z) es analítica en alguna región conteniendo el origen. Sea z0 la singularidad de menor módulo
de F(z). Entonces, lı́m sup | fn |1/n = 1/|z0 |. Equivalentemente, dado ε > 0, existe un entero N(ε) tal que,
fn < (1/|z0 | + ε)n , ∀n > N(ε), y fn > |1/|z0 | − ε|n para infinitos valores de n.

Veamos algunos ejemplos.

Ejemplo 2.7. Dada la sucesión de Fibonacci f0 , f1 , . . . , fn , . . ., con f0 = 0 y f1 = 1, ¿cuál es el orden de


magnitud de fn ?
z
Solución. En el ejemplo 2.6, obtuvimos que la función generatriz era F(z) = 1−z−z 2 . Esta función es
analítica alrededor del origen y sus únicas singularidades son los valores de z que√anulan el denominador.

Resolviendo la ecuación 1−z−z2 = 0, se obtiene que sus dos raíces son z1 = −1−2 5 y z2 = −1+2 5 . Como
z2 es la singularidad de menor módulo, por los teoremas anteriores,

p
n 1 2 1+ 5
lı́m | fn | = = √ =
|z2 | −1 + 5 2

o equivalentemente, dado ε > 0, a partir de un cierto n0 se verifica que


√ !n √ !n
1+ 5 1+ 5
−ε < fn < +ε
2 2
Grafos y Combinatoria. Javier Tejel 45

z
En el ejemplo anterior, observa que si evaluamos la función F(z) = 1−z−z 2 en z = 1, obtenemos
F(1) = −1. Por otro lado, como todos los fn son positivos (excepto f0 que vale 0), si la serie ∑∞ n
n=0 f n z
convergiese en z = 1, lo debería hacer a un número positivo. Lo que esto nos dice es que la serie no
z
puede ser convergente para z = 1 De hecho, puesto que la singularidad más cercana al origen de 1−z−z 2

es −1+2 5 ≈ 0,618, la función z
1−z−z2
y la serie ∑∞ n
n=0 f n z sólo pueden coincidir para valores de z tales
que |z| < 0,618.
Ejemplo 2.8. Supongamos que tenemos 2n puntos en un círculo. Sea fn el número de formas de unir
estos puntos en pares de forma que los correspondientes segmentos no se corten. ¿De qué orden de
magnitud es fn ?
Solución. Este es el ejercicio 68 del capítulo 1. Allí se vio que fn satisfacía la siguiente recurrencia
n
fn = ∑ fi−1 · fn−i
i=1

asumiendo que f0 = 1. Cambiando el índice de sumación, la recurrencia se transforma en


n
fn+1 = ∑ fi · fn−i
i=0

válida para n ≥ 0. Sea F(z) = fn zn la función generatriz de la secuencia f0 , f1 , . . . , fn , . . .. Si


∑∞
n=0
calculamos su cuadrado y operamos, tenemos
! !
∞ ∞ ∞
F(z)2 = ∑ fn zn · ∑ f n zn = ∑ ( f0 · fn + f1 · fn−1 + . . . + fn · f0 ) zn
n=0 n=0 n=0
∞ ∞
1 1 ∞ 1
= ∑ fn+1 zn = ∑ f n+1 zn+1
= ∑ fn zn = (F(z) − 1)
n=0 z n=0 z n=1 z

Luego la función generatriz satisface que F(z)2 = 1z (F(z) − 1). Es una ecuación de segundo grado en
√ √
F(z), cuyas soluciones son 1− 2z1−4z y 1+ 2z1−4z . De estas dos soluciones, la primera es la que corresponde
a F(z). Las posibles singularidades de esta función son los valores de z que anulan el denominador, o los
valores de z donde el radicando pasa de positivo a negativo, es decir, las soluciones de 1 − 4z = 0. Como
existe el límite de F(z) cuando z tiende a 0, la única singularidad de esta función se encuentra en z = 14 .
Por tanto, para n suficientemente grande, tendremos que

(4 − ε)n < fn < (4 + ε)n


1 2n

De hecho, aunque aquí no lo vamos a hacer, se puede demostrar que fn = n+1 n . A la cantidad Cn =
1 2n

n+1 n , se la suele denominar número de Catalan.

2.1.4. Teorema Binomial generalizado


m n m−n
Por el Teorema binomial descrito en la sección 1.3, sabemos que (x + y)m = ∑m

n=0 n x y para
un número natural m, y para valores x e y cualesquiera. Si m es un número real cualquiera α, Newton
demostró que
∞  
α n α−n
(x + y)α = ∑ x y
n=0 n

Hay que recordar que si α es un número real, αn se define como
 
α α(α − 1) . . . (α − n + 1)
C(α, n) = =
n n!

excepto si n = 0, que en ese caso se define como α0 = 1.
Vamos a demostrar la generalización del Teorema binomial usando funciones generatrices.
46 Capítulo 2. Funciones generatrices

Teorema 2.4 (Teorema binomial generalizado). Para cualquier número real α y números arbitrarios
(reales o complejos) x e y, se tiene que
∞  
α α n α−n
(x + y) = ∑ x y (2.1)
n=0 n
x
Demostración. Haciendo el cambio z = y en la ecuación 2.1, dicha ecuación se transforma en
∞  
α α n
(1 + z) = ∑ z (2.2)
n=0 n

Luego demostrar 2.1 es equivalente


  a demostrar 2.2. Fijado α, sea F(z) la función generatriz asocia-
da a la secuencia α0 , α1 , . . . , αn , . . .. Nos bastará con demostrar que la fórmula explícita de F(z) es
precisamente (1 + z)α .
Sea fn = αn . Por la definición de αn = α(α−1)...(α−n+1)
 
n! , es fácil ver que fn satisface la siguiente
recurrencia
α − (n − 1)
fn = fn−1
n
para todo n > 0, o equivalentemente
n fn = α fn−1 − (n − 1) fn−1
Por definición, F(z) = ∑n≥0 fn zn , con lo que se tiene que F ′ (z) = ∑n>0 n fn zn−1 . Multiplicando la
recurrencia anterior por zn−1 , obtenemos que
n fn zn−1 = α fn−1 zn−1 − (n − 1) fn−1 zn−1
Sumando para todos los valores de n mayores que 0, obtenemos

∑ n fn zn−1 = ∑ α fn−1 zn−1 − ∑ (n − 1) fn−1 zn−1


n>0 n>0 n>0
con lo que
F ′ (z) = αF(z) − zF ′ (z)
En consecuencia,
F ′ (z) α
=
F(z) 1+z
F ′ (z) α
Como la derivada de ln(F(z)) es F(z) , y la de α ln(1 + z) + c es (1+z) , necesariamente
ln(F(z)) = α ln(1 + z) + c = ln ((1 + z)α ec )
Por tanto,
F(z) = (1 + z)α ec
La condición f0 = 1 = F(0) implica que la constante c de la ecuación anterior debe ser cero, por lo
que
F(z) = (1 + z)α

Nota 2.2. Hay que notar que, como función en z, la función (1 + z)α dará el valor de la serie ∑n≥0 αn zn


solamente cuando esta serie sea convergente. A su vez, para saber cuando esta serie es convergente, basta
ver dónde aparecen las singularidades de la función (1 + z)α . Esta función no tiene singularidades para
valores de α enteros y positivos, pues es un polinomio, y tiene una primera singularidad en z = −1 para
cualquier otro valor real de α. Por tanto, la fórmula
∞  
α α n
(1 + z) = ∑ z
n n
es válida para todo z, si α es un entero positivo, y para todo z con |z| < 1, si α es cualquier otro número
real.
Grafos y Combinatoria. Javier Tejel 47

Algunos ejemplos de aplicación de este Teorema Binomial generalizado son los siguientes.
Ejemplo 2.9. ¿Cuál es la función generatriz de la secuencia fn = (−1)n n+m−1

m−1 , para un m natural
fijado?
Solución. Apliquemos el Teorema Binomial generalizado para α = −m. Tenemos que
∞  
1 −m n
=∑ z
(1 + z)m n=0 n

Desarrollando −m

n ,
 
−m −m · (−m − 1) · . . . · (−m − n + 1) m · (m + 1) · . . . · (m + n − 1)
= = (−1)n
n n! n!
   
m+n−1 m+n−1
= (−1)n = (−1)n
n m−1
1
Por tanto, (1+z)m es la función generatriz buscada.
m+n−1

Ejemplo 2.10. ¿Cuál es la función generatriz de la secuencia fn = m−1 , para un m natural fijado?
Solución. En el ejemplo anterior hemos obtenido que
∞  
1 n m+n−1
= ∑ (−1) zn
(1 + z)m n=0 m−1
1
Evaluando la función (1+z)m en −z, obtenemos que
∞  
1 m+n−1 n
=∑ z
(1 − z)m n=0 m−1
m+n−1

con lo que volvemos a obtener (ver ejemplo 2.3) que la función generatriz de la secuencia m−1 es
1
(1−z)m .

m+n−1
 n
Ejemplo 2.11. ¿Cuál es la función generatriz de la secuencia fn = m−1 γ , para un m natural fijado
y un valor γ fijado?
Solución. Del ejemplo anterior, tenemos que
∞  
1 m+n−1 n
=∑ z
(1 − z)m n=0 m−1
1
Evaluando la función (1−z)m en γz, obtenemos que
∞  
1 m+n−1 n n
=∑ γ z
(1 − γz)m n=0 m−1

En particular, si m = 1, obtenemos que



1
= ∑ γ n zn
(1 − γz) n=0
resultado que ya conocíamos del ejemplo 2.1. Además, si γ = 1, tenemos que

1
= ∑ zn
(1 − z) n=0
1
con lo que estamos obteniendo de otra forma que (1−z) es la función generatriz de la secuencia de todo
unos.
48 Capítulo 2. Funciones generatrices

2.2. Funciones generatrices racionales


En esta sección analizaremos una familia especial de funciones generatrices llamadas funciones ge-
neratrices racionales. Una función generatriz F(z) es racional si es de la forma

P(z)
F(z) =
Q(z)

donde P(z) y Q(z) son polinomios en z.


La importancia de este tipo de funciones radica en que, si para una secuencia f0 , f1 , . . . , fn , . . . su
función generatriz F(z) es racional (donde se puede asumir que el grado de Q(z) es mayor que el grado
de P(z)), entonces los números de la secuencia satisfacen un tipo especial de recurrencia, y viceversa, si
la secuencia de números f0 , f1 , . . . , fn , . . . satisface ese tipo especial de recurrencia, entonces la función
generatriz F(z) es una función generatriz racional.
Esta correspondencia permite dar métodos de resolución para esas recurrencias particulares, que
pasamos a estudiar a continuación.

2.2.1. Recurrencias lineales homogéneas con coeficientes constantes


Una secuencia f0 , f1 , . . . , fn , . . . se dice que satisface una recurrencia lineal de orden k si existen
cantidades a1 , . . . , ak , con ak ̸= 0, y en tales que

fn = a1 fn−1 + ... + ak fn−k + en

con n ≥ k.
Una recurrencia lineal se llama homogénea si en = 0, y se dice que tiene coeficientes constantes si
a1 , . . . , ak son constantes.
Como veremos más adelante, cuando una secuencia f0 , f1 , . . . , fn , . . . satisface una recurrencia lineal
homogénea con coeficientes constantes, entonces su función generatriz es una función racional. Esto
permite resolver la recurrencia y encontrar una fórmula explícita para fn en función de n. En este proceso,
nos será de mucha utilidad saber que, por el Teorema Binomial generalizado
∞  
1 m+n−1 n n
=∑ γ z
(1 − γz)m n=0 m−1

para cualquier m entero y cualquier γ.


Antes de enunciar el resultado fundamental de esta sección, vamos a ilustrar las ideas subyacentes a
través de algunos ejemplos.
Ejemplo 2.12. Supongamos que la secuencia f0 , f1 , . . . , fn , . . . satisface la recurrencia

fn = 7 fn−1 − 12 fn−2

para n ≥ 2, con unos valores iniciales f0 y f1 . Obtener una fórmula explícita de fn .


Solución. Si multiplicamos la función generatriz de la secuencia F(z) = f0 + f1 z + f2 z2 + . . . por el
polinomio (1 − 7z + 12z2 ), obtenemos

(1 − 7z + 12z2 ) · ( f0 + f1 z + f2 z2 + . . .) =

= f0 + (−7 f0 + f1 )z + (12 f0 − 7 f1 + f2 )z2 + . . . + (12 fn−2 − 7 fn−1 + fn )zn + . . .


Como nuestra secuencia satisface la recurrencia fn = 7 fn−1 − 12 fn−2 para n ≥ 2, el coeficiente que
acompaña a zn en la expresión anterior es siempre 0, si n ≥ 2. Por tanto,
f0 + (−7 f0 + f1 )z
F(z) =
1 − 7z + 12z2
Grafos y Combinatoria. Javier Tejel 49

Por ejemplo, si los valores iniciales hubiesen sido f0 = 0 y f1 = 1, los primeros valores de nuestra
secuencia habrían sido 0, 1, 7, 37, 175, 781, . . ., y la función generatriz
z
F(z) =
1 − 7z + 12z2
Por contra, si los valores iniciales hubiesen sido f0 = 1 y f1 = 0, los primeros valores de nuestra
secuencia habrían sido 1, 0, −12, −84, −444, −2100, . . ., y la función generatriz
1 − 7z
F(z) =
1 − 7z + 12z2
En cualquier caso, para cualquier secuencia f0 , f1 , . . . , fn , . . . que satisfaga la recurrencia

fn = 7 fn−1 − 12 fn−2

para n ≥ 2, su función generatriz tiene siempre la misma forma

f0 + (−7 f0 + f1 )z
F(z) =
1 − 7z + 12z2
El denominador es siempre el mismo, un polinomio de segundo grado, y el numerador es un polinomio
de grado uno, cuyos coeficientes dependen de las condiciones iniciales f0 y f1 de la secuencia.
Las raíces de Q(z) = 1 − 7z + 12z2 son 31 y 14 , con lo que Q(z) se puede factorizar de la forma (1−7z+
12z2 ) = (1 − 4z)(1 − 3z). Aplicando el método de descomposición en fracciones simples, obtendremos

f0 + (−7 f0 + f1 )z −3 f0 + f1 4 f0 − f1
F(z) = = +
1 − 7z + 12z2 (1 − 4z) (1 − 3z)
1 n n
Por el Teorema Binomial generalizado, sabemos que (1−γz) = ∑∞n=0 γ z para cualquier γ. Si aplicamos
este resultado en la expresión anterior, tomando γ = 4 y γ = 3, nos queda
∞ ∞
−3 f0 + f1 4 f0 − f1
F(z) = + = (−3 f0 + f1 ) ∑ 4n zn + (4 f0 − f1 ) ∑ 3n zn
(1 − 4z) (1 − 3z) n=0 n=0

= ∑ ((−3 f0 + f1 )4n + (4 f0 − f1 )3n ) zn
n=0

De esta forma, estamos obteniendo la siguiente fórmula explícita para fn en función de n

fn = (−3 f0 + f1 )4n + (4 f0 − f1 )3n

En definitiva, lo que obtenemos para cualquier secuencia que satisfaga la recurrencia fn = 7 fn−1 −
12 fn−2 , es que el término general fn depende siempre de los términos 4n y 3n , que van multiplicados por
unas constantes que dependen de las condiciones iniciales. Las constantes 4 y 3 son las inversas de las
raíces del polinomio (1 − 7z − 12z2 ).

La recurrencia fn = 7 fn−1 − 12 fn−2 utilizada en el ejemplo no tiene nada de especial. El mismo


método puede utilizarse para cualquier recurrencia lineal homogénea con coeficientes constantes, donde
el término fn se pueda calcular como una combinación lineal de d términos anteriores de la forma

fn + a1 fn−1 + a2 fn−2 + . . . + ad fn−d = 0

con ad ̸= 0.
P(z)
En este caso, la función generatriz F(z) va a ser una función racional Q(z) , donde

Q(z) = 1 + a1 z + a2 z + . . . + ad zd
50 Capítulo 2. Funciones generatrices

y P(z) va a ser un polinomio de grado d − 1, donde los coeficientes van a depender de las d condiciones
iniciales f0 , f1 , . . . , fd−1 asociadas a la recurrencia.
Factorizando Q(z) de la forma Q(z) = (1 − γ1 z)(1 − γ2 z) . . . (1 − γd z), donde γ1 , . . . , γd son las inver-
sas de las raíces de Q(z), y aplicando la descomposición en fracciones simples y el Teorema Binomial
generalizado, obtendremos que
fn = c1 γ1n + c2 γ2n + . . . + cd γdn
donde las constantes c1 , c2 , . . . , cd sólo dependen de las condiciones iniciales f0 , f1 , . . . , fd−1 .
Todo lo expuesto anteriormente es válido si las raíces del polinomio Q(z) tienen multiplicidad 1. Si
Q(z) tiene raíces múltiples, entonces hay que incorporar a la descomposición en fracciones simples esa
multiplicidad de las raíces, a la hora de obtener la fórmula explícita para fn . Vamos a ver un ejemplo.
Ejemplo 2.13. Supongamos que la secuencia f0 , f1 , . . . , fn , . . . satisface la recurrencia

fn = 4 fn−1 − 5 fn−2 + 2 fn−3

para n ≥ 2, con unos valores iniciales f0 , f1 y f2 . Obtener una fórmula explícita de fn .


Solución. Como en el ejemplo anterior, si multiplicamos la función generatriz de la secuencia F(z) =
f0 + f1 z + f2 z2 + . . . por el polinomio (1 − 4z + 5z2 − 2z3 ), obtenemos que la función generatriz vale
f0 + (−4 f0 + f1 )z + (5 f0 − 4 f1 + f2 )z2
F(z) =
1 − 4z + 5z2 − 2z3
Por ejemplo, si los valores iniciales hubiesen sido f0 = 3, f1 = 3 y f2 = 4, los primeros valores de
nuestra secuencia habrían sido 3, 3, 4, 7, 14, 29, 60, . . ., y la función generatriz
3 − 9z + 7z2
F(z) =
1 − 4z + 5z2 − 2z3
Las raíces de Q(z) = (1 − 4z + 5z2 − 2z3 ) son 1, 1 y 21 , con lo que Q(z) se puede factorizar de la forma
Q(z) = (1 − z)(1 − z)(1 − 2z). Ahora, el uno es una raíz doble.
Aplicando el método de descomposición en fracciones simples, teniendo en cuenta que ahora tene-
mos raíces múltiples, obtendremos
f0 + (−4 f0 + f1 )z + (5 f0 − 4 f1 + f2 )z2 f0 − 2 f1 + f2 2 f0 − f1 −2 f0 + 3 f1 − f2
F(z) = = + +
1 − 4z + 5z2 − 2z3 (1 − 2z) (1 − z) (1 − z)2
y usando el Teorema Binomial generalizado, tenemos
f0 − 2 f1 + f2 2 f0 − f1 −2 f0 + 3 f1 − f2
F(z) = + +
(1 − 2z) (1 − z) (1 − z)2
∞ ∞  

n n n n n+1 n n
= ( f0 − 2 f1 + f2 ) ∑ 2 z + (2 f0 − f1 ) ∑ 1 z + (−2 f0 + 3 f1 − f2 ) ∑ 1 z
n=0 n=0 n=0 1

= ∑ (( f0 − 2 f1 + f2 )2n + ((2 f0 − f1 ) + (−2 f0 + 3 f1 − f2 )(n + 1)) 1n ) zn
n=0

De esta forma, estamos obteniendo la siguiente fórmula explícita para fn en función de n

fn = ( f0 − 2 f1 + f2 )2n + ((2 f0 − f1 ) + (−2 f0 + 3 f1 − f2 )(n + 1)) 1n

En definitiva, lo que obtenemos para cualquier secuencia que satisfaga la recurrencia fn = 4 fn−1 −
5 fn−2 + 2 fn−3 , es que el término general fn depende siempre de los términos 2n y 1n , donde 2 y 1 son
los inversos de las raíces de Q(z), que van multiplicados por una constante en el primer caso, y por un
polinomio en n de grado 1 en el segundo caso. La constante y los coeficientes del polinomio en n de
grado uno sólo dependen de las condiciones iniciales.
Si las condiciones iniciales hubiesen sido f0 = 3, f1 = 3 y f2 = 4, habríamos obtenido que fn =
2n − n + 2.
Grafos y Combinatoria. Javier Tejel 51

El efecto que ha tenido el hecho de que el 1 fuese una raíz doble, es que el término que acompaña
a 1n en la fórmula explícita de fn ya no es una constante, sino que es un polinomio en n de grado 1 (la
multiplicidad de la raíz menos 1).
En general, lo que sucede es que si γ11 , . . . , γ1k son las raíces de Q(z) con multiplicidades d1 , . . . , dk ,
respectivamente, el término γin que aparece en la fórmula explícita de fn va acompañado de un polinomio
en n de grado di − 1.
Una vez ilustrada con ejemplos esta relación entre las recurrencias lineales homogéneas con coefi-
cientes constantes y las funciones generatrices racionales, damos el teorema fundamental de esta rela-
ción. Debido a la longitud y detalles técnicos de su demostración, la vamos a omitir, aunque las ideas
fundamentales de la demostración son las expuestas anteriormente en los ejemplos.

Teorema 2.5. Sea a1 , . . . , ad una secuencia de números complejos, con d ≥ 1 y ad ̸= 0, y sea Q(z) =
1 + a1 z + a2 z2 + . . . + ad zd . Supongamos que las raíces de Q(z) = 0 son γ11 , . . . , γ1k , con multiplicidades
d1 , . . . , dk , respectivamente (por tanto ∑ki=1 di = d).
Las siguientes condiciones sobre la secuencia fn (de números complejos) son equivalentes:

i) Para todo n ≥ 0,
fn+d + a1 fn+d−1 + a2 fn+d−2 + . . . + ad fn = 0

ii) Para todo n ≥ 0,


k
fn = ∑ pi (n)γin
i=1

donde pi (n) es un polinomio en n de grado menor que di .

iii) La función generatriz asociada a la secuencia fn es

P(z)
∑ fn zn = Q(z)
n≥0

donde P(z) es un polinomio de grado menor que d.

Lo primero a resaltar es que decir que γ11 , . . . , γ1k son las raíces de Q(z) = 0 con multiplicidades
d1 , . . . , dk , respectivamente, equivale a decir que
k
Q(z) = ∏(1 − γi z)di
i=1

pues estos dos polinomios tienen el mismo grado, las mismas raíces con la misma multiplicidad, y el
mismo término independiente. De hecho, ya hemos estado usando este resultado en los ejemplos ante-
riores.
Por otra parte, lo que nos está diciendo el teorema anterior es lo siguiente. La condición i) es una
ecuación de recurrencia, y nos expresa el término fn+d en función (de hecho es una combinación lineal)
de d valores anteriores
fn+d = −(a1 fn+d−1 + a2 fn+d−2 + . . . + ad fn )
Por tanto, conocidos d valores iniciales f0 , f1 , . . . , fd−1 , podemos conocer fn para cualquier valor n.
Además, distintos valores iniciales nos darán distintas secuencias. Al conjunto de secuencias fn que
cumplen esa recurrencia lo vamos a llamar F1 .
La condición ii) representa otra familia de secuencias. Dados k polinomios pi (n), cada uno con grado
menor que di , consideramos la secuencia dada por
k
fn = ∑ pi (n)γin
i=1
52 Capítulo 2. Funciones generatrices

Distintas elecciones de polinomios pi (n) darán distintas secuencias fn . Llamemos F2 a este nuevo con-
junto de secuencias.
Finalmente, sea F3 la familia de secuencias fn cuya función generatriz es de la forma
P(z)
Q(z)
con P(z) un polinomio de grado menor que d. Distintas elecciones de P(z) darán lugar a diferentes
secuencias fn . Observar que Q(z) es una series de potencias y su primer término (coeficiente de z0 ) vale
1
1, por lo que existe serie formal recíproca Q(z) .
El teorema nos dice que estas tres familias de secuencias, F1 , F2 y F3 , coinciden.

Resolución de recurrencias lineales homogéneas con coeficientes constantes


Dada una secuencia f0 , f1 , . . . , fn , . . . satisfaciendo una recurrencia lineal homogénea, y dadas unas
condiciones iniciales para esa secuencia, el teorema 2.5 proporciona un método para encontrar una fór-
mula explícita para fn . Antes de detallar el método, vamos a definir lo que se llama el polinomio carac-
terístico.
Dada una secuencia f0 , f1 , . . . , fn , . . ., satisfaciendo la recurrencia
fn+d + a1 fn+d−1 + a2 fn+d−2 + . . . + ad fn = 0
para n ≥ 0, al polinomio R(z) definido como
R(z) = zd + a1 zd−1 + a2 zd−2 + . . . + ad−1 z + ad
se le denomina polinomio característico o ecuación característica.
P(z)
Por el teorema 2.5, la función generatriz F(z) asociada a la secuencia tendrá la forma Q(z) , con
2 d d 1

Q(z) = 1 + a1 z + a2 z + . . . + ad z . Por definición, R(z) coincide con z Q z , lo que implica que si
1 1
γ1 , . . . , γk son las raíces de Q(z), entonces γ1 , . . . , γk son las raíces de R(z).
De forma resumida, un método para resolver una recurrencia lineal homogénea con coeficientes
constantes
fn+d + a1 fn+d−1 + a2 fn+d−2 + . . . + ad fn = 0
y condiciones iniciales f0 , f1 , . . . , fd−1 es el siguiente.
1. Buscar las raíces γ1 , . . . , γk , junto con sus multiplicidades d1 , . . . , dk , del polinomio característico
R(z) = zd + a1 zd−1 + a2 zd−2 + . . . + ad−1 z + ad .
2. Plantear la solución genérica de la recurrencia
fn = (c10 + c11 n + . . . + c1d1 −1 nd1 −1 )γ1n + . . . + (ck0 + ck1 n + . . . + ckdk −1 ndk −1 )γkn

Como la suma de las multiplicidades es d, es decir ∑ki=1 di = d, el número de constantes cij que
aparecen en la solución genérica es precisamente d.
3. Encontrar las d constantes cij utilizando las condiciones iniciales f0 , f1 , . . . , fd−1 , resolviendo un
sistema de d ecuaciones con d incógnitas.
Tomando n = 0, la primera de las ecuaciones sería
f0 = c10 + c20 + . . . + ck0
Tomando n = 1, la segunda de las ecuaciones sería
f1 = (c10 + c11 + . . . + c1d1 −1 )γ1 + . . . + (ck0 + ck1 + . . . + ckdk −1 )γk
y así sucesivamente hasta n = d − 1, cuya ecuación sería
fd−1 = (c10 + c11 (d − 1) + . . . + c1d1 −1 (d − 1)d1 −1 )γ1d−1 + . . . +
+(ck0 + ck1 (d − 1) + . . . + ckdk −1 (d − 1)dk −1 )γkd−1
Grafos y Combinatoria. Javier Tejel 53

Una de las mayores dificultades del método está en el cálculo de las raíces del polinomio caracte-
rístico R(z), en cuanto d crece. Hay que tener en cuenta que, aunque los coeficientes fn sean enteros,
las raíces de R(z) pueden ser números irracionales e incluso números complejos. Además, la resolución
del sistema de d ecuaciones lineales y d incógnitas también se complica en cuanto d crece, pudiendo
también ser irracionales o complejas las soluciones del sistema. El sistema siempre tiene solución y es
única por el teorema 2.5.
Veamos algunos ejemplos del método.
Ejemplo 2.14. Resolver la recurrencia fn = 2 fn−1 + fn−2 − 2 fn−3 , válida para n ≥ 3, con las condiciones
iniciales f0 = 1, f1 = 2 y f2 = 0.
Solución. El polinomio característico R(z) será R(z) = z3 − 2z2 − z + 2, cuyas raíces son 1, −1 y 2. Como
la multiplicidad de cada una de las raíces es 1, la solución genérica será

fn = c1 1n + c2 (−1)n + c3 2n

Para determinar las constantes c1 , c2 y c3 , utilizamos las condiciones iniciales f0 = 1, f1 = 2 y f2 = 0.


El sistema a resolver es 
1 = c1 + c2 + c3 
2 = c1 − c2 + 2c3
0 = c1 + c2 + 4c3

cuyas soluciones son c1 = 2, c2 = − 32 , y c3 = − 31 . Por tanto, la fórmula explícita para fn queda


2 1
fn = 2 − (−1)n − 2n
3 3

Ejemplo 2.15. Dada la sucesión de Fibonacci f0 , f1 , . . . , fn , . . ., que sabemos que satisface la recurrencia
fn = fn−1 + fn−2 , para n ≥ 2, dar una fórmula explícita para fn , si las condiciones iniciales son f0 = 0 y
f1 = 1.
Solución. El polinomio característico R(z) será R(z) = z2 − z − 1, cuyas raíces son
√ √
1+ 5 1− 5
γ1 = y γ2 =
2 2
Como la multiplicidad de cada una de las raíces es 1, la solución genérica será
√ !n √ !n
1+ 5 1− 5
f n = c1 + c2
2 2

Para determinar las constantes c1 y c2 , utilizamos las condiciones iniciales f0 = 0 y f1 = 1. El sistema


a resolver es )
0 = c1  + c2 
√  √
1+ 5 1− 5
1 = c1 2 + c2 2

cuyas soluciones son c1 = √1 y c2 = − √15 . Por tanto, la fórmula explícita para fn queda
5
√ !n √ !n
1 1+ 5 1 1− 5
fn = √ −√
5 2 5 2

 √ n
Observar que, cuando n tiende a infinito, el término 1−2 5 tiende a cero, con lo que el orden de
 √ n
magnitud de fn es fn ≈ √15 1+2 5 , resultado que ya habíamos obtenido en el ejemplo 2.7.
54 Capítulo 2. Funciones generatrices

Ejemplo 2.16. Dar una fórmula explícita para la secuencia fn dada por la recurrencia

fn = 4 fn−1 − 5 fn−2 + 4 fn−3 − 4 fn−4

cuando los valores iniciales son f0 = 0, f1 = 1, f2 = 2 y f3 = 4.

Solución. Los primeros valores de esta secuencia son 0, 1, 2, 4, 10, 24, 54, 120, 266, 584, 1270, . . .. El po-
linomio característico es
R(z) = z4 − 4z3 + 5z2 − 4z + 4
cuyas raíces son: 2, con multiplicidad 2, i y −i. Luego la solución genérica es

fn = c1 (i)n + c2 (−i)n + (c3 + c4 n)2n

Usando las condiciones iniciales f0 = 0, f1 = 1, f2 = 2 y f3 = 4, tendremos que resolver el sistema



c1 + c2 + c3 = 0 

c1 i + c2 (−i) + (c3 + c4 ) 2 = 1

c1 (−1) + c2 (−1) + (c3 + 2c4 ) 4 = 2  
c1 (−i) + c2 (i) + (c3 + 3c4 ) 8 = 4

−6+8 i
y la solución es c1 = − 6+8 i
50 , c2 =
12 5
50 , c3 = 50 y c4 = 50 . En consecuencia, la fórmula explícita para
fn es  
6 + 8 i n −6 + 8 i n 12 5
fn = − (i) + (−i) + + n 2n
50 50 50 50

Nota 2.3. Suele ser usual que, en la búsqueda de la fórmula explícita para fn , aparezcan números irracio-
nales o complejos. Pero en los problemas de tipo combinatorio, como es nuestro caso, el resultado final
tiene que ser un entero, es decir, las partes irracionales y complejas deben de cancelarse entre sí cuando
se calcula fn para algún n en particular.
En el ejemplo anterior, si evaluamos fn cuando n = 1, obtenemos
 
6+8 i −6 + 8 i 12 5
f1 = − i+ (−i) + + 2
50 50 50 50
6 i 8 i2 6 i 8 i2 34
= − − + − +
50 50 50 50 50
16 34
= + =1
50 50

que se corresponde con el valor inicial que teníamos f1 = 1

2.2.2. Recurrencias lineales no homogéneas con coeficientes constantes


Las relaciones de recurrencia

fn = a1 fn−1 + ... + ak fn−k + en

que no son homogéneas, es decir, en ̸= 0, son más difíciles de resolver en general. Dependiendo de cómo
sea la parte no homogénea en , se pueden necesitar técnicas especiales para resolver la recurrencia.
Cuando vayamos a resolver una relación de recurrencia no homogénea, la primera observación a
tener en cuenta es que nos es suficiente con encontrar una solución particular de la recurrencia para
conocer la solución completa de la recurrencia. El siguiente teorema resume esta observación.
Grafos y Combinatoria. Javier Tejel 55

Teorema 2.6. Sea F0 la familia de secuencias { fn } que satisfacen la recurrencia

fn+d + a1 fn+d−1 + a2 fn+d−2 + . . . + ad fn = 0

sea F1 la familia de secuencias {gn } que satisfacen la recurrencia no homogénea

fn+d + a1 fn+d−1 + a2 fn+d−2 + . . . + ad fn = en

y sea {g1n } una secuencia de F1 .


Entonces
F1 = {g1n } + F0
es decir, cualquier secuencia de la forma {g1n + fn0 }, con { fn0 } una solución de la recurrencia homogénea,
es solución de la ecuación no homogénea, y no hay otras soluciones que no sean de esa forma.

Demostración. Si { fn0 } es una secuencia que satisface la recurrencia homogénea, es fácil comprobar que
0 +a f0
{g1n + fn0 } pertenece a F1 , puesto que fn+d 0 1 1 1
1 n+d−1 + . . . + ad f n = 0 y gn+d + a1 gn+d−1 + . . . + ad gn =
en :

(g1n+d + fn+d
0
) + a1 (g1n+d−1 + fn+d−1
0
) + . . . + ad (g1n + fn0 ) =
g1n+d + a1 g1n+d−1 + . . . + ad g1n + = en

Recíprocamente, si {g2n } es otra solución de la no homogénea, es inmediato comprobar que {g2n − g1n }
es solución de la recurrencia homogénea puesto que

(g2n+d − g1n+d ) + a1 (g2n+d−1 − g1n+d−1 ) + . . . + ad (g2n − g1n ) = en − en = 0

Por tanto, {g2n } es de la forma indicada en el teorema.

Este resultado nos dice que si conocemos un elemento (solución particular) {g1n } de F1 , entonces
conocemos todas las soluciones de la recurrencia no homogénea. Además, la fórmula explícita genérica
de esas soluciones es
k
fn = ∑ pi (n)γin + g1n
i=1

donde ∑ki=1 pi (n)γin es la solución genérica de la recurrencia homogénea.


Aunque encontrar una solución particular para una recurrencia no homogénea puede ser complica-
do, hay situaciones en las que es sencillo hallarla, como muestra el siguiente teorema que damos sin
demostración.

Teorema 2.7. Sea fn una secuencia que satisface la relación de recurrencia no homogénea

fn+d + a1 fn+d−1 + a2 fn+d−2 + . . . + ad fn = en

Supongamos que en = q(n) γ0n , donde q(n) es un polinomio en n de grado h0 y γ0 una constante. Su-
pongamos además que el polinomio Q(z) = 1 + a1 z + a2 z2 + . . . ad zd se puede factorizar de la forma
Q(z) = ∏ki=0 (1 − γi z)di , siendo d0 + d1 + . . . + dk = d, pero donde puede ser que d0 sea cero (es decir, γ10
no sería raíz de Q(z)).
Entonces, la recurrencia no homogénea tiene una solución particular de la forma

nd0 (b0 + b1 n + . . . + bh0 nh0 ) γ0n

donde b0 , b1 , . . . , bh0 son constantes.


56 Capítulo 2. Funciones generatrices

Resolución de recurrencias lineales no homogéneas con coeficientes constantes


El teorema anterior da un método para resolver una recurrencia lineal no homogénea con coeficientes
constantes, cuando la parte no homogénea es de una forma particular.
Dada la recurrencia

fn+d + a1 fn+d−1 + a2 fn+d−2 + . . . + ad fn = q(n)γ0n

con las condiciones iniciales f0 , f1 , . . . , fd−1 , donde q(n) es un polinomio en n de grado h0 , el método
para resolverla sería el siguiente.

1. Buscar las raíces γ0 , . . . , γk , junto con sus multiplicidades d0 , . . . , dk , del polinomio característico
R(z) = zd + a1 zd−1 + a2 zd−2 + . . . + ad−1 z + ad .

2. Usando la propia recurrencia, buscar una solución particular de la forma g1n = nd0 (b0 + b1 n + . . . +
bh0 nh0 ) γ0n , donde d0 será cero si γ0 no es raíz del polinomio característico.

3. Plantear la solución general como la suma de la solución genérica de la recurrencia homogénea y


la solución particular anterior

fn = (c00 + c01 n + . . . + c0d1 −1 nd0 −1 )γ0n + . . . + (ck0 + ck1 n + . . . + ckdk −1 ndk −1 )γkn + g1n

4. Encontrar las d constantes cij utilizando las condiciones iniciales f0 , f1 , . . . , fd−1 , resolviendo un
sistema de d ecuaciones con d incógnitas.

Veamos algunos ejemplos.

Ejemplo 2.17. Resolver la recurrencia


fn = 2 fn−1 + 1
para n ≥ 1, con la condición inicial f0 = 0.

Solución. El polinomio característico R(z) es R(z) = (z − 2), con lo que sólo tiene la raíz 2. Ya que la
parte no homogénea es de la forma q(n) γ0n , con q(n) = 1 y γ0 = 1, la solución particular que tenemos
que buscar será de la forma b 1n , con b una constante a determinar.
Como la solución particular ha de satisfacer la recurrencia, usaremos esta última para determinar b.
Así, la solución particular ha de verificar

b 1n = 2(b 1n−1 ) + 1

con lo que
b = 2b + 1
y entonces b = −1.
La solución general es entonces de la forma

fn = c 2n − 1 · 1n

Utilizando la condición inicial f0 = 0, determinamos c evaluando la solución general en n = 0. Tenemos


entonces que
0 = c−1
con lo que c = 1. Por tanto, la solución general es

f n = 2n − 1
Grafos y Combinatoria. Javier Tejel 57

Ejemplo 2.18. Resolver la recurrencia

fn = 6 fn−1 − 9 fn−2 + 2n

para n ≥ 2, con las condiciones iniciales f0 = 0 y f1 = 1.


Solución. El polinomio característico R(z) es R(z) = z2 − 6z + 9, con lo que sólo tiene la raíz 3, que será
de multiplicidad 2.
Ya que la parte no homogénea es de la forma q(n) γ0n , con q(n) = 2n y γ0 = 1, la solución particular
que tenemos que buscar será de la forma (a + b n) 1n , con a y b constantes a determinar. Usando la
recurrencia, tenemos para la solución particular

(a + b n)1n = 6((a + b (n − 1)) 1n−1 ) − 9((a + b(n − 2))1n−2 ) + 2n

con lo que
a + b n = 6a − 6b − 9a + 18b + (6b − 9b + 2)n
Ya que lo que tenemos es una igualdad entre dos polinomios en n de grado 1, los términos independientes
y los coeficientes que acompañan a n han de ser iguales. Tenemos así las siguientes ecuaciones

a = −3a + 12b
b = −3b + 2

cuya resolución nos da que a = 32 y b = 12 . La solución particular buscada es 3+n n


2 1 = 3+n
2 .
Como el 3 tiene multiplicidad 2, la solución general queda de la forma
3+n
fn = (c + dn) 3n +
2
Utilizando las condiciones iniciales f0 = 0 y f1 = 1, determinamos c y d evaluando la solución general
en n = 0 y n = 1. Así,
0 = c + 32


1 = 3c + 3d + 2
con lo que c = − 32 y d = 7
6 son las soluciones a ese sistema de ecuaciones. Por tanto, la solución general
es
−9 + 7n n 3 + n
fn = 3 +
6 2

Ejemplo 2.19. Dar una fórmula explícita para la secuencia fn dada por la recurrencia

fn − 3 fn−1 + 2 fn−2 = n2n

cuando los valores iniciales son f0 = 0 y f1 = 1.


Solución. El polinomio característico es

R(z) = z2 − 3z + 2

cuyas raíces son 1 y 2.


La parte no homogénea es n2n . Como el 2 es raíz de R(z) con multiplicidad 1, la solución particular
que hemos de buscar tendrá la forma n(a + bn)2n = (an + bn2 )2n . Usando la recurrencia, tenemos

(an + bn2 )2n − 3 (a(n − 1) + b(n − 1)2 )2n−1 + 2 (a(n − 2) + b(n − 2)2 )2n−2 = n2n
 

Simplificando por 2n−2 , obtenemos

4(an + bn2 ) − 6 a(n − 1) + b(n − 1)2 + 2 a(n − 2) + b(n − 2)2 = 4n


 
58 Capítulo 2. Funciones generatrices

Operando y simplificando nos queda


4bn + 2a + 2b = 4n
Por tanto, b ha de ser 1 para que 4b = 4, y a = −1 para que 2a + 2b = 0.
La solución general queda entonces de la forma

fn = c1n + d2n + (−n + n2 )2n

Sabiendo que las condiciones iniciales son f0 = 0 y f1 = 1, y evaluando la solución general en n = 0 y


n = 1, tenemos las ecuaciones 
0 = c+d
1 = c + 2d
con lo que c = −1 y d = 1. Por tanto, la solución general es

fn = (1 − n + n2 )2n − 1

Nota 2.4. La solución particular puede también obtenerse evaluando la solución particular sobre la recu-
rrencia para los primeros valores de n, tantos como constantes haya que calcular en la solución particular.
En el ejemplo anterior, teníamos que

(an + bn2 )2n − 3 (a(n − 1) + b(n − 1)2 )2n−1 + 2 (a(n − 2) + b(n − 2)2 )2n−2 = n2n
 

En lugar de simplificar por 2n−2 , operar e igualar coeficientes de polinomios, vamos a evaluar esta ex-
presión cuando n = 0 y n = 1 (pues tenemos que determinar dos constantes, a y b). Cuando n = 0, la
expresión anterior queda    
−a + b −2a + 4b
−3 +2 =0
2 4
y cuando n = 1  
−a + b
2(a + b) + 2 =2
2
Simplificando estas dos ecuaciones, nos quedan las ecuaciones a + b = 0 y a + 3b = 2, cuya solución es
la que ya habíamos obtenido en el ejemplo anterior, a = −1 y b = 1.

Nota 2.5. Si la parte no homogénea de una relación de recurrencia es de la forma en = e1n + e2n + . . . + ern ,
entonces una solución particular gn para la recurrencia

fn+d + a1 fn+d−1 + a2 fn+d−2 + . . . + ad fn = en

se obtiene de la forma gn = g1n + . . . + grn , donde cada gin es una solución particular de la recurrencia no
homogénea
fn+d + a1 fn+d−1 + a2 fn+d−2 + . . . + ad fn = ein
En particular, si cada una de las ein es de la forma qi (n)γin , entonces podemos aplicar el Teorema 2.7
para encontrar las soluciones particulares gin correspondientes a las partes no homogéneas ein , y construir
la solución particular g1n + . . . + grn cuando la parte no homogénea es en .

Ejemplo 2.20. Dar una fórmula explícita para la secuencia fn dada por la recurrencia

fn − 3 fn−1 + 2 fn−2 = n2n + 3n

cuando los valores iniciales son f0 = 0 y f1 = 1.


Grafos y Combinatoria. Javier Tejel 59

Solución. La parte no homogénea es ahora n2n + 3n . Para encontrar una solución particular correspon-
diente a esa parte no homogénea, habrá que encontrar soluciones particulares cuando la parte no ho-
mogénea es n2n y cuando es 3n . Para n2n , ya hemos obtenido en el ejemplo 2.19 la solución particular
(−n + n2 )2n .
Cuando la parte no homogénea es 3n , la solución particular será de la forma a3n , pues 3 no es raíz
del polinomio característico R(z) = z2 − 3z + 2. Evaluándola en la recurrencia, obtenemos que a3n −
3a3n−1 + 2a3n−2 = 3n , con lo que a tiene de ser 29 . Por tanto, la solución general es

9
fn = c1n + d2n + (−n + n2 )2n + 3n
2
Sabiendo que las condiciones iniciales son f0 = 0 y f1 = 1, y evaluando la solución general en n = 0 y
n = 1, tenemos las ecuaciones
0 = c + d + 92


1 = c + 2d + 272
7
con lo que c = 2 y d = −8. Por tanto, la solución general es

9 7
fn = (−8 − n + n2 )2n + 3n +
2 2

2.2.3. Teorema de Schur


P(z)
Cuando la función generatriz F(z) de una secuencia f0 , f1 , . . . , fn , . . . es racional, es decir F(z) = Q(z) ,
el Teorema 2.5 nos garantiza que fn es de la forma fn = ∑ki=1 pi (n)γin , donde γ11 , . . . , γ1k , con multiplici-
dades d1 , . . . , dk , son las raíces de Q(z) = 0, y donde pi (n) es un polinomio en n de grado menor que
di .
Si en lugar de dar una fórmula explícita para fn sólo nos interesa conocer su orden de magnitud,
entonces es suficiente con conocer el mayor (en módulo) de γ1 , . . . , γk , o dicho de otra forma, la menor
de las raíces (en módulo) de Q(z). Así, si suponemos |γ1 | > |γ2 | > . . . > |γk |, entonces

fn ≈ p1 (n)γ1n

En la práctica, calcular todas las raíces de Q(z) (o equivalentemente, todas las raíces del polinomio
característico R(z) de la recurrencia asociada al problema), no suele ser tarea fácil. Pero sí puede ser fácil
calcular la raíz de menor módulo de Q(z), con lo que podremos dar el orden de magnitud de fn .
Si todas las raíces tienen el mismo módulo, entonces el orden de magnitud de fn (en su parte poli-
nómica) viene marcado por el polinomio de mayor grado en fn = ∑ki=1 pi (n)γin . Dicho polinomio corres-
ponde a la raíz γ1i de Q(z) que tenga mayor multiplicidad.
El Teorema de Schur que vamos a ver en esta sección nos da el orden de magnitud de fn en la situa-
ción en la que todas las raíces de Q(z) tienen módulo uno. Esta situación particular se corresponde con el
problema de las propinas que ya estudiamos en la sección 1.5.6. Dicho problema consistía en lo siguien-
te. Si queremos dejar una propina de valor n y tenemos j tipos de monedas de valores v(1), . . . , v( j),
respectivamente, ¿de cuántas formas se puede dejar esa propina de valor n usando esos j tipos de mone-
das?
El problema era equivalente a buscar el número de soluciones enteras y positivas de la ecuación

v(1) · x1 + v(2) · x2 + . . . + v( j) · x j = n

o dicho de otra forma, de cuántas formas puede expresarse el número n como combinación lineal entera
y no negativa de los valores v(1), . . . , v( j).
El siguiente teorema nos da el orden de magnitud para ese número de formas.
60 Capítulo 2. Funciones generatrices

Teorema 2.8 (Teorema de Schur). Sea fn el número de formas en que un entero n puede expresarse
como combinación lineal entera y no negativa de j enteros positivos v(1), v(2), . . . , v( j).
Si mcd(v(1), v(2), . . . , v( j)) = 1 (el máximo común divisor de v(1), . . . , v( j)), entonces fn es asintó-
ticamente
n j−1
+ O(n j−2 )
( j − 1)! v(1) v(2) . . . v( j)

Aunque no vamos a dar la demostración formal de este resultado, sí que vamos a ver la idea general
de la misma a través de un ejemplo.
Supongamos que tenemos monedas de 1 céntimo, de 2 céntimos y de 5 céntimos ( j es tres y v(1) =
1, v(2) = 2 y v(3) = 5), y queremos calcular el número de formas de dar una propina de valor n con ellas,
número al que vamos a llamar fn . El problema de calcular fn es equivalente al número de soluciones
enteras y no negativas de la ecuación

1 · x1 + 2 · x2 + 5 · x3 = n

Veamos en primer lugar qué forma tiene la función generatriz F(z) de la secuencia f0 , f1 , . . . , fn , . . .
1 ∞ rn
Por el Teorema Binomial generalizado, sabemos que (1−z r ) = ∑n=0 z . Realicemos el siguiente producto

! ! !
∞ ∞ ∞
1 1 1
· ·
(1 − z ) (1 − z ) (1 − z5 )
1 2
= ∑ z1·x 1
· ∑ z2·x 2
· ∑ z5·x 3

x1 =0 x2 =0 x3 =0

Al realizar el último producto, zn provendrá de multiplicar un cierto z1·x1 del primer factor, un cierto z2·x2
del segundo factor, y un cierto z5·x3 del tercer factor, con la condición de que 1 · x1 + 2 · x2 + 5 · x3 = n. Por
tanto, el coeficiente que acompaña a zn en ese producto ha de ser precisamente fn , y la función generatriz
F(z) es
1 1 1
F(z) = · ·
(1 − z ) (1 − z ) (1 − z5 )
1 2

Utilizando que (1 − zr ) = (1 − z)(1 + z + z2 + . . . + zr−1 ) para cualquier entero r ≥ 1, podemos com-


probar que
1−z 1−z 1−z
(1 − z)3 F(z) = · ·
(1 − z1 ) (1 − z2 ) (1 − z5 )
1 1 1
= · ·
1 (1 + z) (1 + z + z2 + z3 + z4 )
Al calcular el límite cuando z tiende a 1 en esa última expresión, obtenemos que
1
lı́m(1 − z)3 F(z) =
z→1 1·2·5

Estudiemos ahora las raíces de Q(z) = (1 − z1 )(1 − z2 )(1 − z5 ), el denominador de F(z). Tene-
mos la raíz 1 para el polinomio (1 − z), las raíces 1 y -1 para el polinomio (1 − z2 ) y las raíces 1 y
cos 2πl 2πl 5
5 + i sen 5 , con l = 1, 2, 3, 4, para el polinomio (1 − z ). La raíz 1 tiene multiplicidad 3 (al ser
mcd(v(1), . . . , v( j)) = 1 tendría multiplicidad j en el teorema) y las demás multiplicidad 1. Luego F(z)
admite una descomposición en fracciones simples de la forma
A B C D
F(z) = 3
+ 2
+ + +...
(1 − z) (1 − z) (1 − z) (1 + z)

(8 sumandos en esa expresión). Si realizamos el producto (1 − z)3 F(z) tenemos

A(1 − z)3 B(1 − z)3 C(1 − z)3 D(1 − z)3


F(z) = + + + +...
(1 − z)3 (1 − z)2 (1 − z) (1 + z)
Grafos y Combinatoria. Javier Tejel 61

Si volvemos a calcular el límite de esa expresión cuando z tiende a 1, lı́mz→1 (1 − z)3 F(z), el primer
término vale A y los demás 0. Esto implica que

1
A=
1·2·5
y que fn sea aproximadamente el coeficiente de zn en

A
(1 − z)3
1 n+3−1 A

Como (1−z)3
= ∑∞
n=0 3−1 zn por el Teorema Binomial generalizado, el coeficiente de zn en (1−z)3
es

n2
 
n+3−1
A≈
3−1 2! 1 · 2 · 5

Ejemplo 2.21. Supongamos que queremos dar un propina de tamaño n usando monedas de 1, 2, 5, 10,
20 y 50 céntimos. Calcular de forma aproximada de cuántas formas podemos hacerlo.

Demostración. Como mcd(1, 2, 5, 10, 20, 50) = 1, podemos aplicar el Teorema de Schur, y el número
aproximado de formas de dar la propina de tamaño n será

n5
5! · 1 · 2 · 5 · 10 · 20 · 50

Por ejemplo, si n = 108 , entonces el número aproximado de formas de dar la propina es 8,3333·1032 .

Si hubiésemos querido calcular el número exacto, hubiésemos tenido que descomponer la función
generatriz
1 1 1 1 1 1
F(z) = · · · · ·
(1 − z) (1 − z ) (1 − z ) (1 − z ) (1 − z ) (1 − z50 )
2 5 10 20

en 88 sumandos, pues el grado del denominador es 88, y aplicar el Teorema Binomial generalizado a
cada uno de esos sumandos.

Nota 2.6. Si mcd(v(1), . . . , v( j)) ̸= 1, entonces el Teorema de Schur no se puede aplicar directamente.
Supongamos que ese máximo común divisor es d > 1. Si n no es múltiplo de d, entonces no hay forma de
particionar n como combinación lineal entera y no negativa de los enteros positivos v(1), v(2), . . . , v( j),
con lo que ese este caso la solución es 0. Equivalentemente, no hay ninguna solución entera y positiva
de la ecuación
v(1) · x1 + v(2) · x2 + . . . + v( j) · x j = n
Por contra, si n es múltiplo de d, entonces la solución al problema es el número de soluciones enteras y
positivas de la ecuación
v(1) v(2) v( j) n
· x1 + · x2 + . . . + ·xj =
d d d d
 
donde ahora mcd v(1) d , . . . , v( j)
d = 1.

Nota 2.7. Supongamos ahora que para dar la propina de valor n disponemos de monedas de todos los
posibles valores, v(1) = 1, v(2) = 2, v(3) = 3, . . . El número de formas distintas de dar la propina de valor
n coincide entonces con el número de particiones p(n) del entero n (ver la sección 1.4.4). En este caso,
la función generatriz para la secuencia p(0), p(1), . . . , p(n), . . . es entonces
∞ ∞
1
F(z) = ∑ p(n) zn = ∏ (1 − z j )
n=0 j=1
62 Capítulo 2. Funciones generatrices

2.3. Ejercicios propuestos


1
1. Sabiendo que 1−z es la función generatriz de la secuencia fn = 1, n ≥ 0, calcular la función gene-
ratriz en los siguientes casos:

a) fn = n
b) fn = αn + β
c) fn = αn2 + β n + γ
d) fn = 3n
e) fn = 5 · 7n − 3 · 4n
f) fn = α n si n = 3̇, fn = 0 si n ̸= 3̇

2. Supongamos que F(z) es la función generatriz de la secuencia f0 , f1 , . . . , fn , . . . Calcular la función


generatriz G(z) de la secuencia gn en los siguientes casos:

a) gn = fn + c
b) gn = α fn + c
c) gn = n fn
d) g0 , g1 , . . . , gn , . . . es 0, f1 , f2 , f3 . . .
e) g0 , g1 , . . . , gn , . . . es 0, 0, 1, f1 , f2 , f3 , . . .
f) gn = fn+k , con k > 0 un entero dado.
g) gn = fn+2 + 3 fn+1 + fn

3. Resolver las siguientes ecuaciones de recurrencia.

a) fn − 3 fn−1 + 2 fn−2 = 0, con las condiciones iniciales f0 = 0 y f1 = 1.


b) fn = 2 fn−1 + 1, con la condición inicial f0 = 0.
c) fn − 4 fn−1 + 5 fn−2 − 2 fn−3 = 0, con las condiciones iniciales f0 = 0, f1 = 1 y f2 = 4.
d) fn = 2 fn−1 + n, con la condición inicial f0 = 0.

4. Sea S el conjunto {1, 2, . . . , n}. Hallar una fórmula de recurrencia para la cantidad S(n, k), definida
como el número de subconjuntos de S con k elementos y no conteniendo dos números consecutivos.
Así, si n = 5, tenemos S(5, 0) = 1, S(5, 1) = 5, S(5, 2) = 6, S(5, 3) = 1, S(5, 4) = 0 y S(5, 5) = 0.
Utilizar esa recurrencia para demostrar que S(n, k) = n−k+1 k .

5. Sea S el conjunto {1, 2, . . . , n}. Hallar una fórmula de recurrencia (y resolverla) para el número de
subconjuntos de S no conteniendo dos números consecutivos.

6. Calcular la función generatriz de fn , donde fn es el número de soluciones enteras no negativas de


la ecuación
x1 + 2x2 = n
Usar esa función generatriz para dar una fórmula de recurrencia para fn . Resolver la recurrencia y
obtener una fórmula explícita para fn .

7. Calcular la función generatriz de fn , donde fn es el número de soluciones enteras no negativas de


la ecuación
x1 + 2x2 + 3x3 = n
Usar esa función generatriz para dar una fórmula de recurrencia para fn . Calcular, usando esa
recurrencia, el valor f10 . ¿Cuánto vale aproximadamente f1000 ?
Grafos y Combinatoria. Javier Tejel 63

8. En una fila de n asientos de un cine están sentadas n personas. Antes de empezar la película,
algunos cambian su asiento con el de uno de sus vecinos adyacentes. Supongamos que ninguno
hace más de un cambio de asiento. Encontrar una recurrencia (y resolverla) que dé el número de
formas distintas de sentarse haciendo esos cambios de asiento.

9. Resolver la ecuación de recurrencia hn = (n + 2)hn−1 , con el valor inicial h0 = 2.

10. Resolver las siguientes ecuaciones de recurrencia.

a) hn = 4hn−1 − 5hn−2 + 2hn−3 , con valores iniciales h0 = 3, h1 = 3 y h2 = 4.


b) hn = 2hn−1 − hn−2 + 2hn−3 , con h0 = 3, h1 = 0 y h2 = 2.
c) hn = 5hn−1 − 6hn−2 − 4hn−3 + 8hn−4 con h0 = 0, h1 = 1, h2 = 1 y h3 = 2.

11. Resolver las siguientes relaciones de recurrencia, con los valores iniciales h0 = 0 y h1 = 1.

a) hn = 6hn−1 − 9hn−2 + 2n.


b) hn = 6hn−1 − 9hn−2 + 2n · 2n .
c) hn = 6hn−1 − 9hn−2 + 2n · 3n .

12. Resolver las siguientes ecuaciones de recurrencia.

a) hn = 4hn−1 + 4n , con h0 = 3.
b) hn = hn−1 − n + 3, con h0 = 2.
c) hn = −hn−1 + 1, con h0 = 0.
d) hn = 2hn−1 + 1, con h0 = 1.
e) hn = 4hn−1 + 3 · 2n , con h0 = 1.
f) hn = 6hn−1 − 9hn−2 + 2n, con h0 = 1 y h1 = 0.
g) hn = 2hn−1 − hn−2 + n − 1, con h0 = 0 y h1 = 0.
h) hn = 4hn−1 − 4hn−2 + 3n + 1, con h0 = 1 y h1 = 2.
i) hn = 3hn−2 − 2hn−3 + 4, con h0 = 1, h1 = 1 y h2 = 1.

13. Sea hn el número de secuencias de longitud n con los símbolos {0, 1, 2}, donde están prohibidos
los pares 02 y 20. Dar una fórmula de recurrencia para hn y resolverla.

14. Resolviendo recurrencias, demostrar que los siguientes números de Stirling de segunda clase cum-
plen:

a) S2 (n, n − 1) = n2


b) S2 (n, 2) = 2n−1 − 1
n(n+1)(2n+1)
15. Usando una recurrencia y resolviéndola, demostrar que ∑ni=1 i2 = 6
Parte II

Teoría de grafos

64
Capítulo 3

Introducción a la teoría de grafos

Se suele considerar que la teoría de grafos nace en 1736, cuando el matemático suizo Leonard Euler
publica un artículo donde resuelve el llamado problema de los puentes de Köningsberg. Esa ciudad, la
actual ciudad rusa de Kaliningrado, es atravesada por el río Pregel, que la divide en varias partes. En
tiempos de Euler, esas partes estaban conectadas por siete puentes, como se muestra en la figura 3.1. Hay
cuatro zonas distintas, A, B,C y D, y siete puentes que las unen. Los habitantes de la ciudad consideraban
un problema difícil el siguiente: ¿es posible dar un paseo por la ciudad, saliendo de una zona y volviendo
a la misma, de forma que se pase por todos los puentes una sola vez?

A
D

Figura 3.1: El problema de los puentes de Konisberg

Euler, no sólo resolvió el problema, sino que encontró la forma de resolverlo para un caso genérico
de n zonas y m puentes conectándolas. Para ello, hizo un esquema como el de la parte derecha de la
Figura 3.1, donde las zonas de la ciudad se han reducido a puntos, y los puentes a líneas uniendo los
puntos. La observación clave de Euler fue que, para que exista una forma de pasar por todas las líneas
una sola vez, desde cada punto debe salir un número par de líneas, puesto que cada vez que llegamos a
un punto, debemos de salir por una línea distinta a la de llegada. Además, debe ser posible poder pasar
desde un punto arbitrario a otro cualquiera. Estas dos condiciones, además de ser necesarias, se puede
demostrar que son suficientes.
Configuraciones como la descrita por Euler, con nodos y conexiones, aparecen en una gran variedad
de aplicaciones. Por ejemplo, pueden representar redes físicas, como los circuitos eléctricos, redes de
carreteras, redes de transporte, redes sociales, moléculas químicas, ...
Formalmente dichas estructuras se modelizan mediante unas estructuras combinatorias denominadas
grafos, que consisten en dos conjuntos (cuyos elementos se llaman vértices y aristas, respectivamente),
junto con una relación de incidencia entre ellos. Los vértices y las aristas pueden tener propiedades
adicionales, tales como color, peso, ..., que ayudan a modelizar determinadas situaciones. Por ejemplo,
en un mapa de calles es conveniente asignar “direcciones”, en un mapa de carreteras es conveniente
asignar “distancias”, o dos átomos de una molécula pueden tener varios “enlaces” a la vez entre ellos.
A lo largo de los próximos capítulos estudiaremos las principales características de los grafos, tanto
de los grafos dirigidos como de los no dirigidos, y estudiaremos algunos de los problemas básicos sobre
éllos, haciendo especial hincapié en los algoritmos que resuelven esos problemas.

65
66 Capítulo 3. Introducción a la teoría de grafos

3.1. Grafos no dirigidos


Comenzamos este capítulo con la definición de grafo no dirigido y las primeras propiedades de dichos
grafos.

Definición 3.1. Un grafo no dirigido es un par G = (V, E), donde V es un conjunto finito de elementos
llamados vértices (o nodos), y E es un conjunto de pares no ordenados de vértices. A los elementos de
E los llamaremos aristas (o ejes o conexiones).

Definición 3.2. Al número de vértices, |V | = n, de un grafo G = (V, E) se le llama orden del grafo, y al
número de aristas, |E| = m, se le llama tamaño del grafo.

Así, el orden del grafo que utilizó Euler para modelizar los puentes de Köningsberg es cuatro, deno-
tando a los vértices (zonas) por A, B,C y D, y el tamaño siete, E = {(A, B), (A, B), (A,C), (A,C), (A, D),
(B, D), (C, D)}. Hay que notar que, como los pares son no ordenados, es lo mismo escribir (A, D) que
(D, A). En ambos casos estamos diciendo lo mismo, que existe una conexión entre los vértices A y D (un
puente entre las zonas A y D). Notar también que pueden aparecer aristas repetidas. En el ejemplo ante-
rior, como teníamos dos conexiones (puentes) entre los vértices (zonas) A y B, nos ha aparecido repetida
la arista (A, B), y lo mismo sucede con la arista (A,C).
Aunque en el ejemplo anterior hemos utilizado la notación A, B,C y D para los vértices, en general se
suelen usar los símbolos v1 , . . . , vi , . . . , vn para denotar a los vértices (también a veces la notación i, j, . . .,
en lugar de vi , v j , . . .). Para las aristas, se suele usar la notación (vi , v j ) (también a veces la arista (i, j) o
la arista e = (vi , v j )).

Definición 3.3. Dada una arista e = (vi , v j ), diremos que esa arista une (o conecta) vi con v j , que vi y v j
son sus extremos, que vi y v j son adyacentes o vecinos, y que la arista e es incidente a los vértices vi y
v j.

En el ejemplo de la figura 3.1, la arista e = (A, D) tiene como extremos a los vértices A y D, dichos
vértices son adyacentes en el grafo, y la arista e is incidente a A y D.
Además de aristas repetidas, un grafo también puede contener bucles. Una arista del tipo (vi , vi ) es
llamada un bucle. Lo que viene a decir un bucle es que un vértice está relacionado consigo mismo.

Definición 3.4. Un gafo G = (V, E) se dice simple, si no contiene bucles ni aristas repetidas. En otro
caso, el grafo se dice multigrafo.

A lo largo de estas notas, vamos a trabajar fundamentalmente con grafos simples. Por ello, salvo
que se diga lo contrario, siempre que hablemos de un grafo entenderemos que el grafo es simple.

Aunque un grafo es una estructura abstracta, normalmente se utilizan trazados para visualizarlos y
entender mejor sus propiedades. Un trazado de un grafo no es más que una forma gráfica de representarlo
en el plano. Lo usual es representar los vértices usando puntos, discos, círculos, ..., y las aristas usando
líneas rectas o curvas. La figura 3.2 muestra dos trazados distintos del mismo grafo.
v1 v2 v1
v2
v7
v5

v3 v4 v3

v6 v7 v6

v5 v4

Figura 3.2: Dos trazados distintos del mismo grafo.


Grafos y Combinatoria. Javier Tejel 67

Hay que tener siempre claro que una cosa es un grafo, que es algo abstracto, y otra cosa un trazado
del mismo, que puede haber muchos y con propiedades geométricas distintas. En el ejemplo anterior, el
trazado de la izquierda es plano (las aristas no se cortan entre sí), mientras que el de la derecha no lo es.

Definición 3.5. Dado un grafo G = (V, E), el grado d(vi ) de un vértice vi es el número de aristas del
grafo que son incidentes a él.

Por ejemplo, en el grafo de la figura 3.2, el grado del vértice v1 es cuatro y el grado del vértice v5 es
dos.
El siguiente resultado, conocido como el Teorema del apretón de manos, es sencillo de demostrar y
bastante útil en la práctica.

Teorema 3.1 (Handshaking Theorem). Dado un grafo simple G = (V, E), de orden n y tamaño m, el
número de vértices con grado impar es par.

Demostración. Como cada arista es incidente a exactamente dos vértices, la suma de los grados de todos
los vértices tiene que ser dos veces el número de aristas
n
∑ d(vi ) = 2m
i=1

Como la suma de los grados es un número par, 2m, tiene que haber un número par de sumandos con
valor impar.

En un grafo simple G, como lasaristas son pares no ordenados de vértices, el número máximo de
aristas que puede tener el grafo es n2 . Se tiene entonces la siguiente definición.

Definición 3.6. Un grafo simple G de orden n, se dice que es completo si su número de aristas es n2 .


Al grafo completo del orden n se le suele denotar por Kn .

Definición 3.7. Un grafo simple G = (V, E) se dice que es bipartito si V puede descomponerse en dos
conjuntos disjuntos V1 y V2 , de forma que, para cualquier arista del grafo, uno de sus extremos está en V1
y el otro en V2 . Un grafo bipartito G = (V1 ∪V2 , E) se dice completo, y se denota por Kn1 ,n2 , si el número
de aristas es n1 · n2 , donde |V1 | = n1 y |V2 | = n2 .

La figura 3.3a muestra el grafo completo K5 , y la figura 3.3b muestra un grafo bipartito, donde se
han coloreado en rojo los vértices de V1 y en azul los vértices de V2 .
v1
v5

v2

v4
v3
(a) (b)

Figura 3.3: El grafo completo K5 y un grafo bipartito.

A partir de la definición de grafo, se suelen construir formas alternativas de especificarlo, muy útiles
para manejar grafos en un ordenador. Algunas de ellas son las listas de vecinos, la matriz de adyacencias,
y la matriz de incidencias.

Definición 3.8. Dado un grafo G = (V, E) de orden n, las listas de vecinos son un conjunto de n listas,
donde la lista asociada al vértice vi contiene a los vecinos de vi .
68 Capítulo 3. Introducción a la teoría de grafos

Definición 3.9. Dado un grafo G = (V, E) de orden n, la matriz de adyacencia es una matriz simétrica
M de tamaño n × n, donde el elemento mi j de dicha matriz es 1 si (vi , v j ) es una arista de G, y 0 en caso
contrario.
Definición 3.10. Sea G = (V, E) un grafo de orden n, y sea (e1 , e2 , . . . , em ) el conjunto (ordenado) de las
m aristas de G. La matriz de incidencia es una matriz B de tamaño n × m, donde si la arista ek = (vi , v j )
del grafo se encuentra en la posición k del conjunto de aristas, entonces bik = b jk = 1.
Para el grafo representado en la figura 3.2 las listas de vecinos y la matriz de adyacencias serían

Listas de vecinos v1 v2 v3 v4 v5 v6 v7
 
Vértice Vecinos v1 0 1 1 1 0 1 0
v1 v2 , v3 , v4 , v6 1
v2  0 0 1 1 0 1 
v2 v1 , v4 , v5 , v7 1
v3  0 0 0 0 1 0 
v3 v1 , v6 1
v4  1 0 0 0 1 1 
v4 v1 , v2 , v6 , v7 0
v5  1 0 0 0 0 1 
v5 v2 , v7 v6  1 0 1 1 0 0 1
v6 v1 , v3 , v4 , v7 v7 0 1 0 1 1 1 0
v7 v2 , v4 , v5 , v6 (b)
(a)

Tabla 3.1: Listas de vecinos y matriz de adyacencia del grafo de la figura 3.2.

y la matriz de incidencia sería (llamando (i, j) a la arista (vi , v j ))


(1, 2) (1, 3) (1, 4) (1, 6) (2, 4) (2, 5) (2, 7) (3, 6) (4, 6) (4, 7) (5, 7) (6, 7)
 
v1 1 1 1 1 0 0 0 0 0 0 0 0
 1
v2  0 0 0 1 1 1 0 0 0 0 0  
v3  0
 1 0 0 0 0 0 1 0 0 0 0  
 0
v4  0 1 0 1 0 0 0 1 1 0 0  
 0
v5  0 0 0 0 1 0 0 0 0 1 0  
v6  0 0 0 1 0 0 0 1 1 0 0 1 
v7 0 0 0 0 0 0 1 0 0 1 1 1
Un problema muy estudiado y difícil de resolver en general es el problema de decidir si, dados dos
grafos, dichos grafos son equivalentes. Por ejemplo, está claro que los dos trazados de la figura 3.2
representan al mismo grafo, pero ya no está tan claro que los grafos mostrados en la figura 3.4 sean
“esencialmente” distintos.
v1 v1 v1

G1 G2 G3 G
v2 v2 v2

v3 v3 v3

Figura 3.4: Grafos isomorfos.

Con la definición que hemos dado de grafo, G1 , G2 y G3 serían distintos, pues las aristas que forman
esos grafos son distintas ((v1 , v2 ) y (v2 , v3 ) en G1 , (v1 , v3 ) y (v2 , v3 ) en G2 , y (v1 , v2 ) y (v1 , v3 ) en G3 ).
Además, serían distintos de G, pues los vértices de G no tienen etiquetas. Sin embargo, es bastante obvio
que la estructura de todos los grafos es la misma: dos aristas incidentes a un mismo vértice. Esto nos
lleva al concepto de isomorfismo de grafos.
Grafos y Combinatoria. Javier Tejel 69

Definición 3.11. Dados dos grafos G = (V, E) y G′ = (V ′ , E ′ ), se dice que son isomorfos si existe una
aplicación biyectiva φ de V en V ′ que preserva las adyacencias, es decir, una aplicación biyectiva φ tal
que (i, j) ∈ E, si y sólo si, (φ (i), φ ( j)) ∈ E ′ .

Así, los grafos G1 y G2 de la figura 3.4 son isomorfos, pues la aplicación φ (v1 ) = v1 , φ (v2 ) = v3 y
φ (v3 ) = v2 preserva las adyacencias, es decir, las aristas (v1 , v2 ) y (v2 , v3 ) de G1 se transforman en las
aristas (φ (v1 ), φ (v2 )) = (v1 , v3 ) y (φ (v2 ), φ (v3 )) = (v3 , v2 ) en G2 . De hecho, es fácil ver que los cuatro
grafos mostrados en la figura son isomorfos. Por contra, dados dos grafos cualesquiera de orden n y
tamaño m, el problema de decidir si esos dos grafos son isomorfos es muy difícil de resolver.
Muchos problemas combinatorios consisten en contar grafos no isomorfos cumpliendo alguna pro-
piedad, es decir, en contar grafos no etiquetados cumpliendo esa propiedad. Con lo de no etiquetado se
está indicando que los vértices no tienen nombre (etiqueta), y que el grafo que se obtiene al etiquetar de
cualquier forma los vértices del grafo no etiquetado G se considera el mismo que G. Por ejemplo, los
grafos G1 , G2 y G3 de la figura 3.4 son tres formas distintas de etiquetar el grafo G usando las mismas
etiquetas v1 , v2 y v3 , y los cuatro grafos se consideran el mismo cuando se están contando grafos no
etiquetados.
Por el contrario, si los vértices están ya dados y tienen un nombre (etiqueta), los problemas combi-
natorios de conteo se transforman en contar grafos etiquetados con una cierta propiedad. En el ejemplo,
considerando que los vértices tienen etiquetas v1 , v2 y v3 , los grafos G1 , G2 y G3 serían tres grafos eti-
quetados distintos.
A continuación, vamos a definir los conceptos de grafo complementario y subgrafo.

Definición 3.12. Dado un grafo G = (V, E), su grafo complementario G = (V, E) es un grafo sobre
el mismo conjunto de vértices V , de forma que dos vértices en G son adyacentes, si y sólo si, no son
adyacentes en G. La figura 3.5b muestra el complementario del grafo mostrado en la figura 3.5a.

v1 v2 v1 v2

v5 v5
v3 v3
v4 v4

v6 v7 v6 v7
(a) (b)

Figura 3.5: Un grafo G (a la izquierda) y su grafo complementario (a la derecha).

Definición 3.13. Dado un grafo G = (V, E), un subgrafo de G es otro grafo G1 = (V1 , E1 ), tal que V1 ⊆ V
y E1 ⊆ E. Cuando V1 = V , se dice que G1 es un subgrafo generador o spanning de G.

Definición 3.14. Dado un grafo G = (V, E) y un subconjunto V1 ⊂ V de vértices, el subgrafo inducido


por V1 es el grafo G1 = (V1 , E1 ), donde E1 = E ∩ (V1 ×V1 ), es decir, el subconjunto de aristas de E cuyos
extremos pertenecen a V1 . Igualmente, dado un conjunto de aristas E2 ⊂ E, el subgrafo inducido por
E2 es el grafo G2 = (V2 , E2 ), donde V2 es el conjunto de extremos de las aristas de E2 .

La figura 3.6 muestra varios subgrafos del grafo G mostrado en la figura 3.5a. La figura 3.6a muestra
un subgrafo de G, que contiene varios de sus vértices y aristas. La figura 3.6b muestra un subgrafo
generador de G, pues contiene a todos los vértices de G (aunque v6 no esté conectado a ningún otro
vértice). La figura 3.6c muestra el subgrafo inducido por lo vértices v1 , v2 , v3 y v4 (esos vértices y todas
las aristas de G que los conectan). Por último, la figura 3.6d muestra el subgrafo inducido por el conjunto
de aristas (v1 , v2 ), (v1 , v4 ), (v2 , v4 ), (v2 , v5 ), (v2 , v7 ) y (v5 , v7 ) (esas aristas y todos sus extremos).
70 Capítulo 3. Introducción a la teoría de grafos

v1 v2 v1 v2

v5 v5

v3 v4 v3 v4

v7 v6 v7
(a) (b)

v1 v2

v1 v2 v5

v4

v3 v4 v7
(c) (d)

Figura 3.6: Varios subgrafos de G.

Por último, vamos a ver las operaciones básicas sobre grafos. Dado un grafo G = (V, E), el grafo
G − v indica el grafo que se obtiene al borrar el vértice v y todas las aristas incidentes a él. Similarmente,
el grafo G −V1 , con V1 ⊆ V , es el grafo que se obtiene al borrar todos los vértices de V1 y todas las aristas
incidentes a éllos. Análogamente, el grafo G − e indica el grafo que se obtiene al borrar la arista e, pero
sin borrar sus extremos, y G − E1 , con E1 ⊆ E, es el grafo que se obtiene al borrar todas las aristas de E1
(sin borrar sus extremos). Al grafo que se obtiene de G al añadir una nueva arista e con extremos en V se
le denota por G + e.

v1 v2 v1 v2

v5 v5

v3 v4 v3 v4

v7 v6 v7
(a) (b)

Figura 3.7: Subgrafos obtenidos al borrar v6 y al borrar (v1 , v2 ) en el grafo G de la figura 3.5a.

La figura 3.7a muestra el subgrafo G − v6 , obtenido a partir del borrado del vértice v6 en el grafo
G de la figura 3.5a. Similarmente, la figura 3.7b muestra el subgrafo G − (v1 , v2 ), obtenido a partir del
borrado de la arista (v1 , v2 ) en el grafo G de la figura 3.5a.

3.1.1. Caminos y ciclos


Otra propiedad importante de un grafo es si el grafo es conexo o no. Para definir la conectividad de
un grafo, hay que hablar previamente de caminos.

Definición 3.15. Dado un grafo G = (V, E), un paseo (o recorrido o itinerario) desde el vértice vi al
vértice v j es una sucesión de vértices (vi0 , vi1 , vi2 , . . . , vil ), tal que vi0 = vi , vil = v j , y (vih−1 , vih ) ∈ E, para
Grafos y Combinatoria. Javier Tejel 71

h = 1, 2, . . . l. La longitud de dicho paseo es el número de aristas del mismo, es decir, l. Un camino es


un paseo en el que no aparecen aristas repetidas.

La figura 3.8a muestra el paseo (v3 , v1 , v4 , v7 , v5 , v7 , v4 , v2 , v5 ) de longitud 8, que conecta el vértice


v3 con el vértice v5 . En la figura hemos ilustrado en rojo el paseo, con las aristas numeradas según el
orden en el que se visitan. Observar que aparecen aristas repetidas en el paseo. La figura 3.8b muestra el
camino (v3 , v1 , v4 , v7 , v5 , v2 , v4 , v6 ) de longitud 7, que conecta el vértice v3 con el vértice v6 . Ahora ya no
hay aristas repetidas, pero sí vértices repetidos.

v1 v2 v1 v2

1 8 1 5
2 7 2 6
v5 v5
v4 4 7 4
v3 3 v3 v4 3

6
5
v6 v7 v6 v7
(a) (b)

v1 v2 v1 v2

1 4 1
2 3 2
v5 v5
v4 3
v3 v3 v4

v6 v7 v6 v7
(c) (d)

Figura 3.8: Ejemplos de paseos y caminos.

Si hay un paseo entre dos vértices vi y v j , eliminando las aristas repetidas de ese paseo se puede
conseguir un camino que vaya desde vi a v j . La forma de conseguir el camino es ir borrando las aristas
que aparecen entre dos repeticiones consecutivas de un mismo vértice en el paseo. Por ejemplo, en el
paseo de la figura 3.8a, si nos fijamos en las dos repeticiones consecutivas del vértice v4 y borramos del
paseo las aristas comprendidas entre esas dos repeticiones, las aristas (v4 , v7 ), (v7 , v5 ), (v5 , v7 ) y (v7 , v4 ),
obtenemos el paseo (v3 , v1 , v4 , v2 , v5 ) de longitud 4, como se muestra en la figura 3.8c, que en este caso
ya es un camino entre v3 y v5 .
Si un camino no contiene vértices repetidos, entonces se dice que el camino es simple. Al igual
que hemos hecho con un paseo para conseguir un camino, si tenemos un camino entre dos vértices vi
y v j , podemos obtener un camino simple entre esos dos vértices sin más que ir eliminado aristas entre
repeticiones consecutivas de un mismo vértice. Por ejemplo, si tomamos el camino mostrado en la figura
3.8b y borramos las aristas entre las dos repeticiones del vértice v4 , obtenemos el camino (v3 , v1 , v4 , v6 )
mostrado en la figura 3.8d, de longitud 3, que ya es un camino simple.

Definición 3.16. Dado un grafo G = (V, E), un paseo que comienza y termina en un mismo vértice es
un paseo cerrado, y su longitud es el número de aristas del mismo. Si en el paseo cerrado no aparecen
aristas repetidas, entonces hablaremos de un ciclo. Además, si no hay vértices repetidos en un ciclo (salvo
el primero y el último), diremos que el ciclo es simple. Un secuencia que conste de un sólo vértice, (vi ),
la consideraremos un ciclo de longitud cero.

La figura 3.9a muestra un paseo cerrado de longitud 9. Si lo comenzamos en v2 , el paseo cerrado


sería (v2 , v1 , v4 , v7 , v5 , v7 , v4 , v2 , v5 , v2 ), que contiene aristas repetidas. La figura 3.9b muestra el ciclo
simple (v2 , v1 , v4 , v7 , v5 , v2 ), donde no hay ni aristas repetidas ni vértices repetidos (salvo v2 , que es donde
72 Capítulo 3. Introducción a la teoría de grafos

comienza y termina el ciclo). Cualquier ciclo, como el ciclo (v3 , v1 , v2 , v5 , v7 , v2 , v4 , v1 , v6 , v3 ) mostrado


en la figura 3.9c, puede descomponerse en ciclos simples, como se muestra en la figura 3.9d. Para ello, no
hay más que buscar una subsecuencia simple de vértices entre dos repeticiones consecutivas de un mismo
vértice, que siempre existe. Por ejemplo, la subsecuencia v2 , v5 , v7 , v2 entre las dos repeticiones de v2
define el ciclo simple (v2 , v5 , v7 , v2 ) (en rojo en la figura 3.9d). Una vez eliminado ese ciclo, en el nuevo
ciclo (v3 , v1 , v2 , v4 , v1 , v6 , v3 ) se repite la misma operación. En este caso, la subsecuencia v1 , v2 , v4 , v1
define el ciclo simple (v1 , v2 , v4 , v1 ) (en azul en la figura 3.9d). Al eliminar este nuevo ciclo, lo que nos
queda es (v3 , v1 , v6 , v3 ), que ya es un ciclo simple (en verde en la figura 3.9d).

1 1
v1 v2 v1 v2
8 5
2 7 2
9 v5 v5
4
v3 v4 3 v3 v4
6 5 3 4

v6 v7 v6 v7
(a) (b)

v1 2 v2 v1 2 v2

1 3 1 3
7 6 7 6
v5 v5
8 5 8 5
v3 v4 v3 v4
4 4
9 9
v6 v7 v6 v7
(c) (d)

Figura 3.9: Ejemplos de paseos cerrados y ciclos.

Obviamente, se puede realizar el proceso inverso, y si se tienen varios ciclos simples que comparten
vértices, se pueden ir uniendo los ciclos simples para formar un único ciclo.

v1 2 v2
v1 2 v2
1 3
7 6 3
1
v5
v4 v5
8 5
v3 v4
v3
9 10 4
12 6 5 4
v6 v7 7
11 v6 v7
(a) (b)

Figura 3.10: Ejemplos de ciclos eulerianos y hamiltonianos.

Hay dos tipos especiales de ciclos que definimos a continuación.

Definición 3.17. Dado un grafo G = (V, E), un ciclo se dice euleriano si contiene a todas las aristas de G
una sola vez. Un ciclo se dice hamiltoniano si contiene a todos los vértices de G una sola vez. Un grafo
G = (V, E) se dice euleriano si contiene un ciclo euleriano. Un grafo G = (V, E) se dice hamiltoniano
si contiene un ciclo hamiltoniano.
Grafos y Combinatoria. Javier Tejel 73

Notar que al contener los vértices una sola vez, un circuito hamiltoniano es necesariamente simple.
No sucede lo mismo con un circuito euleriano, en el que pueden aparecer vértices repetidos (aunque no
aristas repetidas). La figura 3.10a muestra el circuito euleriano (v3 , v1 , v2 , v5 , v7 , v2 , v4 , v1 , v6 , v4 , v7 , v6 , v3 ),
mientras que la figura 3.10b muestra el circuito hamiltoniano (v3 , v1 , v2 , v5 , v7 , v4 , v6 , v3 ).

3.1.2. Grafos conexos


Una vez definidos los caminos, podemos dar ya la definición de grafo conexo.
Definición 3.18. Un grafo G = (V, E) se dice conexo si para cualquier pareja de vértices vi y v j existe un
camino desde vi a v j . Dado un grafo G = (V, E), una componente conexa de G es un subgrafo maximal
y conexo.

v1 v1
v2 v2
v11 v11
v3 v3
v10 v10
v4 v4
v9 v9
v5 v5
v8 v8
v6 v6
v7 v7

Figura 3.11: A la derecha, las tres componentes conexas del grafo de la izquierda.

La figura 3.11 muestra las tres componentes conexas del grafo mostrado a la izquierda de la figura.
La primera componente C1 , en rojo, está compuesta de los vértices C1 = {v1 , v4 , v6 , v7 }. Desde cualquiera
de los vértices de C1 se puede llegar a cualquier otro de la componente a través de un camino. Además, el
subgrafo es maximal, en el sentido de que no hay ningún otro vértice del grafo que se pueda conectar a los
vértices de la componente a través de caminos. La segunda componente C2 , en verde, está compuesta por
los vértices C2 = {v2 , v5 , v8 , v11 }, y la tercera componente C3 , en azul, por los vértices C3 = {v3 , v9 , v10 }.
Construir las componentes conexas de un grafo es bastante sencillo. Dado un vértice v, el conjunto
de todos los vértices del grafo a los que se puede llegar desde v a través de caminos, incluido el vértice
v, formarán la componente conexa asociada a v. Más adelante veremos cómo calcular de forma sencilla
las componentes conexas de un grafo.
Si desde un vértice v no se puede llegar a ningún otro vértice, ese vértice v es un vértice aislado en
el grafo, y la componente conexa asociada a v es el propio vértice. Por otra parte, si k es el número de
componentes conexas de un grafo G = (V, E), una arista e de G es un puente si al eliminar la arista, el
número de componentes conexas de G − e es mayor que k. De forma similar, un vértice v es un punto
de articulación (o cut-vertex), si al eliminar el vértice, el número de componentes conexas de G − v es
mayor que k.

3.1.3. Teorema de Euler para ciclos eulerianos


Una vez visto el concepto de conectividad, podemos ya enunciar el Teorema de Euler, que caracteriza
cuándo un grafo es euleriano.
Teorema 3.2 (Teorema de Euler). Dado un grafo conexo G = (V, E), las siguientes propiedades son
equivalentes.
1. G es euleriano.
2. El grado de cualquier vértice de G es par.
74 Capítulo 3. Introducción a la teoría de grafos

3. E se puede particionar en un conjunto de ciclos disjuntos.

Demostración. (1 ⇒ 2) Sea C = (vi0 , vi1 , . . . , vi0 ) un ciclo euleriano de G. Cada vez que un vértice v
aparece en el ciclo, el ciclo usa dos aristas incidentes a v, la que lo une con su predecesor en el ciclo y
la que lo une con su sucesor en ciclo. Por tanto, como todas las aristas de C son distintas, si un vértice
v aparece h veces en C, el número de aristas distintas incidentes a v usadas en C es 2h. Ya que todas las
aristas de G están en C, necesariamente el grado de cualquier vértice tiene que ser par. Para el vértice vi0 ,
el argumento es el mismo identificando la primera y última aparición del vértice.
(2 ⇒ 3) Veamos primero que necesariamente G contiene un ciclo C1 formado por aristas disjuntas.
Comenzando en un vértice cualquiera u, podemos ir construyendo un camino (u, u1 , u2 , . . .) formado por
aristas distintas, de forma que cada vez que se llega a un vértice ui que no está en el camino, salimos de
él a otro vértice ui+1 mediante una arista que no está en el camino. Por la paridad en los grados de los
vértices, el vértice ui+1 siempre existe. Si ui+1 ya está en el camino, entonces hemos encontrado un ciclo
C1 con aristas distintas que contiene a ui+1 . Si ui+1 no está en el camino, entonces iteramos el proceso.
Como el número de aristas es finito, este proceso ha de terminar siempre encontrando un ciclo C1 , que
además es simple.
Si C1 contiene a todas las aristas de E, ya hemos terminado. En otro caso, al eliminar todas las aristas
de C1 , el nuevo grafo G1 que se obtiene es no vacío, con al menos una componente conexa. Además,
todos los vértices de G1 siguen teniendo grado par, pues sólo disminuye en dos el grado de cada vértice
en C1 . Reiterando el proceso, G1 contendrá un nuevo ciclo C2 , y al eliminar las aristas de C2 , se obtendrá
un nuevo grafo G2 , que a su vez tendrá un ciclo C3 , y así sucesivamente. Por la paridad en los grados
de los vértices, este proceso siempre termina con un último ciclo Ck , tal que al eliminar sus aristas, nos
queda un grafo sin aristas. Por tanto, E es la unión de las aristas de los ciclos C1 , . . . ,Ck , que son todos
disjuntos.
(3 ⇒ 1) Supongamos que E es la unión de k ciclos disjuntos C1 , . . . ,Ck . Tomemos el ciclo C1 co-
menzando en el vértice v1 . Como G es conexo, necesariamente existirá un vértice en C1 , digamos v2 ,
que pertenecerá a otro ciclo, digamos C2 . Esos dos ciclos se pueden pegar para formar un nuevo ciclo
que comenzará en v1 , usará las aristas de C1 hasta llegar a v2 , seguirá visitando todas las aristas de C2
comenzando y terminando en v2 , y seguirá a partir de v2 usando las aristas restantes de C1 . Repitiendo
este proceso, se pueden pegar todos los ciclos para obtener un ciclo euleriano.

El teorema no sólo da la caracterización para que un grafo sea euleriano, que sea conexo y con todos
los vértices de grado par, si no que también da un método para encontrar un ciclo euleriano. No hay mas
que ir buscando ciclos y pegarlos. Hay deferentes formas de proceder a la hora de buscar los ciclos y
pegarlos. El procedimiento que vamos a seguir nosotros para construir un ciclo euleriano es el siguiente.

Algoritmo del ciclo euleriano


Entrada. Un grafo conexo G con todos sus vértices de grado par.
Salida. Un ciclo euleriano T .

1. Elegir un vértice v como “vértice” activo y elegir la marca (símbolo) “1” inicial.
2. Hallar un ciclo con comienzo y final en v, de forma que todas las aristas incidentes a v hayan sido
marcadas.
La forma de hacerlo es la siguiente. Si hay aristas incidentes al nodo activo sin marcar, elegimos
una cualquiera, la marcamos con la marca, actualizamos el nodo activo poniendo como nuevo nodo
activo el otro extremo de la arista, y pasamos el símbolo marca al valor siguiente. Repetimos este
proceso hasta llegar a un nodo activo tal que todas sus aristas incidentes han sido marcadas.
3. Mientras haya aristas sin marcar, buscar un nuevo comienzo de ciclo y repetir el paso 2.
4. Pegar todos los ciclos obtenidos en un solo ciclo T .
5. Devolver T .
Grafos y Combinatoria. Javier Tejel 75

Veamos con un ejemplo los detalles del procedimiento anterior.

v1 v2 v1 2 v2

1 4 3
v5 v5
v4 5 v4
v3 v3
6

v6 v7 v6 v7
(a) (b)

v1 2 v2
v1 2 v2
1 3 2.1
1 2.1 4
4 3
v5
v5
5 v4 2.3
5 v4 2.3 v3
v3 2.2.3
6 2.2
2.2 2.2.2
6
v6 v7
v6 v7 2.2.1
(c) (d)

Figura 3.12: Construcción de un ciclo euleriano.

Ejemplo 3.1. Dado el ejemplo de la figura 3.12a, encontrar un ciclo euleriano.


Solución. Como todos los vértices tienen grado par, va a existir un ciclo euleriano.
Comenzamos con un vértice arbitrario, por ejemplo el v3 , que va a ser nuestro primer nodo ac-
tivo. Elegimos como marca el “1”. Como la arista (v3 , v1 ) no está marcada, la marcamos con el “1”
(va a ser la primera arista de nuestro primer ciclo), pasamos la marca a “2”, y elegimos v1 como
el nuevo nodo activo. Como la arista (v1 , v2 ) no está marcada, la marcamos con el “2”, pasamos la
marca al “3”, y elegimos v2 como el nuevo nodo activo. De esta manera, iremos marcando las aris-
tas (v3 , v1 ), (v1 , v2 ), (v2 , v4 ), (v4 , v1 ), (v1 , v6 ) y (v6 , v3 ), tal y como se muestra en la figura 3.12b y en
la tabla 3.2b. Como todas las aristas incidentes a v3 ya están usadas, nuestro primer ciclo es C1 =
(v3 , v1 , v2 , v4 , v1 , v6 , v3 ).
A continuación, hay que elegir un vértice de C1 que no tenga todas sus aristas marcadas. Podría
ser cualquiera, pero vamos a buscarlo siguiendo el orden de C1 , comenzando en v3 , que era nuestro
último vértice activo. A partir de v3 , vemos que v2 es el primer vértice en C1 que no tiene todas sus
aristas incidentes marcadas. Elegimos v2 como el nuevo nodo activo y elegimos “2.1” como marca. El
significado de esta elección es que vamos a construir un nuevo ciclo C2 a partir de la segunda arista del
ciclo C1 . Como la arista (v2 , v5 ) no está marcada, la marcamos con “2.1”, pasamos la marca a “2.2”, y
elegimos v5 como el nuevo nodo activo. Siguiendo el proceso, marcaríamos las aristas (v2 , v5 ), (v5 , v7 ) y
(v7 , v2 ) con las marcas “2.1”, “2.2” y “2.3”, respectivamente, tal y como se muestra en la figura 3.12c y
en la tabla 3.2c. Al volver a v2 , que es de nuevo el nodo activo, tenemos ya todas sus aristas marcadas,
con lo que el segundo ciclo que hemos encontrado es C2 = (v2 , v5 , v7 , v2 ).
Para pegar los ciclos C1 y C2 , no hay más que seguir el orden lexicográfico de las marcas “1”, “2”,
“2.1”, “2.2”, “2.3”, “3”, “4”, “5” y “6”. Eso genera el ciclo T = (v3 , v1 , v2 , v5 , v7 , v2 , v4 , v1 , v6 , v3 ).
Todavía tenemos aristas sin marcar, por lo que tenemos que seguir. A partir del último nodo activo,
que era v2 , visitamos los vértices de T en orden, comenzando por la primera arista del último ciclo
obtenido C2 , en este caso la arista (v2 , v5 ), que tenía la etiqueta “2.1”. Siguiendo T , el primer vértice
que encontramos con alguna arista sin usar es el vértice v7 , que va a ser nuestro nuevo nodo activo.
Como etiqueta elegimos “2.2.1” (vamos a añadir el nuevo ciclo a partir de la arista con la etiqueta “2.2”).
Al aplicar el proceso otra vez, obtenemos el nuevo ciclo C3 = (v7 , v6 , v4 , v7 ), formado por las aristas
76 Capítulo 3. Introducción a la teoría de grafos

(v7 , v6 ), (v6 , v4 ) y (v4 , v7 ), con etiquetas “2.2.1”, “2.2.2” y “2.2.3”, tal y como se muestra en la figura
3.12d y la tabla 3.2d.
Al no haber más aristas sin marcar, seguimos el orden lexicográfico “1”, “2”, “2.1”, “2.2”, “2.2.1”,
“2.2.2”, “2.2.3”, “2.3”, “3”, “4”, “5” y “6”, para obtener el ciclo euleriano (v3 , v1 , v2 , v5 , v7 , v6 , v4 , v7 ,
v2 , v4 , v1 , v6 , v3 ).

Arista Marca Arista Marca Arista Marca Arista Marca


(v3 , v1 ) (v6 , v7 ) (v3 , v1 ) 1 (v6 , v7 )
(v3 , v6 ) (v4 , v2 ) (v3 , v6 ) 6 (v4 , v2 ) 3
(v1 , v2 ) (v4 , v7 ) (v1 , v2 ) 2 (v4 , v7 )
(v1 , v4 ) (v2 , v5 ) (v1 , v4 ) 4 (v2 , v5 )
(v1 , v6 ) (v2 , v7 ) (v1 , v6 ) 5 (v2 , v7 )
(v6 , v4 ) (v7 , v5 ) (v6 , v4 ) (v7 , v5 )
(a) (b)

Arista Marca Arista Marca Arista Marca Arista Marca


(v3 , v1 ) 1 (v6 , v7 ) (v3 , v1 ) 1 (v6 , v7 ) 2.2.1
(v3 , v6 ) 6 (v4 , v2 ) 3 (v3 , v6 ) 6 (v4 , v2 ) 3
(v1 , v2 ) 2 (v4 , v7 ) (v1 , v2 ) 2 (v4 , v7 ) 2.2.3
(v1 , v4 ) 4 (v2 , v5 ) 2.1 (v1 , v4 ) 4 (v2 , v5 ) 2.1
(v1 , v6 ) 5 (v2 , v7 ) 2.3 (v1 , v6 ) 5 (v2 , v7 ) 2.3
(v6 , v4 ) (v7 , v5 ) 2.2 (v6 , v4 ) 2.2.2 (v7 , v5 ) 2.2
(c) (d)

Tabla 3.2: Construcción de un ciclo euleriano.

Hay que resaltar que las elecciones de las aristas no marcadas que se añaden durante el paso 2
del algoritmo en principio son arbitrarias, con lo que los ciclos que se pueden ir obteniendo durante la
aplicación del algoritmo pueden ser diferentes en función de esas elecciones, aunque el resultado final
siempre va a ser un ciclo euleriano.

Nota 3.1. El Teorema de Euler es también válido para multigrafos, es decir, para grafos en los que hay
aristas repetidas o bucles. Para un multigrafo G, existirá un ciclo euleriano siempre que G sea conexo
y todos los vértices tengan grado par. Además, para obtener un ciclo euleriano se puede usar el mismo
método de ir pegando ciclos.

Nota 3.2. El grafo asociado al problema de los puentes de Köningsberg, que se muestra en la figura 3.1,
es un multigrafo, donde los grados de los vértices son todos impares. Por tanto, la solución al problema
de los puentes de Köningsberg es que no se puede dar un paseo por la ciudad, saliendo de una zona y
volviendo a la misma, de forma que se pase por todos los puentes una sola vez.

Nota 3.3. Si nuestro grafo de partida G tuviese sólo dos vértices de grado impar u y v, añadiendo una
arista ficticia (u, v) a nuestro grafo conseguimos que todos los vértices tengan grado par. Podemos aplicar
entonces el algoritmo anterior para encontrar un ciclo euleriano. Al eliminar la arista ficticia del ciclo, lo
que obtenemos es un camino euleriano, con extremos en u y v, que visita todas las aristas de G una sola
vez.
En general, si se tienen 2k vértices de grado impar en un grafo G, se pueden añadir k aristas ficticias
a G para conseguir que todos los vértices tengan grado par. Aplicando el algoritmo anterior para obtener
un ciclo euleriano, y eliminado del ciclo las k aristas ficticias, se consiguen k caminos que vistan todas
las aristas de G una sola vez.
Grafos y Combinatoria. Javier Tejel 77

3.1.4. Árboles
Quizá una de las clases de grafos más importante sea la clase los árboles. Por una parte, permiten co-
nocer propiedades estructurales de grafos, y por otra aparecen de forma natural en muchas aplicaciones.
Así, Kirchhoff los descubrió estudiando redes eléctricas, y Cayley llegó a ellos investigando en proble-
mas de química orgánica. Además, son la base del diseño de muchos algoritmos y son una parte esencial
en las redes conexas.
Hay muchas definiciones posibles de árbol. Nosotros utilizaremos una y veremos posteriormente
varias propiedades equivalentes. Si n = 1, un grafo de orden 1 está formado por un sólo vértice y no
contiene aristas. Este caso degenerado se considera árbol. Para n ≥ 2, tenemos la siguiente definición.

Definición 3.19. Un grafo G de orden n ≥ 2 es un árbol si es conexo y no contiene ciclos.

La figura 3.13a ilustra un árbol de orden 6, mientras que la figura 3.13b muestra un grafo que no es
un árbol, pues contiene un ciclo de longitud 3, el ciclo (v2 , v3 , v4 , v2 ).

v1 v1

v2 v2
v6 v6

v4 v4
v5 v3 v5 v3
(a) (b)

Figura 3.13: Un árbol la izquierda y un grafo que no es árbol a la derecha.

Como un árbol es un grafo conexo, a todos los vértices del árbol tiene que llegar al menos una arista.
Por tanto, el grado de cualquier vértice es al menos 1. Diremos que un vértice v de un árbol es una hoja,
si el grado de v es exactamente 1. El siguiente teorema nos dice que cualquier árbol debe contener al
menos dos hojas.

Teorema 3.3. Todo árbol T de orden n ≥ 2 contiene al menos dos hojas.

Demostración. Como el orden de T es al menos 2, T tiene al menos dos vértices, y como T es conexo,
hay un camino simple entre dos vértices cualesquiera. Sea C = (v1 , . . . , vk ) un camino simple maximal,
es decir, un camino que no está contenido en ningún otro. Si v1 tiene grado mayor o igual que 2, entonces
v1 tendrá algún otro vecino u además de v2 . Claramente, u no puede ser ninguno de los vi de C, puesto
que en ese caso se formaría un ciclo. Pero si u es distinto de los vi del camino, entonces (u, v1 , v2 , . . . , vk )
es un camino simple de mayor longitud que la de C, contradiciendo la hipótesis de maximalidad de C.
Por tanto, v1 debe tener grado 1. Usando el mismo argumento, vk tendrá también grado 1, con lo que T
tendrá al menos dos hojas.

Del teorema anterior, se desprende el siguiente corolario.

Corolario 3.1. Si el grado de cualquier vértice de un grafo G es al menos dos, entonces G contiene al
menos un ciclo.

El siguiente teorema muestra definiciones equivalentes de árbol.

Teorema 3.4. Sea T = (V, E) un grafo de orden n ≥ 2, cuyos vértices son v1 , . . . , vn . Las siguientes
aseveraciones son equivalentes.

1. T es conexo y sin ciclos.


78 Capítulo 3. Introducción a la teoría de grafos

2. Cualquier par de vértices de T están conectados por un único camino.


3. T es conexo y al eliminar cualquier arista e, T − e ya no es conexo.
4. T es conexo y tiene n − 1 aristas.
5. T no tiene ciclos y tiene n − 1 aristas.
6. T no tiene ciclos, pero al añadir cualquier nueva arista e, T + e tiene exactamente un ciclo.
Demostración. (1 ⇒ 2) Puesto que T es conexo, entre cualquier par de vértices vi y v j existe un camino.
Además, cualquier camino de vi a v j debe ser simple, ya que si en un camino aparece repetido un vér-
tice vk , entonces tendríamos formado un ciclo con comienzo y final en vk . Supongamos que de vi a v j
hay dos caminos simples, el camino P = (vi = vi0 , vi1 , . . . , v j ) y el camino P′ = (vi = vi′0 , vi′1 , . . . , v j ). Sea
vir el primer vértice de P, tal que vir+1 ̸= vi′r+1 . Dicho vértice ha de existir puesto que los dos caminos
son distintos. Sea vis , el primer vértice de P posterior a vir que también está en P′ , es decir vis = vit′ .
De nuevo, dicho vértice debe existir, pues ambos caminos terminan en v j . Por construcción, notar que
C = (vir , vir+1 , . . . , vis = vit′ , vit−1
′ , . . . , vi′ = vi ) es un ciclo simple, contradiciendo que T es árbol. En con-
r r
secuencia, sólo existe un camino entre dos vértices cualesquiera.
(2 ⇒ 3) Como existe un camino desde cualquier vi a cualquier v j , el grafo T verificando 2 es conexo.
Sea ahora (vi , v j ) una arista de T . Esa arista es además el único camino de vi a v j . Luego si lo eliminamos,
no existe camino entre esos dos vértices y el grafo queda desconectado.
(3 ⇒ 4) Hay que ver que si se cumple 3, T tiene n − 1 aristas. Por conectividad, existe un camino
desde el vértice v1 a cualquier otro vértice vi . Para i = 2, . . . , n, sea Pi un camino de v1 a vi de longitud li
mínima, y sea ei = (v ji , vi ) la última arista de Pi . Como hay un camino de longitud li − 1 desde v1 a v ji ,
es claro que l ji < li . Por otro lado, si ei fuese la última arista de algún otro camino Pj , la única opción
es que lo fuese de Pji . Pero eso implicaría que existiría un camino de v1 a vi de longitud l ji − 1 < li ,
contradiciendo la minimalidad de Pi . Por tanto, todas las aristas (v ji , vi ), para i = 2, . . . , n, son distintas,
con lo que tenemos que cualquier grafo conexo tiene al menos n − 1 aristas. Llamaremos E ′ al conjunto
de las n − 1 aristas últimas, es decir, E ′ = {(v j2 , v2 ), (v j3 , v3 ), . . . , (v jn , vn )}.
Veamos ahora que T no puede tener más de n − 1 aristas. Dado i, supongamos que Pi es de la forma
Pi = (v1 , vi1 , vi2 , . . . , vi ). Para cualquier vir de Pi , se tiene que la longitud l del camino P que conecta
v1 con vir usando las aristas de Pi , debe coincidir con lir , ya que si fuese mayor, sustituyendo P por Pir
obtendríamos un camino más corto de v1 a vi , y si fuese menor, estaríamos contradiciendo la minimalidad
de lir . Por tanto, podemos sustituir P por Pir manteniendo la longitud de Pi . Repitiendo ese proceso para
todos los vir de Pi , lo que se consigue es que todas las aristas en Pi pertenezcan a E ′ . Como este proceso
se puede realizar para cualquier Pi , podemos asumir que todas las aristas de todos los Pi pertenecen a E ′ .
Si T tuviese alguna arista e′ ∈ / E ′ adicional, como no la usa ninguno de los caminos Pi , al eliminarla de T
el grafo seguiría siendo conexo, contradiciendo la hipótesis en 3 de que T − e′ no es conexo. Por tanto,
T es conexo y tiene n − 1 aristas.
(4 ⇒ 5) Tenemos que ver que T es acíclico, suponiendo que es conexo y con n − 1 aristas. Supon-
gamos que T tiene un ciclo, por lo que contendrá un ciclo simple C. Ese ciclo simple C tendrá el mismo
número de vértices que de aristas. Sea G1 = (V1 , E1 ) un subgrafo de T con el número máximo de vértices
posible, tal que |V1 | = |E1 |. Ese subgrafo tiene que existir, pues C satisface la condición de igualdad entre
los vértices y las aristas. Como T tiene menos aristas que vértices, deberá existir un vértice w no perte-
neciente a V1 . Al ser T conexo, tendrá que haber un camino desde un vértice v ∈ V1 a w. Si ese camino
es (v = v0 , v1 , . . . , vl = w), puesto que v está en V1 y w no, en algún momento encontraremos una arista
e con un extremo vh en V1 y el otro vh+1 fuera de V1 . Pero entonces el subgrafo G2 = (V1 ∪ vh+1 , E1 ∪ e)
cumple que |V2 | = |E2 |, contradiciendo la maximalidad de G1 . Luego T debe ser acíclico.
(5 ⇒ 1) Supongamos T acíclico y con n − 1 aristas. Veamos que T es conexo. Supongamos que T
no es conexo y sean T1 = (V1 , E1 ), . . . , Tk = (Vk , Ek ) sus componentes conexas. Como son subgrafos de
T , serán acíclicas, y como son conexas serán árboles por definición. Pero como 1 ⇒ 4, cada uno de los
árboles Ti tiene |Vi | − 1 aristas, con lo que T tendrá n − k aristas. Por hipótesis, T tiene n − 1 aristas, lo
que implica que k = 1 y T es conexo.
Con esto queda establecido que los cinco primeros enunciados son equivalentes.
Grafos y Combinatoria. Javier Tejel 79

(2 ⇒ 6) Supongamos que T cumple 2. Hay que ver que T es acíclico y que al añadir una nueva arista
se forma un ciclo. Como T cumple 2, también cumple 5, con lo que T es acíclico. Además, si es (vi , v j )
cualquier arista que no es de T , como por hipótesis hay un camino de vi a v j en T , al añadir la arista
(vi , v j ) obtenemos un ciclo.
(6 ⇒ 1) Cumpliendo 6, tenemos que ver que T es conexo. Sean vi y v j dos vértices cualesquiera. Si
son adyacentes en T , ya hay camino en T que une vi y v j . Supongamos que no son adyacentes en T .
Como por hipótesis, al añadir una nueva arista (vi , v j ) a T se forma un ciclo, necesariamente ese ciclo lo
forman la arista (vi , v j ) y un camino que conecta a vi y v j en T . Por tanto, T es conexo.

Como ya hemos comentado antes, la condición de ser o no ser conexo puede ser crucial en diferentes
aplicaciones, como redes de telecomunicaciones, o redes de transporte. En general, a uno le gustaría
mantener conexa una estructura, utilizando el menor número de conexiones posibles. La condiciones del
teorema anterior establecen que los árboles son precisamente los grafos conexos minimales, es decir,
que si queremos tener una estructura minimal que nos mantenga conexa una red, esa estructura ha de ser
necesariamente un árbol. Ésta es una de las características fundamentales de los árboles.
A veces es útil distinguir un vértice u de un árbol T . Cuando se realiza esa operación, al vértice
distinguido u se le denomina raíz, y a la pareja (T, u) se la denomina árbol con raíz en u. Generalmente,
el árbol se representa poniendo u en la posición más alta, y el resto de los vértices y las aristas colgando
de u, como se muestra en la figura 3.14. Como existe un único camino desde u a los demás vértices, si el
vértice v j aparece en el camino de u a vi , diremos que v j es un ancestro de vi , y que vi es un descendiente
de v j . En particular, si v j es el vértice justo anterior al vi , diremos que v j es el padre de vi , y que vi
es hijo de v j . Cada vértice, salvo la raíz, tiene un único padre, pero puede tener varios hijos. Con esta
terminología, las hojas del árbol son ahora los vértices sin hijos.
u

v1 v2 v3

v4 v5 v6 v10
v7 v8 v9

v11 v12 v13 v14 v15

Figura 3.14: Árbol con raíz en u.

En la figura 3.14, el vértice v3 es el padre de los vértices v8 , v9 y v10 , y es un ancestro del vértice v15 .
El vértice v13 es hijo del vértice v6 y es un descendiente del vértice v2 .

3.2. Grafos dirigidos


Hay muchas situaciones prácticas en las que es conveniente asignar direcciones a las aristas de un
grafo. Por ejemplo, en la representación gráfica de las calles de una ciudad, hay que distinguir entre
calles de dirección única y calles con doble sentido de circulación. Hay otras muchas situaciones en las
que se asignan direcciones de forma natural, como redes de comunicaciones, redes de transporte, redes
sociales, cadenas de mando, redes de flujo, ...
Para modelizar estas situaciones en las que se debe especificar dirección a las conexiones, utilizare-
mos los grafos dirigidos o digrafos. A lo largo de esta sección, iremos redefiniendo los conceptos básicos
dados para grafos no dirigidos, adaptándolos a la nueva situación.

Definición 3.20. Un grafo dirigido o digrafo es un par G = (V, A), donde V es un conjunto finito
cuyos elementos se llaman vértices (o nodos), y A es un conjunto de pares ordenados de vértices. A los
elementos de A los llamaremos aristas dirigidas (o conexiones o arcos).
80 Capítulo 3. Introducción a la teoría de grafos

Dada una arista dirigida (vi , v j ), al primero de los vértices, vi , se le suele llamar la cabeza de la arista,
y al segundo de los vértices, v j , la cola de la arista. También se suele decir que la arista sale de vi y llega
a v j , o que a v j se puede llegar desde vi (pero no al revés). Si queremos especificar que también se puede
ir desde v j hasta vi , habrá que añadir la arista dirigida (v j , vi ) a nuestro conjunto de aristas dirigidas. Los
vértices vi y v j son los extremos de la arista, y vi y v j son adyacentes.
Los grafos dirigidos aparecen con frecuencia en problemas de redes. En ese tipo de problemas, se
suele hablar de nodos y arcos, en lugar de vértices y aristas dirigidas. Nosotros utilizaremos indistinta-
mente ambas terminologías, vértices o nodos, y aristas dirigidas o arcos.
La figura 3.15 muestra una representación gráfica del grafo dirigido G que tiene a {v1 , v2 , v3 , v4 , v5 ,
v6 , v7 , v8 , v9 } como su conjunto de nodos, y a {(v1 , v7 ), (v1 , v8 ), (v2 , v1 ), (v3 , v1 ), (v3 , v2 ), (v3 , v4 ), (v3 , v5 ),
(v3 , v9 ), (v4 , v3 ), (v4 , v6 ), (v5 , v4 ), (v5 , v6 ), (v5 , v7 ), (v6 , v7 ), (v7 , v8 ), (v8 , v2 ), (v8 , v7 ), (v9 , v1 ), (v9 , v5 ),
(v9 , v7 )} como su conjunto de arcos.
v2
v1

v3

v8 v9 v4

v7 v5

v6

Figura 3.15: Ejemplo de grafo dirigido.

Observar que si se tiene el arco (vi , v j ), en la representación gráfica aparece una conexión con flecha
que va de vi a v j , indicando que se puede ir a v j desde vi , pero no al revés. Recordar además que, aunque
las representaciones gráficas son muy útiles, un grafo es algo abstracto, independientemente de si es
dirigido o no dirigido.
A pesar de que en un grafo dirigido pueden aparecer bucles y aristas repetidas, nosotros vamos a
considerar siempre que, salvo que se diga lo contrario, nuestros grafos dirigidos son simples, es decir,
sin bucles ni aristas repetidas.
En un grafo no dirigido, hablábamos de los vecinos de un vértice v, como aquellos vértices que eran
adyacentes a v. Ahora, como las aristas son dirigidas, hay que hablar de vecinos “out” (o vecinos hacia
afuera) y vecinos “in” (o vecinos hacia adentro).
Definición 3.21. Dado un grafo dirigido G = (V, A) y un nodo v, los vecinos “out” de v son aquellos
nodos a los que se puede llegar desde v a través de arcos de G, y los vecinos “in” de v son aquellos nodos
desde los que se puede llegar a v a través de arcos de G.
Definición 3.22. Dado un grafo dirigido G = (V, A) y un nodo v, el grado “out” de v es el número de
vecinos “out” de v, y el grado “in” de v es el número de vecinos “in” de v.
En el grafo dirigido mostrado en la figura 3.15, los vecinos “out” de v1 son v7 y v8 , con lo que su
grado “out” es 2, y los vecinos “in” son v2 , v3 y v9 , con lo que su grado “in” es 3.
Usando la definición de grados, el siguiente teorema es bastante evidente.
Teorema 3.5. Dado un grafo dirigido G = (V, A), la suma de los grados “in” es igual a la suma de los
grados “out” y también es igual al número de arcos |A| de G.
Las listas de vecinos “out” e “in” se definen de forma análoga a como se definieron las listas de
vecinos en el caso no dirigido. La definición de la matriz de adyacencia cambia un poco.
Grafos y Combinatoria. Javier Tejel 81

Definición 3.23. Dado un grafo dirigido G(V, A) con n nodos, la matriz de adyacencia es una matriz M
de tamaño n × n, donde el elemento mi j de dicha matriz es 1 si el arco (vi , v j ) pertenece a A, y 0 en otro
caso.

En el ejemplo de la figura 3.15, como v1 sólo tiene a v7 y v8 como sus vecinos “out”, en la primera
fila de la matriz de adyacencia aparecerían todo ceros, excepto en la columna 7 y en la columna 8, que
habría unos.
A continuación, se muestran las listas de vecinos “out” e “in” para el grafo dirigido de la figura 3.15,
así como su matriz de adyacencia.

Listas de vecinos “out” Listas de vecinos “in”


Nodo Vecinos “out” Nodo Vecinos “in”
v1 v7 , v8 v1 v2 , v3 , v9
v2 v1 v2 v3 , v8
v3 v1 , v2 , v4 , v5 , v9 v3 v4
v4 v3 , v6 v4 v3 , v5
v5 v4 , v6 , v7 v5 v3 , v9
v6 v7 v6 v4 , v5
v7 v8 v7 v1 , v5 , v6 , v8 , v9
v8 v2 , v7 v8 v1 , v7
v9 v1 , v5 , v7 v9 v3
(a) (b)

v1 v2 v3 v4 v5 v6 v7 v8 v9
 
v1 0 0 0 0 0 0 1 1 0
1
v2  0 0 0 0 0 0 0 0 
1
v3  1 0 1 1 0 0 0 1 
0
v4  0 1 0 0 1 0 0 0 
0
v5  0 0 1 0 1 1 0 0 
0
v6  0 0 0 0 0 1 0 0 
0
v7  0 0 0 0 0 0 1 0 
v8  0 1 0 0 0 0 1 0 0
v9 1 0 0 0 1 0 1 0 0
(c)

Tabla 3.3: Listas de vecinos “out” e “in”, y matriz de adyacencia del grafo dirigido de la figura 3.15.

Por último, resaltar que la definición de subgrafo en una red es la misma que la definición de subgrafo
en un grafo no dirigido.
Es importante destacar que un grafo no dirigido puede verse como un caso particular de grafo di-
rigido. Dado un grafo no dirigido G = (V, E), su versión dirigida consiste en definir un grafo dirigido
G′ = (V, A), donde por cada arista (vi , v j ) de G se añaden los arcos (vi , v j ) y (v j , vi ) a G′ . Claramente,
la matriz de adyacencia M de G, que es simétrica, y la matriz de adyacencia M ′ de G′ coinciden. Por
tanto, los grafos no dirigidos se corresponden con el caso particular de grafos dirigidos cuya matriz de
adyacencia es simétrica. De hecho, los diferentes algoritmos que daremos para grafos dirigidos se pueden
aplicar sobre grafos no dirigidos sin más que considerar la versión dirigida de los mismos.

3.2.1. Caminos y ciclos


Las definiciones de paseo, camino y ciclo son muy similares a las que vimos para grafos no dirigidos.
82 Capítulo 3. Introducción a la teoría de grafos

Definición 3.24. Dado un grafo dirigido G = (V, A), un paseo dirigido de longitud l desde el nodo vi
al nodo v j es una sucesión de nodos (vi0 , vi1 , vi2 , . . . , vil ), tal que vi0 = vi , vil = v j , y (vih−1 , vih ) ∈ A, para
h = 1, 2, . . . l. Un camino dirigido es un paseo dirigido en el que no aparecen arcos repetidos, y el camino
dirigido es simple si no contiene nodos repetidos.

Definición 3.25. Dado un grafo dirigido G = (V, A), un paseo dirigido que comienza y termina en un
mismo nodo es un paseo dirigido cerrado, y su longitud es el número de arcos del mismo. Si en el paseo
dirigido cerrado no aparecen arcos repetidos, entonces hablaremos de un ciclo dirigido. Además, si no
hay nodos repetidos en un ciclo dirigido, diremos que el ciclo dirigido es simple.

v2 v2
v1 v1
5
v3 v3
6
1 1

v8 v9 2 v4 v8 v9 2 v4
4
3
3

v7 v5 v7 v5

v6 v6
(a) (b)

v2 v2
v1 v1
1 2

v3 v3

1
3
4

v8 v9 v4 v8 v9 2 v4
5
3
4

v7 v5 v7 v5

v6 v6
(c) (d)

Figura 3.16: Ejemplos de caminos y ciclos dirigidos.

La figura 3.16a muestra el camino dirigido (v3 , v9 , v5 , v4 , v3 , v1 , v8 ) de longitud 6, que conecta el nodo
v3 con el nodo v8 . En la figura hemos ilustrado en rojo el camino dirigido, con los arcos numerados
según el orden en el que se visitan. Observar que hay nodos repetidos en el camino. Observar también
que un camino dirigido se puede transformar en uno simple sin más que ir eliminando ciclos dirigidos
simples. Por ejemplo, en el camino dirigido (v3 , v9 , v5 , v4 , v3 , v1 , v8 ) de la figura 3.16a, podemos eliminar
el ciclo dirigido (v3 , v9 , v5 , v4 , v3 ), para obtener el camino dirigido simple (v3 , v1 , v8 ), que conecta a v3
con v8 . La figura 3.16b muestra otro camino dirigido simple, el camino (v3 , v9 , v5 , v7 , v8 ) de longitud 4,
que conecta el nodo v3 con el nod v8 . Ahora, no hay nodos repetidos. Por último, la figura 3.16c muestra
el ciclo dirigido (v8 , v2 , v1 , v8 , v7 , v8 ), de longitud 5, y la figura 3.16d muestra el ciclo dirigido simple
(v3 , v9 , v5 , v4 ), de longitud 4.
Grafos y Combinatoria. Javier Tejel 83

Sobre un grafo dirigido también se puede definir caminos no dirigidos. De hecho, este tipo de cami-
nos nos serán de utilidad en el análisis del flujo en redes.
Definición 3.26. Dado un grafo dirigido G = (V, A), un camino no dirigido de longitud l, desde el
nodo vi al nodo v j , es una sucesión de nodos (vi0 , vi1 , vi2 , . . . , vil ), tal que vi0 = vi , vil = v j , y (vih−1 , vih ) ∈ A
o (vih , vih−1 ) ∈ A, para h = 1, 2, . . . l, junto con una especificación de qué arco es usado para “pasar” de
vih−1 a vih , si el arco (vih−1 , vih ) o el arco (vih , vih−1 ). Además, cada arco puede usarse como mucho una
vez.
Generalmente, la forma de especificar un camino no dirigido es usando flechas. Si del nodo vi se pasa
al nodo v j en el camino a través del arco (vi , v j ), entonces se pone vi → v j . Por contra, si del nodo vi se
pasa al nodo v j en el camino a través del arco (v j , vi ), entonces se pone vi ← v j . Por ejemplo, sobre el
grafo dirigido de la figura 3.17a se muestra en rojo el camino no dirigido

v3 → v1 ← v9 → v7 ← v5 → v6 → v7 ← v8 → v2

Cuando un arco se usa en la dirección correcta, de la cabeza del arco a la cola del mismo, se dice que
el arco es hacia adelante. Cuando se usa en dirección contraria, de la cola a la cabeza, se dice que el
arco es hacia atrás. En el camino no dirigido del ejemplo anterior, todos los arcos son hacia adelante,
excepto los arcos (v9 , v1 ), (v5 , v7 ) y (v8 , v7 ), que son arcos hacia atrás.

v2 v2
v1 v1
8 8 9
1 1
v3 v3
2 2

v8 v9 v4 v8 v9 v4
3 3

7 4 7 4

v7 5
v5 v7 5
v5
6 6
v6 v6
(a) (b)

v2
v1
5 6
1
v3
2

v8 v9 v4
3
4

v7 v5

v6
(c)

Figura 3.17: Una red G y varios caminos y ciclos no dirigidos.

Usando arcos hacia adelante y arcos hacia atrás, se pueden definir sobre un grafo dirigido, de forma
análoga a los caminos no dirigidos, paseos no dirigidos (cuando se permite repetir arcos además de
84 Capítulo 3. Introducción a la teoría de grafos

nodos), caminos no dirigidos simples (no hay ningún nodo repetido), paseos no dirigidos cerrados (el
nodo inicial y final del paseo coinciden), ciclos no dirigidos (cuando coinciden los extremos de un camino
no dirigido) y ciclos no dirigidos simples (no se repiten ni arcos ni nodos).
Por ejemplo, la figura 3.17b muestra el ciclo no dirigido

v3 → v1 ← v9 → v7 ← v5 → v6 → v7 ← v8 → v2 ← v3

que contiene nodos repetidos, y la figura 3.17c muestra el ciclo no dirigido simple

v3 → v1 ← v9 → v7 ← v8 → v2 ← v3

3.2.2. Conectividad
En un grafo dirigido se pueden definir dos tipos de conectividad, en función de si se prescinde de la
orientación de los arcos o no. Definamos formalmente a continuación estos conceptos.

Definición 3.27. Dado un grafo dirigido G = (V, A), al grafo G′ que se obtiene considerando los pares
ordenados como no ordenados y eliminando repeticiones de pares no ordenados se le denomina grafo
subyacente. Se dice que G es conexo si su grafo subyacente G′ es conexo.

v2 v2
v1 v1

v3 v3

v8 v9 v4 v8 v9 v4

v7 v5 v7 v5

v6 v6
(a) (b)

Figura 3.18: El grafo subyacente al grafo G mostrado en la figura 3.15 y las componentes fuertemente
conexas de G.

La figura 3.18a muestra el grafo subyacente G′ asociado al grafo dirigido G de la figura 3.15. Ob-
servar que los arcos (v3 , v4 ) y (v4 , v3 ) de G se transforman en una sola arista en G′ , y lo mismo sucede
con los arcos (v7 , v8 ) y (v8 , v7 ). El grafo dirigido G es conexo, pues su subgrafo subyacente, que es no
dirigido, lo es. También se podía haber definido que un grafo dirigido es conexo cuando para cada par de
nodos existe un camino no dirigido entre ellos.
Una vez definida la conectividad de un grafo dirigido, podemos enunciar el siguiente teorema para
grafos dirigidos, que damos sin demostración. Sería el equivalente al Teorema de Euler que dimos para
grafos no dirigidos.

Teorema 3.6. Sea G = (V, A) un grafo dirigido conexo. G es euleriano (existe un ciclo dirigido que visita
todos los arcos una sola vez), si y sólo si, para cada nodo de G su grado “in” y su grado “out” coinciden.

Cuando no se prescinde de la orientación de los arcos, entonces aparece el concepto de grafo fuerte-
mente conexo.
Grafos y Combinatoria. Javier Tejel 85

Definición 3.28. Un grafo dirigido G = (V, A) se dice fuertemente conexo si, para dos nodos cuales-
quiera vi y v j , hay un camino dirigido de vi a v j , y otro de v j a vi . Una componente fuertemente conexa
de G es un subgrafo maximal fuertemente conexo.
La figura 3.18b muestra las componentes fuertemente conexas de ese grafo dirigido. La primera
de las componentes está formada por los nodos C1 = {v1 , v2 , v7 , v8 }, la segunda por los nodos C2 =
{v3 , v4 , v5 , v9 }, y la tercera componente por el nodo C3 = {v6 }. En la figura, se muestra en rojo el sub-
grafo inducido por los nodos de C1 , y en azul el subgrafo inducido por los nodos de C2 . Notar que, entre
dos nodos cualesquiera de C1 , siempre existe un camino dirigido (usando arcos rojos) que los une. Igual-
mente, entre dos nodos cualesquiera de C2 , siempre existe un camino dirigido (usando arcos azules) que
los une. Sin embargo, v1 y v3 no están en la misma componente fuertemente conexa puesto que, aunque
hay un camino dirigido de v3 a v1 , no lo hay de v1 a v3 . Por otra parte, el nodo v6 forma por sí solo una
componente fuertemente conexa, ya que, dado otro nodo cualquiera v, no hay a la vez un camino dirigido
de v6 a v y otro de v a v6 .

3.2.3. Grafos acíclicos dirigidos. Sort topológico


Hay un tipo especial de grafo dirigido, que definimos a continuación.
Definición 3.29. Un grafo dirigido G = (V, A) que no contiene ciclos dirigidos se denomina grafo ací-
clico dirigido, o simplemente DAG (abreviatura de directed acyclic graph).
Aunque se podría pensar que un DAG debería tener  pocos arcos, ya que no puede tener ciclos di-
rigidos, un DAG con n nodos puede llegar a tener n2 arcos, como se puede observar en la figura 3.19.
Dicha figura muestra dos representaciones distintas de un mismo DAG, con cinco nodos y diez arcos, el
máximo posible de arcos en un DAG.
v1
v5

v3 v4 v5
v2 v1 v2
v4
v3

Figura 3.19: Ejemplo de DAG.

Observar que en la representación de la derecha, los nodos aparecen en orden y los arcos van todos
de izquierda a derecha. Ésta es una de las propiedades interesantes que tiene un DAG. Siempre admite
una ordenación de los nodos que es compatible con los arcos, es decir, todos los arcos van de izquierda
a derecha. Dicho de otra forma, existe una ordenación de los nodos de forma que, para cualquier arco
(vi , v j ), la cabeza vi está antes que la cola v j en la ordenación.
Dado un grafo dirigido G = (V, A), el problema del sort topológico consiste en determinar si G es
un DAG o no, y en caso afirmativo, dar una ordenación de los nodos compatible con los arcos. Las ideas
de la demostración del siguiente teorema permiten resolver eficientemente este problema.
Teorema 3.7. Sea G = (V, A) un grafo dirigido. Existe un orden de los nodos de G compatible con los
arcos, si y sólo si, G no contiene ciclos dirigidos.
Demostración. Es obvio que si G tiene un ciclo dirigido C, entonces no puede tener un orden compatible.
Siempre habrá algún arco de C que irá de derecha a izquierda, en cualquier ordenación de los nodos.
Probemos por inducción en el número n de nodos de G lo opuesto, que si G no contiene ciclos
dirigidos, entonces hay un orden compatible.
Si n = 2, el resultado es obvio. Supongamos ahora que G tiene n > 2 nodos y que no contiene ciclos.
Veamos primero que tiene que existir un nodo vi , tal que su lista de vecinos “out” está vacía. Si ésto no
86 Capítulo 3. Introducción a la teoría de grafos

fuese cierto, y todas las listas fuesen no vacías, entonces podríamos construir una lista arbitrariamen-
te larga vi1 , vi2 , vi3 , . . ., en la que cada par (vi j , vi j+1 ) es un arco de G. Puesto que el número de nodos
de G es finito, en algún momento tendremos que vi j = vik , para algún j < k, y por tanto la secuencia
(vi j , vi j+1 , vi j+2 , . . . , vik ) forma un ciclo dirigido, una contradicción. Por tanto, existe un nodo vi tal que su
lista de vecinos “out” es vacía.
Consideremos ahora el grafo dirigido Gi , obtenido borrando el nodo vi de G y los arcos que llegan a
él. Como G no tiene ciclos, Gi tampoco. Luego aplicando inducción sobre Gi , un grafo dirigido sin ciclos
con n − 1 nodos, podemos ordenar sus nodos (que son todos salvo vi ), de forma que los arcos vayan de
izquierda a derecha. Si añadimos el nodo vi al final de está ordenación, obtenemos una ordenación de los
n nodos que es compatible con los arcos de G. La ordenación es compatible para los arcos que no usan
vi por inducción, y compatible con los arcos que llegan a vi , pues es el último nodo de la ordenación (de
vi no sale ningún arco).
La demostración del teorema nos da un método para hallar un orden compatible si G es una DAG, o
un ciclo dirigido si no es un DAG. Buscamos un nodo con su lista de vecinos “out” vacía, le asignamos
la última posición en el orden total, y lo borramos de G. En el grafo resultante repetimos el proceso,
buscando un nuevo nodo con su lista de vecinos “out” vacía, poniéndolo al final (será en la posición n − 1
del orden total), y borrándolo del grafo. Y así sucesivamente. Si en este proceso siempre encontramos
listas de vecinos “out” vacías, el grafo inicial era un DAG y hemos encontrado un orden compatible para
sus nodos. Por el contrario, si en algún momento las listas de vecinos “out” del grafo remanente son todas
no vacías, ese grafo remanente contiene al menos un ciclo dirigido. Podemos calcular uno de esos ciclos
como en la demostración del teorema, construyendo un camino vi , vecino(vi ), vecino(vecino(vi )), . . .,
hasta que encontremos dos nodos repetidos.
Resumiendo, el algoritmo quedaría de la siguiente forma.

Algoritmo del sort topológico


Entrada. Un grafo dirigido G de n nodos y las listas de vecinos “out”.
Salida. Un orden compatible si G es un DAG, o un ciclo si no es un DAG.
1. Inicializar como vacío el vector orden, que contendrá el orden compatible.
2. Inicializar con k = n, la primera posición libre en el orden compatible.
3. Mientras exista un nodo j con su lista de vecinos “out” vacía, repetir lo siguiente.
Añadimos j a la última posición libre del orden haciendo orden(k) = j, y actualizamos la última
posición libre del orden haciendo k = k − 1. Borramos el nodo j del grafo y actualizamos las listas
de vecinos “out”.
4. Si no quedan nodos que explorar, G es una DAG y devolvemos el orden compatible orden.
5. Si quedan nodos con sus listas de vecinos “out” no vacías, encontrar un ciclo dirigido como en la
demostración del Teorema 3.7 y devolver ese ciclo.

1
2
11
3
10

4
9

5
8
7 6

Figura 3.20: Un DAG de 11 nodos.


Grafos y Combinatoria. Javier Tejel 87

Veamos algunos ejemplos de aplicación.


Ejemplo 3.2. Decidir si el grafo dirigido de la figura 3.20 es un DAG, y en caso afirmativo dar un orden
compatible.
Solución. Lo primero que hay que hacer es construir las listas de los vecinos “out” de todos los nodos,
tal y como se muestra en la tabla 3.4a.
Lo siguiente es buscar un nodo con su lista de vecinos “out” vacía. Como hay dos, el nodo 5 y el
nodo 7, podríamos elegir cualquiera de los dos como el último nodo del posible orden compatible. Para
ejecutar de forma más rápida el algoritmo, procesamos los dos nodos a la vez, formando una capa con
esos dos nodos, que serán los últimos que aparecerán en el orden compatible (ver la figura 3.21a). Las
capas las iremos construyendo de derecha a izquierda.

Nodo “out” Nodo “out” Nodo “out” Nodo “out” Nodo “out”
1 2, 6 1 2, 6 1 2, 6 1 2, 6 1 2, 6
2 4, 6, 7 2 4, 6, 7 2 4, 6, 7 2 4, 6, 7 2 4, 6, 7
3 4 3 4 3 4 3 4 3 4
4 7 4 7 4 7 4 7 4 7
5 5 5 5 5
6 4, 7 6 4, 7 6 4, 7 6 4, 7 6 4, 7
7 7 7 7 7
8 2, 3, 9 8 2, 3, 9 8 2, 3, 9 8 2, 3, 9 8 2, 3, 9
9 5, 10 9 5, 10 9 5, 10 9 5, 
10
 9 5, 
10

10 4, 5 10 4, 5 10 4, 5 10

 4, 5 10

 4, 5
11 9, 10 11 9, 10 11 9, 10 11 9, 10
 11 9, 
10

(a) (b) (c) (d) (e)

Tabla 3.4: Tablas con la ejecución del algoritmo sort topológico para el ejemplo 3.2.

Una vez definida la primera capa, se borran esos dos nodos del grafo y se actualizan las listas de
vecinos “out”, como se muestra en la tabla 3.4b. Ahora, sólo hay un nodo con su lista de vecinos “out”
vacía, el nodo 4, que será el que defina la siguiente capa (ver la figura 3.21a).
Tras borrar el nodo 4, en las listas de vecinos “out” actualizadas (ver la tabla 3.4c), los nodos 3, 6 y
10 tienen sus listas de vecinos “out” vacías, por lo que van a ser los nodos de nuestra siguiente capa.
6
1
7
2

8
4
3
11 7
9 2 9 3 10 6
8 1 4 5
5
11 10
(a) (b)

Figura 3.21: Orden compatible con el DAG de la figura 3.20.

Al borrar esos tres nodos y actualizar las listas de vecinos “out” (ver la tabla 3.4d), los nodos 2 y 9
son los nuevos nodos con sus listas de vecinos “out” vacías. Estos dos nodos formarán la siguiente capa.
Al borrar los dos nodos y actualizar las listas (ver la tabla 3.4e), los tres nodos que quedan, el 1, el 8 y el
11, tienen sus listas de vecinos “out” vacías. Estos tres nodos formarán la última capa.
88 Capítulo 3. Introducción a la teoría de grafos

La figura 3.21a muestra el grafo de la figura 3.20 cuando los nodos aparecen según las capas encon-
tradas por el algoritmo. Notar que, por la forma de construir la capas, todos los arcos van de izquierda a
derecha.
A partir de las capas, un orden compatible se construye de la siguiente forma. Los primeros nodos han
de ser los nodos 1, 8 y 11, en cualquier orden. A continuación, los nodos 2 y 9, en cualquier orden. Luego
los nodos 6, 3 y 10, en cualquier orden. Después el nodo 4, y por último los nodos 7 y 5, en cualquier
orden. La figura 3.21b muestra el grafo con el orden compatible (8, 1, 11, 2, 9, 3, 10, 6, 4, 7, 5).

1
2
11
3
10

4
9

5
8
7 6

Figura 3.22: Un grafo con ciclos de 11 nodos.

Ejemplo 3.3. Decidir si el grafo dirigido de la figura 3.22 es un DAG, y en caso negativo, dar un ciclo
dirigido.
Solución. Lo primero que hay que hacer es construir las listas de los vecinos “out” de todos los nodos,
tal y como se muestra en la tabla 3.5a.

Nodo “out” Nodo “out”


1 2, 6 1 2, 6
2 3, 4, 6, 7 2 3, 4, 6, 7
3 4 3 4
4 5, 7 4 5, 7
5 8 5 8
6 4, 7, 10 6 4, 7, 10
7 7
8 2, 3, 9 8 2, 3, 9
9 5, 10 9 5, 10
10 4, 5 10 4, 5
11 1, 8, 9, 10 11 1, 8, 9, 10
(a) (b)

Tabla 3.5: Tablas con la ejecución del algoritmo sort topológico para el ejemplo 3.3.

Como ahora sólo hay un nodo con su lista de vecinos “out” vacía, el nodo 7, este nodo define la
primera capa. Al borrar el nodo 7 y actualizar las listas de vecinos, obtenemos la tabla 3.5b. Ahora, ya no
hay ningún nodo con su lista de vecinos “out” vacía, por lo que el grafo de la figura 3.22 no es un DAG.
Para encontrar un ciclo, basta con comenzar con un nodo arbitrario, elegir uno de sus vecinos, elegir
luego uno de los vecinos de su vecino, y así sucesivamente hasta encontrar un ciclo. Por ejemplo, si
comenzamos con el 1, y seguimos con el nodo 2, luego con el 4, luego con el 5, luego con el 8, para
volver al 2, estamos encontrando el ciclo (2, 4, 5, 8, 2).
Grafos y Combinatoria. Javier Tejel 89

Nota 3.4. En el Teorema 3.7, hemos visto que un DAG siempre debe tener nodos con sus listas de vecinos
“out” vacías, y a partir de ellos podemos encontrar un orden compatible para el DAG. Del mismo modo,
se puede probar que un DAG siempre ha de tener nodos con sus listas de vecinos “in” vacías. Esto da el
método alternativo de procesar las listas de vecinos “in” en lugar de las “out”, para encontrar un orden
compatible para un DAG.
El proceso sería el siguiente. Se buscan los nodos tales que sus listas de vecinos “in” estén vacías.
Esos nodos definen la primera capa, donde ahora las capas hay que construirlas de izquierda a derecha.
Luego se borran los nodos de la capa y se actualizan las listas de vecinos “in”. Se buscan los nuevos
nodos con sus listas de vecinos “in” vacías, que serán los que definan la segunda capa, y se va reiterando
el proceso.

Nodo “in” Nodo “in” Nodo “in”


1 1 1
2 1, 8 2 1, 8 2 1, 8
3 8 3 8 3 8
4 2, 3, 6, 10 4 2, 3, 6, 10 4 2, 3, 6, 10
5 9, 10 5 9, 10 5 9, 10
6 1, 2 6 1, 2 6 1, 2
7 2, 4, 6 7 2, 4, 6 7 2, 4, 6
8 8 8
9 8, 11 9 8, 
11
 9 8, 
11

10 9, 11 10 9, 11
 10 9, 
11

11 11

 11


(a) (b) (c)

Nodo “in” Nodo “in”


1 1
2 1, 8 2 1, 8
3 8 3 8
4 2, 3, 6, 
10
 4 2, 3, 6, 
10

5 9, 
10
 5 9, 
10

6 1, 2 6 1, 2
7 2, 4, 6 7 2, 4, 6
8 8
9 8, 
11
 9 8, 
11

10

 9, 
11
 10

 9, 
11

11

 11


(d) (e)

Tabla 3.6: Tablas procesando las listas de vecinos “in” para el grafo de la figura 3.20.

La tabla 3.6 muestra la secuencia de tablas que se irían construyendo para encontrar las diferentes
capas para el grafo de la figura 3.20. La primera capa estaría formada por los nodos 1, 8 y 11, que son
los que tienen sus listas de vecinos “in” vacías (véase la tabla 3.6a), la segunda por los nodos 2, 3 y 9
(véase la tabla 3.6b), la tercera por los nodos 6 y 10 (véase la tabla 3.6c), la cuarta por los nodos 4 y 5
(véase la tabla 3.6d), y la última por el nodo 7 (véase la tabla 3.6e). Observar que las capas no tienen por
qué coincidir con las capas obtenidas procesando las listas de vecinos “out”.
La figura 3.23 muestra cómo habría quedado el grafo de la figura 3.20, siguiendo el orden de las
capas definido al procesar las listas de vecinos “in”.

El problema del sort topológico tiene otra interpretación matemática relacionada con los conjuntos
90 Capítulo 3. Introducción a la teoría de grafos

2
1
4

6
8
3
7
10
5
11 9

Figura 3.23: Orden compatible por capas con el DAG de la figura 3.20, procesando las listas de vecinos
“in”.

parcialmente ordenados. Un conjunto parcialmente ordenado es un conjunto con una relación de orden,
que vamos a llamar ≤, que es reflexiva (a ≤ a), antisimétrica (si a ≤ b y b ≤ a, entonces a = b) y
transitiva (si a ≤ b y b ≤ c, entonces a ≤ c). En un orden parcial, no siempre dos elementos del conjunto
son comparables.
Un orden total es un orden parcial en el que para cada par de elementos a y b se tiene que a ≤ b o
b ≤ a. Dar un orden total a un conjunto equivale a dar una lista ordenada de sus elementos, donde a ≤ b
cuando el elemento a aparece antes que el b en la lista. Una extensión lineal de un orden parcial es un
orden total compatible con ese orden parcial, es decir, si a ≤ b en el orden parcial, también a ≤ b en el
total (a va antes que b en la lista ordenada).
Observar que un DAG define un orden parcial en el conjunto sus nodos (dados dos nodos u y v, u ≤ v,
si y sólo si, hay un camino dirigido desde u hasta v). Recíprocamente, dado un conjunto V con un orden
parcial, poniendo un arco (u, v), si y sólo si, u ≤ v, obtenemos un DAG. Entonces, el problema del sort
topológico es encontrar un orden total compatible con ese orden parcial.

Ejemplo 3.4. La tabla 3.7 muestra 9 tareas que hay que realizar. Para cada tarea, se tiene una lista con
las relaciones de precedencia con el resto de las tareas. Así, la tarea 1 no puede realizarse si no se ha
realizado la tarea 4, y la tarea 5 no puede realizarse si no se hacen primero las tareas 1, 4 y 8. Encontrar,
si es posible, una secuenciación de las tareas que respete las relaciones de precedencia, es decir, si una
tarea i debe realizarse antes que una tarea j, la tarea i aparece en la secuencia antes que la tarea j.

Tarea Predecesoras
1 4 1
2 1, 5 4 2
3 2, 6
4 7 7 3
5 1, 4, 8 6
5
6 5, 9
7 8
9
8 7
9 5, 8 Figura 3.24: Secuenciación de las tareas.
Tabla 3.7: Tareas a realizar.

Solución. Las relaciones de precedencia definen un orden parcial sobre las tareas, que pueden modeli-
zarse como arcos. Suponiendo las tareas como los nodos de un grafo dirigido G, ese grafo contendrá el
arco (i, j), si la tarea i se debe realizar antes que la tarea j. El problema de encontrar la secuenciación de
las tareas es entonces el problema del sort topológico sobre el grafo G. Si G es un DAG podremos dar
Grafos y Combinatoria. Javier Tejel 91

una solución. Si G contiene algún ciclo (i0 , i1 , . . . , i j , i0 ), el problema no tendrá solución, pues el ciclo
implica que la tarea i0 debe hacerse antes que la i1 , la i1 antes que la i2 , y así sucesivamente, hasta la
tarea i j , que debe hacerse antes que la i0 . Todas estas restricciones son incompatibles con una posible
secuenciación de tareas.
Con la definición de los arcos que hemos realizado, las listas de tareas predecesoras son las listas de
vecinos “in”, por lo que podemos aplicar el algoritmo del sort topológico usando esas listas de vecinos
“in”.
Al aplicar el algoritmo, la primera capa estaría formada por la tarea 7, que es la única que tiene su
lista de vecinos “in” vacía. Una vez procesada esa tarea, las siguientes tareas que tendrían sus listas “in”
vacías serían las tareas 4 y 8, que definirían la segunda capa. Recordad que las capas van de izquierda
a derecha cuando se procesan las listas de vecinos “in”. Reiterando el proceso, obtendríamos las capas
mostradas en la figura 3.24. La primera capa definida por la tarea 7, la segunda por las tareas 4 y 8, la
tercera por la tarea 1, la cuarta por la tarea 5, la quinta por las tareas 2 y 9, la sexta por la tarea 6, y la
séptima por la tarea 3. Dicha figura también muestra las relaciones de precedencia de las tareas. A la
vista de las capas obtenidas, una posible secuenciación de las tareas sería (7, 4, 8, 1, 5, 2, 9, 6, 3).

Nota 3.5. Existen diferentes algoritmos para resolver el problema del sort topológico. En general, la
complejidad computacional de todos ellos es O(n + m), donde n es el número de nodos del grafo y m el
número de arcos.

3.3. Recorrido de un grafo


En muchas aplicaciones prácticas, es fundamental disponer de unos algoritmos eficientes que per-
mitan resolver problemas básicos sobre un grafo: si existe un camino entre dos vértices cualesquiera,
si el grafo es conexo, si hay caminos de aumento en redes de flujo, cuáles son los puentes y puntos de
articulación de un grafo, dar un árbol generador para un grafo, ...
En esta sección, vamos a ver dos de los algoritmos más conocidos para resolver este tipo de cuestio-
nes, como son los algoritmos BFS y DFS. También veremos cómo usarlos para calcular las componentes
conexas de un grafo no dirigido y las componentes fuertemente conexas de un grafo dirigido. En am-
bos métodos se exploran los nodos de un grafo a partir de un nodo i, para construir un árbol con raíz
en i. Intuitivamente, el método BFS trata de añadir al árbol los nodos más cercanos a la raíz, mientras
que el método DFS trata de alejarse lo más que se pueda de la raíz. Cada uno de los métodos tiene sus
ventajas e inconvenientes a la hora de resolver problemas básicos sobre grafos. Nosotros, emplearemos
fundamentalmente el método BFS.
Por conveniencia, de cara a la descripción de los diferentes algoritmos, en esta sección vamos a
utilizar i, j, . . . para nombrar a los nodos, en lugar de usar vi , v j , . . ..

3.3.1. Algoritmo BFS


El algoritmo BFS (abreviatura de breadth-first search) es uno de los algoritmos más utilizados para
resolver de forma eficiente el problema de encontrar si existe un camino entre dos vértices de un grafo.
Vamos a explicar su funcionamiento en diferentes situaciones.

BFS “out”
El problema que vamos a resolver es el siguiente. Dado un grafo dirigido G = (V, A) y un nodo i de
G, determinar todos los nodos j de G que son alcanzables desde i, es decir, el conjunto de nodos j para
los que existe un camino (simple) dirigido de i a j.
En líneas generales, el método BFS funciona mediante un proceso de exploración y marcado de
nodos, que necesita un vector de marcas y una lista. Al final del proceso, el algoritmo proporciona lo que
se conoce como el árbol BFS “out” con raíz en i. El árbol está formado por todos los nodos marcados,
que van a ser todos los nodos de G alcanzables desde i. Además, si l es el número de arcos del camino
92 Capítulo 3. Introducción a la teoría de grafos

dirigido de i a j en el árbol, entonces cualquier otro camino dirigido en G de i a j contiene al menos l


arcos.
La lista, donde iremos colocando los nodos marcados, funciona como una cola (primero en entrar,
primero en salir). BFS va explorando los nodos de la lista hasta que la lista se queda vacía. Al explorar
un nodo, se marcan sus vecinos “out” no marcados todavía, y se añaden estos vecinos no marcados a la
lista.
Inicialmente, el vector de marcas marca y la lista lista están vacíos. Aunque hay varias formas de
marcado, vamos a utilizar en el algoritmo la que se describe a continuación.

Algoritmo BFS “out”


Entrada. Un grafo dirigido G y un nodo i de G.
Salida. T , el árbol BFS “out” con raíz en i.

1. Inicializar como vacíos T , el vector marca y la lista lista.


2. Hacer marca(i) = ∗ e incluir i en lista.
3. Mientras la lista lista no esté vacía, repetir lo siguiente.
Tomar el primer nodo j de la lista y recorrer su lista de vecinos “out”. Para cada vecino k de j no
marcado, elegir marca(k) = j y añadir k al final de la lista. Una vez explorados todos los vecinos
de j, borrar j de lista.
4. Para todos los nodos j marcados (excepto i), añadir el arco (marca( j), j) a T .
5. Devolver T .

Antes de ver formalmente porqué el método BFS proporciona un árbol con los caminos dirigidos
más cortos desde i hasta todos los nodos alcanzables desde i, vamos a ver un ejemplo.

2
1 Listas de vecinos “out”
Nodo Vecinos “out”
3 1 7, 8
2 1
3 1, 2, 4, 5, 9
4 3, 6
8 9 4 5 4, 6, 7
6 7
7 8
7 5 8 2, 7
9 1, 5, 7
6

Figura 3.25: Grafo de la figura 3.15. Tabla 3.8: Listas de vecinos “out”.

Ejemplo 3.5. Para el grafo dirigido de la figura 3.25, calcular los árboles BFS “out” con raíz en los
nodos 4 y 1.

Solución. Con la lista de vecinos “out” mostrada en la tabla 3.8, veamos como se iría ejecutando el
algoritmo, cuando comenzamos en el nodo 4.
Para una mejor visualización, vamos a emplear una tabla con tres columnas, como la mostrada en la
tabla 3.9a. La primera columna con los nodos, la segunda con las marcas de los nodos, y la tercera con
la lista.

1. El algoritmo comienza marcando el nodo 4 con * (va a ser la raíz del árbol) y añadiéndolo a la
lista. Véase la tabla 3.9b.
Grafos y Combinatoria. Javier Tejel 93

Nodo Marca Lista Nodo Marca Lista Nodo Marca Lista


1 1 4 1 4
2 2 2 3
3 3 3 4 6
4 4 * 4 *
5 5 5
6 6 6 4
7 7 7
8 8 8
9 9 9
(a) (b) (c)

Nodo Marca Lista Nodo Marca Lista Nodo Marca Lista


1 3 4 1 3 4 1 3 4
2 3 3 2 3 3 2 3 3
3 4 6 3 4 6 3 4 6
4 * 1 4 * 1 4 * 1
5 3 2 5 3 2 5 3 2
6 4 5 6 4 5 6 4 5
7 9 7 6 9 7 6 9
8 8 7 8 1 7
9 3 9 3 9 3 8
(d) (e) (f)

Tabla 3.9: Tablas con la ejecución del algoritmo BFS “out” comenzando en el nodo 4.

2. Se toma el primer nodo de la lista, que es el 4. Al explorar su lista de vecinos “out”, los nodos 3
y 6 están sin marcar. Se marcan dichos nodos con la marca 4 (el nodo 4 va a ser el padre de 3 y 6
en el árbol) y se añaden a la lista. Se borra el nodo 4 de la lista, pues ya se ha explorado. Véase la
tabla 3.9c.
3. Se toma el primer nodo de la lista, que es el 3. Al explorar su lista de vecinos “out”, los nodos 1,
2, 5 y 9 están sin marcar. Se marcan dichos nodos con la marca 3 (el nodo 3 va a ser el padre de 1,
2, 5 y 9 en el árbol) y se añaden a la lista. Se borra el nodo 3 de la lista, pues ya se ha explorado.
Véase la tabla 3.9d.
4. El algoritmo vuelve a tomar el primer nodo de la lista, que es el 6. Al explorar su lista de vecinos
“out”, el nodo 7 está sin marcar. Se marca dicho nodo con la marca 6 (el nodo 6 va a ser el padre
de 7 en el árbol) y se añade a la lista. Se borra el nodo 6 de la lista. Véase la tabla 3.9e.
5. Se toma el siguiente nodo de la lista, el 1. Al explorar sus vecinos “out”, el único que todavía no
está marcado es el nodo 8. Se marca el nodo 8 con la marca 1 (el nodo 1 será el padre del 8 en el
árbol) y se añade a la lista. Se borra el nodo 1 de la lista. Véase la tabla 3.9f.
6. El siguiente nodo a explorar es el 2. Como todos sus vecinos “out” están marcados, no se marca
nada nuevo, ni se añade nada a la lista. Se borra el nodo 2 de la lista y se continua la exploración.
El algoritmo seguiría explorando los siguientes nodos de la lista, el 5, el 9, ..., pero ya no haría
nada, pues todos los nodos ya están marcados. Así, hasta vaciar la lista.
7. Se forma el árbol BFS “out” tomando los arcos que conectan cada nodo marcado con su marca,
como se muestra en la figura 3.26.

En este ejemplo, todos los nodos han sido alcanzables desde el nodo 4, pues todos los nodos aparecen
en el árbol. Además, el árbol nos da los caminos dirigidos más cortos desde 4. Por ejemplo, el camino
94 Capítulo 3. Introducción a la teoría de grafos

2
1
4
3

3
6

8 9 4 1
7
2 5 9

7 5 8

Figura 3.26: Árbol BFS “out” con comienzo en el nodo 4.

dirigido que conecta al nodo 4 con el nodo 8 en el árbol es 4 → 3 → 1 → 8, que tiene longitud 3. Luego
cualquier otro camino en G que conecte al 4 con el 8 tendrá longitud al menos 3.
Aplicando el algoritmo partiendo del nodo 1, obtendríamos la tabla 3.10 y el árbol BFS “out” mos-
trado en la figura 3.27. Ahora, sólo los nodos 2, 7 y 8 son alcanzables desde el nodo 1. A los nodos 7 y 8
se llega con caminos dirigidos de longitud 1, y al nodo 2 con un camino dirigido de longitud 2.

2
Nodo Marca Lista 1
1 * 1
2 8 7 3
3 8
4 2
5
6 8 9 4
7 1
8 1
9 7 5

Tabla 3.10: Tabla BFS “out” comenzando en 6


1.
Figura 3.27: Árbol BFS “out” con comienzo en 1.

Veamos en forma de teorema por qué el algoritmo devuelve un árbol con todos los nodos que son
alcanzables desde i, y con los caminos dirigidos más cortos.
Teorema 3.8. El algoritmo BFS “out” devuelve un árbol T con todos los nodos de G que son alcanzables
desde i mediante caminos dirigidos. Además, el único camino dirigido en el árbol desde i hasta j es un
camino dirigido en G que usa el mínimo posible de arcos.
Demostración. Veamos que el subgrafo T construido por el algoritmo es un árbol. Sea k el número de
nodos marcados. Exceptuando a i, el paso 4 del algoritmo añade k − 1 arcos a T , los arcos (marca( j), j),
que por construcción son todos distintos. Como j es un nodo marcado y marca( j) es siempre otro nodo
marcado, T tiene k nodos (todos los marcados), k − 1 arcos, e i pertenece a T .
Probemos que T es conexo, es decir, para cada par de nodos marcados, existe en T un camino
no dirigido entre ellos. Para un nodo marcado cualquiera j, definamos j0 = j, j1 = marca( j0 ), j2 =
marca( j1 ), . . . , jh = marca( jh−1 ), . . ., hasta que jl sea i. Este proceso siempre termina en i, puesto que
cada nodo marcado proviene de otro nodo marcado anteriormente, y el primer nodo marcado ha si-
do i. Por tanto, usando los arcos (i, jl−1 ) = (marca( jl−1 ), jl−1 ), . . . , (marca( j1 ), j1 ), (marca( j0 ), j0 ) =
Grafos y Combinatoria. Javier Tejel 95

(marca( j), j), obtenemos un camino dirigido en T de i a j. Luego un nodo marcado siempre es alcanza-
ble desde i. Por otra parte, dados dos nodos cualesquiera j y j′ de T , la unión de los caminos dirigidos
en T desde i hasta j y desde i hasta j′ es un camino no dirigido en T que conecta a j y j′ . Por tanto, T es
conexo, y como tenía k − 1 aristas es un árbol.
Nos queda por ver que si un nodo no está marcado, entonces no es alcanzable desde i, y que, dado
un nodo j alcanzable desde i, el camino dirigido en T desde i hasta j es óptimo en el sentido de usar el
menor número posible de arcos.
Para ello, dividamos el conjunto de nodos alcanzables desde i en las clases, V0 ,V1 , . . . ,Vl , . . ., donde
un nodo j pertenece a la clase Vl , si para llegar a j desde i el camino dirigido más corto en G (con menos
arcos) usa l arcos. Así, V0 = {i}, V1 contiene los vecinos “out” de i, etc. Por la definición de las clases,
está claro que si j es un nodo de la clase Vl , en el camino más corto de i a j se ha de llegar a j a través de
un nodo j′ de la clase Vl−1 .
Veamos que, en el algoritmo, los nodos que se marcan (y se incluyen en la lista) son siempre los
de las clases V0 ,V1 , . . ., y en ese orden. Inicialmente, esto es cierto, pues el único nodo marcado es i.
Además, al explorar V0 = {i} que está en la lista, se marcan e incluyen en la lista sus vecinos “out”,
que son precisamente los nodos de la clase V1 . Luego en el siguiente paso hay que explorar los nodos
de V1 . Supongamos que en un paso genérico del algoritmo, se han explorado los nodos de las clases
V0 ,V1 , . . . ,Vl−1 y se han marcado los nodos de la clase Vl . Veamos que al explorar Vl se marcan los nodos
de Vl+1 y se añaden a la lista. Al explorar los nodos de Vl , sus vecinos sólo pueden ser de la clase Vl+1 o
de clases anteriores. Pero como los de las clases anteriores ya estarán marcados, al explorar los vecinos
de los nodos en Vl marcaremos e incluiremos en la lista exactamente los nodos de Vl+1 , como queríamos
ver. Por tanto, en el algoritmo, sólo se marcan e incluyen en la lista los nodos de los conjuntos Vl , que
son los alcanzables desde i. En consecuencia, un nodo no alcanzable desde i nunca será marcado.
Además, si al nodo j de Vl+1 le hemos puesto la marca k, es porque a k se llegaba con un camino
dirigido de l arcos, y completándolo con el arco (k, j) obtendremos un camino dirigido de i a j con l + 1
arcos, y por tanto óptimo.

BFS “in”

El problema que vamos a resolver ahora es el inverso del descrito anteriormente. Dado un grafo
dirigido G = (V, A) y un nodo i de G, determinar todos los nodos j de G que pueden alcanzar a i, es decir,
el conjunto de nodos j para los que existe un camino (simple) dirigido de j a i.
El método para resolver el problema es el mismo que el descrito para el BFS “out”. La principal
diferencia es que ahora se manejan las listas de vecinos “in”, en lugar de las listas de vecinos “out”.
Partiendo del nodo i, se marcan sus vecinos “in” y se añaden a la lista. Se exploran los vecinos “in” de i,
se marcan los vecinos “in” de esos vecinos y se añaden a la lista. Y se va repitiendo el proceso. Al final,
el algoritmo proporciona lo que se conoce como el árbol BFS “in” con raíz en i. El árbol está formado
por todos los nodos marcados, que van a ser todos los nodos de G que pueden alcanzar a i. Además, si
l es el número de arcos del camino dirigido de j a i en el árbol, entonces cualquier otro camino dirigido
en G de j a i contiene al menos l arcos.
El algoritmo BFS “in” sería el siguiente, que es prácticamente idéntico al algoritmo BFS “out”.

Algoritmo BFS “in”

Entrada. Un grafo dirigido G y un nodo i de G.


Salida. T , el árbol BFS “in” con raíz en i.

1. Inicializar como vacíos T , el vector marca y la lista lista.


2. Hacer marca(i) = ∗ e incluir i en lista.
3. Mientras la lista lista no esté vacía, repetir lo siguiente.
96 Capítulo 3. Introducción a la teoría de grafos

Tomar el primer nodo j de la lista y recorrer su lista de vecinos “in”. Para cada vecino k de j no
marcado, elegir marca(k) = j y añadir k al final de la lista. Una vez explorados todos los vecinos
de j, borrar j de lista.
4. Para todos los nodos j marcados (excepto i), añadir el arco ( j, marca( j)) a T .
5. Devolver T .
La demostración de que la salida del algoritmo es el árbol de caminos más cortos hasta i es análoga
a la dada en el Teorema 3.8.
Ejemplo 3.6. Para el grafo dirigido de la figura 3.25, cuyas listas de vecinos “in” figuran a continuación,
encontrar el árbol BFS “in” con raíz en el nodo 4.
Listas de vecinos “in”
Nodo Vecinos “in”
1 2, 3, 9
2 3, 8
3 4
4 3, 5
5 3, 9
6 4, 5
7 1, 5, 6, 8, 9
8 1, 7
9 3

Solución. Veamos como se iría ejecutando el algoritmo cuando comenzamos en el nodo 4.

Nodo Marca Lista Nodo Marca Lista Nodo Marca Lista


1 4 1 4 1 4
2 2 3 2 3
3 3 4 5 3 4 5
4 * 4 * 4 *
5 5 4 5 4
6 6 6
7 7 7
8 8 8
9 9 9
(a) (b) (c)

Nodo Marca Lista Nodo Marca Lista


1 4 1 4
2 3 2 3
3 4 5 3 4 5
4 * 9 4 * 9
5 4 5 4
6 6
7 7
8 8
9 5 9 5
(d) (e)

Tabla 3.11: Tablas con la ejecución del algoritmo BFS “in” comenzando en el nodo 4.
Grafos y Combinatoria. Javier Tejel 97

El algoritmo comienza marcando el nodo 4 con *, y añadiéndolo a la lista. Véase la tabla 3.11a. Se
toma el primer nodo de la lista, que es el 4. Al explorar su lista de vecinos “in”, los nodos 3 y 5 están sin
marcar. Se marcan dichos nodos con la marca 4 y se añaden a la lista. Se borra el nodo 4 de la lista, pues
ya se ha explorado. Véase la tabla 3.11b. Se toma el siguiente nodo de la lista, que es el 3. Al explorar
su lista de vecinos “in”, su único vecino, el nodo 4, ya está marcado. Borramos el nodo 3 de la lista y
continuamos con el siguiente, el nodo 5. Véase la tabla 3.11c. El único vecino “in” del 5 no marcado es
el nodo 9. Se marca con 5, se añade a la lista, y se borra el 5 de la lista. Véase la tabla 3.11d. Al explorar
los vecinos “in” del nodo 9, el nodo que queda en la lista, su único vecino, el nodo 3, ya está marcado.
Al borrar el nodo 9 de la lista, el algoritmo termina, pues ya no quedan nodos en la lista que explorar.
Véase la tabla 3.11e.
El árbol BFS “in” obtenido se muestra en la figura 3.28. Al nodo 4 sólo se puede llegar desde los
nodos 3, 5 y 9. Desde 3 y 5 con caminos dirigidos de longitud 1, y desde 9 con un camino dirigido de
longitud 2.

2
1

3
4

3
8 9 4 5

9
7 5

Figura 3.28: Árbol BFS “in” con raíz en el nodo 4.

BFS “out + in”


El problema que resolveremos ahora es el de encontrar caminos no dirigidos entre nodos. Dado un
grafo dirigido G = (V, A) y un nodo i de G, queremos determinar todos los nodos j de G tales que existe
un camino no dirigido que conecta i y j.
El método es como los anteriores, pero ahora se manejan a la vez las dos listas de vecinos, la “out” y
la “in”, ya que podemos usar los arcos tanto hacia adelante como hacia atrás para encontrar caminos no
dirigidos. Partiendo de i, se marcan sus vecinos “out” y sus vecinos “in”, y se añaden a la lista. La marca
que le pondremos a los vecinos “in” será −i. El menos representa que estamos usando un arco hacia
atrás. Luego se van explorando los nodos de la lista, y para cada uno de ellos se marcan los vecinos “out”
e “in” no marcados (añadiendo un menos a la marca de un vecino “in”), y se añaden a la lista. Repitiendo
el proceso, el algoritmo proporciona al final el árbol de caminos no dirigidos más cortos, con raíz en i.
El algoritmo BFS “out + in” sería el siguiente. La demostración de que la salida es el árbol de caminos
no dirigidos más cortos desde i es similar a la del Teorema 3.8 y la omitimos.

Algoritmo BFS “out + in”


Entrada. Un grafo dirigido G y un nodo i de G.
Salida. T , el árbol BFS “out + in” de caminos no dirigidos más cortos con raíz en i.

1. Inicializar como vacíos T , el vector marca y la lista lista.


2. Hacer marca(i) = ∗ e incluir i en lista.
98 Capítulo 3. Introducción a la teoría de grafos

3. Mientras la lista lista no esté vacía, repetir lo siguiente.


Tomar el primer nodo j de la lista. Para cada vecino “out” k de j no marcado, elegir marca(k) = j
y añadir k al final de la lista. Para cada vecino “in” k de j no marcado, elegir marca(k) = − j y
añadir k al final de la lista. Explorados todos los vecinos de j, borrar j de lista.
4. Para todos los nodos j marcados (excepto i), añadir a T el arco (marca( j), j) si marca( j) es
positiva, o el arco ( j, −marca( j)), si marca( j) es negativa.
5. Devolver T .

Listas de vecinos “out” e “in”


Nodo Vecinos “out” Vecinos “in”
1 7, 8 2, 3, 9
2 1 3, 8
3 1, 2, 4, 5, 9 4
4 3, 6 3, 5
5 4, 6, 7 3, 9
6 7 4, 5
7 8 1, 5, 6, 8, 9
8 2, 7 1, 7
9 1, 5, 7 3

Tabla 3.12: Vecinos “out” e “in” para el grafo de la figura 3.25.

Ejemplo 3.7. Para el grafo dirigido de la figura 3.25, encontrar el árbol de caminos dirigidos más cortos
con raíz en el nodo 6. Las listas de vecinos “out” e “in” se encuentran en la tabla 3.12.

Solución. Con estas listas de vecinos “out” e “in”, veamos como se iría ejecutando el algoritmo, cuando
comenzamos en el nodo 6.
El algoritmo comienza marcando el nodo 6 con *, y añadiéndolo a la lista. Véase la tabla 3.13a. Se
toma el primer nodo de la lista, que es el 6. Al explorar su lista de vecinos “out”, el nodo 7 es su único
vecino. Se marca con la marca 6 y se pasa a la lista. Ahora exploramos los vecinos “in” del nodo 6, que
son los nodos 4 y 5. Como no están marcados, los marcamos con -6 (para indicar que usaremos arcos
hacia atrás), y los pasamos a la lista. Una vez explorado el nodo 6, lo borramos de la lista (véase la tabla
3.13b). Se toma el siguiente nodo de la lista, que es el 7. Como vecino “out” tiene al nodo 8, que no está
marcado. Lo marcamos con la marca 7 y lo pasamos a la lista. Como vecinos “in”, el nodo 7 tiene los
nodos 1, 5, 6, 8 y 9, de los cuales no están marcados el 1 y el 9. Marcamos estos dos nodos con -7, los
añadimos a la lista, y borramos al nodo 7 de la lista. Véase la tabla 3.13c. El siguiente nodo de la lista
es el nodo 4. Su único vecino no marcado es el 3, que lo podríamos elegir como vecino “out” o “in”. Lo
elegimos como vecino “out”, lo marcamos con 4, lo añadimos a la lista y borramos el nodo 4 de la lista.
Véase la tabla 3.13d. Al explorar el nodo 5, el siguiente de la lista, todos sus vecinos “out” e “in” están
marcados, por lo que borramos al nodo 5 de la lista (véase la tabla 3.13e) y pasamos al siguiente, el nodo
8. Al explorar los vecinos “out” del nodo 8, el nodo 2 está sin marcar, y es el único nodo que nos quedaba
sin marcar. Lo marcamos con el 8, lo añadimos a la lista, y borramos el nodo 8 de la lista. Véase la tabla
3.13f. Como ya están todos los nodos marcados, el algoritmo finalizaría explorando el resto de los nodos
de la lista, pero sin marcar nada más.
El árbol obtenido se muestra en la figura 3.29. Por ejemplo, del nodo 6 se va a los nodos 4 y 5 con
arcos hacia atrás. Para ir del nodo 6 al 2, se necesita un camino no dirigido de longitud 3, usando tres
arcos hacia adelante. Al nodo 1, podemos llegar desde el 6 con un camino no dirigido de longitud 2,
usando el arco (6, 7) hacia adelante y el arco (1, 7) hacia atrás. Pero no existe camino dirigido del nodo
1 al nodo 6, y el camino dirigido más corto desde el 6 al 1 tiene longitud 4, el camino (6, 7, 8, 2, 1).
Grafos y Combinatoria. Javier Tejel 99

Nodo Marca Lista Nodo Marca Lista Nodo Marca Lista


1 6 1 6 1 -7 6
2 2 7 2 7
3 3 4 3 4
4 4 -6 5 4 -6 5
5 5 -6 5 -6 8
6 * 6 * 6 * 1
7 7 6 7 6 9
8 8 8 7
9 9 9 -7
(a) (b) (c)

Nodo Marca Lista Nodo Marca Lista Nodo Marca Lista


1 -7 6 1 -7 6 1 -7 6
2 7 2 7 2 8 7
3 4 4 3 4 4 3 4 4
4 -6 5 4 -6 5 4 -6 5
5 -6 8 5 -6 8 5 -6 8
6 * 1 6 * 1 6 * 1
7 6 9 7 6 9 7 6 9
8 7 3 8 7 3 8 7 3
9 -7 9 -7 9 -7 2
(d) (e) (f)

Tabla 3.13: Tablas con la ejecución del algoritmo BFS “out + in” comenzando en el nodo 6.

v2
v1
v6
v3

v4 v7
v5

v8 v9 v4
v3 v8
v9 v1

v7 v5 v2

v6

Figura 3.29: Árbol BFS “out + in” con raíz en el nodo 6.

BFS para grafos no dirigidos

Si el grafo de partida es no dirigido, el método BFS va a permitir encontrar todos los vértices j para
los que existe un camino que los une a un vértice i dado. Como el grafo es no dirigido, el algoritmo se
aplica sobre las listas de vecinos. El resultado es el árbol BFS con raíz en i, que va a contener caminos
más cortos desde i a todos los demás vértices j a los que se puede llegar desde i.
El algoritmo sería el siguiente. La demostración de que la salida es el árbol de caminos más cortos
con raíz en i es similar a la dada en el Teorema 3.8.
100 Capítulo 3. Introducción a la teoría de grafos

Algoritmo BFS para un grafo no dirigido

Entrada. Un grafo no dirigido G y un vértice i de G.


Salida. T , el árbol BFS de caminos más cortos con raíz en i.

1. Inicializar como vacíos T , el vector marca y la lista lista.


2. Hacer marca(i) = ∗ e incluir i en lista.
3. Mientras la lista lista no esté vacía, repetir lo siguiente.
Tomar el primer nodo j de la lista. Para cada vecino k de j no marcado, elegir marca(k) = j y
añadir k al final de la lista. Explorados todos los vecinos de j, se borra de lista.
4. Para todos los nodos j marcados (excepto i), añadir a T la arista (marca( j), j).
5. Devolver T .

La salida del algoritmo es un árbol con el conjunto de vértices j a los que se puede llegar desde i
mediante caminos. Por tanto, el conjunto de vértices del árbol definen la componente conexa asociada al
vértice i. Si esa componente contiene a todos los vértices del grafo de partida G, entonces G es conexo.
En otro caso, el grafo no es conexo. Si el grafo no es conexo, partiendo de un vértice i′ que no esté en la
componente conexa de i, podremos calcular la componente conexa asociada a i′ . Repitiendo el proceso,
podremos calcular todas las componentes conexas de G.

Listas de vecinos
1
Vértice Vecinos
2 1 4, 6, 7
11
2 5, 8, 11
3
3 9, 10
10 4 1, 6
4 5 2, 8, 11
9 6 1, 4, 7
5
7 1, 6
8 2, 5
8
6 9 3
7
10 3
Figura 3.30: Grafo no dirigido. 11 2, 5

Tabla 3.14: Listas de vecinos.

Ejemplo 3.8. Calcular las componente conexas del grafo mostrado en la figura 3.30.

Solución. Para encontrar la componente conexa asociada al vértice 1, aplicamos BFS desde ese vértice,
usando las listas de vecinos de la tabla 3.14.
Marcamos el vértice 1 con * y lo pasamos a la lista (ver la tabla 3.15a). Los vecinos del vértice 1 son
el 4, el 6 y el 7. Los marcamos con la marca 1 y los añadimos a la lista (ver la tabla 3.15b). Exploramos
el siguiente vértice de la lista, que es el 4, después de borrar el 1 de la lista. Como sus vecinos son el 1
y el 6, que ya están marcados, lo borramos de la lista (ver la tabla 3.15c) y pasamos al siguiente vértice,
que es el 6. Como sus vecinos, los vértices 1, 4 y 7, ya están marcados, borramos el vértice 6 de la lista
(ver la tabla 3.15d) y pasamos al que queda en la lista, el vértice 7. A este vértice le vuelve a suceder
lo mismo, sus vecinos, el 1 y el 6, ya están marcados, por lo que lo podemos borrar de la lista (ver la
tabla 3.15e). Después de borrar el vértice 7, la lista está vacía. Por tanto, la componente conexa C1 que
contiene al vértice 1, está compuesta por los vértices C1 = {1, 4, 6, 7}.
Grafos y Combinatoria. Javier Tejel 101

Nodo Marca Lista Nodo Marca Lista Nodo Marca Lista


1 * 1 1 * 1 1 * 1
2 2 4 2 4
3 3 6 3 6
4 4 1 7 4 1 7
5 5 5
6 6 1 6 1
7 7 1 7 1
8 8 8
9 9 9
10 10 10
11 11 11
(a) (b) (c)

Nodo Marca Lista Nodo Marca Lista


1 * 1 1 * 1
2 4 2 4
3 6 3 6
4 1 7 4 1 7
5 5
6 1 6 1
7 1 7 1
8 8
9 9
10 10
11 11
(d) (e)

Tabla 3.15: Tablas con la ejecución del algoritmo BFS desde el vértice 1.

Nodo Marca Lista Nodo Marca Lista


1 2 1 3
2 * 5 2 9
3 8 3 * 10


4 11

 4
5 2 5
6 6
7 7
8 2 8
9 9 3
10 10
11 2 11
(a) (b)

Tabla 3.16: Tablas BFS comenzando en 2 y 3.

Realizando el mismo proceso comenzando en los vértices 2 y 3, comprobaríamos que las compo-
nentes conexas asociadas a esos vértices son C2 = {2, 5, 8, 11} y C3 = {3, 9, 10}, respectivamente. Las
tablas 3.16a y 3.16b muestran cómo quedaría la aplicación del método BFS comenzando en el vértice 2
102 Capítulo 3. Introducción a la teoría de grafos

y en el vértice 3, respectivamente. C1 ,C2 y C3 son las tres componente conexas de nuestro grafo, como
ya habíamos visto en la figura 3.11.

Nota 3.6. Como ya hemos comentado anteriormente, un grafo no dirigido G se puede transformar en
uno dirigido G′ sin más que sustituir cada arista (vi , v j ) por los arcos dirigidos (vi , v j ) y (v j , vi ). De esa
manera, hubiésemos podido aplicar directamente el algoritmo BFS “out” sobre G′ para comprobar la
conectividad de G, o para calcular las componentes conexas de G.

Nota 3.7. La complejidad algorítmica del método BFS es O(n + m), donde n es el número de nodos del
grafo y m el número de arcos.

3.3.2. Algoritmo DFS

Un método alternativo al BFS para el cálculo de caminos entre vértices, es el conocido como método
DFS (abreviatura de depth-first search). El método DFS es similar al BFS, donde se marcan nodos, se
añaden los nodos marcados a una lista, y se explora la lista. La principal diferencia está el manejo de
la lista. Mientras que en el método BFS, el primero que entra en la lista es el primero que se explora,
en el método DFS el último que entra en la lista es el primero que se explora. Además, cuando se están
explorando los vecinos de un nodo, en cuanto se encuentra un nodo no marcado, se marca, se añade a
la lista, y se continua la exploración con el nuevo nodo marcado. Mientras que en el método BFS se
está siempre lo más cerca posible del comienzo, en el método DFS se trata de alejarse del comienzo,
profundizando en el grafo.
Dado un grafo dirigido y un nodo i, el algoritmo DFS “out” calcula los nodos j que son alcanzables
desde i.

Algoritmo DFS “out”

Entrada. Un grafo dirigido G y un nodo i de G.


Salida. T , el árbol DFS “out” con raíz en i.

1. Inicializar como vacíos T , el vector marca y la lista lista.


2. Hacer marca(i) = ∗ e incluir i en lista.
3. Mientras la lista lista no esté vacía, repetir lo siguiente.
Tomar el último nodo j de la lista y recorrer su lista de vecinos “out”. En cuanto se encuentre un
vecino “out” k de j no marcado, elegir marca(k) = j, y añadir k al final de la lista. Si todos los
vecinos “out” de j están marcados, borrar j de la lista.
4. Para todos los nodos j marcados (excepto i), añadir el arco (marca( j), j) a T .
5. Devolver T .

La demostración de que la salida del algoritmo DFS “out” es un árbol que contiene a todos los nodos
j alcanzables desde i es similar a la demostración del Teorema 3.8, y la omitimos.
Vamos a ver cómo funcionaría el método DFS en el caso del grafo dirigido mostrado en la figura
3.31, para el que ya calculamos en el ejemplo 3.5 su árbol BFS “out” con comienzo en el nodo 4.

Ejemplo 3.9. Para el grafo de la figura 3.31, calcular el árbol DFS “out” con comienzo en el nodo 4.
Grafos y Combinatoria. Javier Tejel 103

2
1 Listas de vecinos “out”
Nodo Vecinos “out”
3 1 7, 8
2 1
3 1, 2, 4, 5, 9
4 3, 6
8 9 4 5 4, 6, 7
6 7
7 8
7 5 8 2, 7
9 1, 5, 7
6

Figura 3.31: Grafo del ejemplo 3.5 Tabla 3.17: Lista de vecinos “out”.

Solución. Como en el método BFS, vamos a utilizar una tabla con tres columnas, nodo (N.), marca (M.)
y lista (L.), para ir guardando la información del algoritmo (ver la tabla 3.18a).
Comenzamos marcando el nodo 4 y añadiéndolo a la lista (ver la tabla 3.18a). El primero de sus
vecinos “out” no marcado es el 3. Le ponemos la marca 4 y lo pasamos a la lista (ver la tabla 3.18b).
Aunque el nodo 4 tiene todavía vecinos “out” sin marcar, lo dejamos en la lista y seguimos la exploración
con el último nodo añadido, que es el 3. El primer vecino “out” no marcado del nodo 3 es el 1. Lo
marcamos con la marca 3 y lo añadimos a la lista (ver la tabla 3.18c). De nuevo, aunque el nodo 3 tiene
más vecinos “out” no marcados, no seguimos la exploración con él, si no con el último nodo añadido,
que es el 1. El primer nodo “out” no marcado del nodo 1 es el 7, que lo marcamos y lo pasamos a la
lista (ver la tabla 3.18d). Toca explorar el nodo 7, que tiene como vecino “out” el nodo 8. Como no está
marcado, lo marcamos con la marca 7 y lo añadimos a la lista (ver la tabla 3.18e). Al explorar el nodo 8,
tiene un vecino “out” no marcado, que es el 2. Lo marcamos con 8 y lo añadimos a la lista (ver la tabla
3.18f).
Al explorar el nodo 2, el nuevo nodo activo, su único vecino “out” ya está marcado, por lo que
borramos al nodo 2 de la lista (ver la tabla 3.18g). Al borrar el nodo 2, continuamos la exploración con
el nodo 8, que es último que se encuentra en la lista. Todos sus vecinos “out” están marcados, con lo
que lo borramos de la lista (ver la tabla 3.18h). El nuevo nodo activo es el 7, que también tiene su único
vecino “out” marcado. Lo borramos de la lista (ver la tabla 3.18i) y pasamos al último nodo activo de la
lista, que es el 1. Al nodo 1 le vuelve a suceder lo mismo, y tiene todos sus vecinos “out” marcados. Lo
borramos de la lista (ver la tabla 3.18j) y seguimos la exploración con el nodo 3.
El nodo 5 es el primer vecino “out” del nodo 3 que no está marcado. Lo marcamos con el 3 y lo
añadimos a la lista (ver la tabla 3.18k). Como el nodo 5 ha sido el último nodo añadido a la lista, nos
toca seguir la exploración con él. Tiene un nodo “out” no marcado, el 6, por lo que lo marcamos con 5
y lo añadimos a la lista (ver la tabla 3.18l). Al explorar el nodo 6, su único vecino “out”, el 7, ya está
marcado. Borramos el nodo 6 de la lista y pasamos a explorar el 5 (ver la tabla 3.18m). Al explorar el
nodo 5, ya tiene todos sus vecinos “out” marcados, por lo que lo borramos de la lista (ver la tabla 3.18n).
Nos vuelve a tocar explorar el nodo 3, que tiene un vecino “out” no marcado, el nodo 9. Lo marcamos
con 3 y lo añadimos a la lista (ver la tabla 3.18ñ).
La exploración continuaría con el nodo 9, luego con el nodo 3, y por último con el 4, pero el algoritmo
ya no marcaría nada, pues todos los nodos están ya marcados. La figura 3.32a muestra el árbol DFS
obtenido comenzando en 4.

Hay que resaltar que el árbol BFS y el árbol DFS no tienen por qué coincidir. Por ejemplo, la figura
3.32b muestra el árbol BFS con comienzo en 4, que ya obtuvimos en el ejemplo 3.5, que es distinto al
árbol DFS obtenido ahora con comienzo en 4. El árbol BFS nos dice que hay un camino dirigido desde
el nodo 4 al nodo 2 de longitud 2, y es lo óptimo, pues no hay un camino más corto en el grafo desde el
104 Capítulo 3. Introducción a la teoría de grafos

nodo 4 al nodo 2. Por contra, el árbol DFS también ha encontrado un camino dirigido del nodo 4 al 2,
pero de longitud 5.

N. M. L. N. M. L. N. M. L. N. M. L. N. M. L.
1 4 1 4 1 3 4 1 3 4 1 3 4
2 2 3 2 3 2 3 2 3
3 3 4 3 4 1 3 4 1 3 4 1
4 * 4 * 4 * 4 * 7 4 * 7
5 5 5 5 5 8
6 6 6 6 6
7 7 7 7 1 7 1
8 8 8 8 8 7
9 9 9 9 9
(a) (b) (c) (d) (e)

N. M. L. N. M. L. N. M. L. N. M. L. N. M. L.
1 3 4 1 3 4 1 3 4 1 3 4 1 3 4
2 8 3 2 8 3 2 8 3 2 8 3 2 8 3
3 4 1 3 4 1 3 4 1 3 4 1 3 4 1
4 * 7 4 * 7 4 * 7 4 * 7 4 * 7
5 8 5 8 5 8 5 8 5 8
6 2 6 2 6 2 6 2 6 2
7 1 7 1 7 1 7 1 7 1
8 7 8 7 8 7 8 7 8 7
9 9 9 9 9
(f) (g) (h) (i) (j)

N. M. L. N. M. L. N. M. L. N. M. L. N. M. L.
1 3 4 1 3 4 1 3 4 1 3 4 1 3 4
2 8 3 2 8 3 2 8 3 2 8 3 2 8 3
3 4 1 3 4 1 3 4 1 3 4 1 3 4 1
4 * 7 4 * 7 4 * 7 4 * 7 4 * 7
5 3 8 5 3 8 5 3 8 5 3 8 5 3 8
6 2 6 5 2 6 5 2 6 5 2 6 5 2
7 1 5 7 1 5 7 1 5 7 1 5 7 1 5
8 7 8 7 6 8 7 6 8 7 6 8 7 6
9 9 9 9 9 3 9
(k) (l) (m) (n) (ñ)

Tabla 3.18: Tablas con la ejecución del algoritmo DFS “out”.

Mientras que el árbol BFS tiene la propiedad de que calcula los caminos dirigidos más cortos, el
DFS sólo muestra caminos desde la raíz al resto de los nodos. Sin embargo, aunque no lo vamos a ver, el
método DFS tiene otras propiedades interesantes que no tiene el árbol BFS.

Nota 3.8. Aunque no vamos a entrar en los detalles, el método DFS “out” se puede adaptar fácilmente
si se desea calcular los nodos j que pueden alcanzar al nodo dado i, o si se desea calcular los nodos j
alcanzables con caminos no dirigidos desde i. No hay más que cambiar los vecinos “out” por los vecinos
“in” en el algoritmo, o procesar a la vez los vecinos “out” e “in”. También se puede adaptar el algoritmo
al caso de un grafo no dirigido, explorando las listas de vecinos.
Grafos y Combinatoria. Javier Tejel 105

v2 2
v1 1

v3 3

v8 v9 v4 8 9 4

v7 v5 7 5

v6 6
(a) (b)

Figura 3.32: Árboles DFS (izquierda) y BFS (derecha) comenzando en el nodo 4.

3.3.3. Componentes fuertemente conexas. Bases y antibases


En la sección 3.3.1, vimos cómo emplear BFS para encontrar las componentes conexas de un grafo
no dirigido. En esta sección, vamos a ver cómo utilizar dicho método para calcular las componentes
fuertemente conexas de un grafo dirigido.
Dado un grafo dirigido G = (V, A), recordad que una componente fuertemente conexa G′ es un sub-
grafo maximal de G, tal que para dos nodos cualesquiera u y v de G′ existe un camino dirigido de u a v
y otro de v a u. La observación clave para calcular la componente fuertemente conexa G j asociada a un
nodo j, y que se demuestra a continuación, es que el conjunto de nodos de G j coincide con el conjunto
de nodos en la intersección de los árboles BFS “out” e “in” con raíz en j.

Teorema 3.9. Sea G = (V, A) un grafo dirigido. Dado un nodo j, sean V (To ) y V (Ti ) los nodos de los
árboles BFS “out” (To ) y BFS “in” (Ti ) con raíz en j, respectivamente. Sea G j = (V j , A j ) la componente
fuertemente conexa que contiene al nodo j. Entonces, V j = V (To ) ∩V (Ti ), es decir, V j es el conjunto de
nodos comunes a los dos árboles BFS.

Demostración. Supongamos primero que V j = { j}, es decir, sólo el nodo j forma parte de la componente
fuertemente conexa asociada a j. Para cualquier otro nodo k, como k ∈ / G j , no pueden existir a la vez un
camino dirigido de j a k, y otro de k a j, por lo que k ∈ / V (To ) ∩ V (Ti ). En consecuencia, V (To ) ∩ V (Ti )
sólo contiene al nodo j. En lo que sigue, podemos suponer que |V j | ≥ 2.
Veamos primero que V j ⊆ V (To ) ∩V (Ti ). Sea k un nodo de V j . Por definición de componente fuerte-
mente conexa, existe un camino dirigido de j a k, con lo que k ∈ V (To ), y otro camino dirigido de k a j,
con lo que k ∈ V (Ti ). Luego k ∈ V (To ) ∩V (Ti ), por lo que V j ⊆ V (To ) ∩V (Ti ). Esto implica que también
|V (To ) ∩V (Ti )| ≥ 2.
Veamos ahora que V (To ) ∩V (Ti ) ⊆ V j . Sea k un nodo en V (To ) ∩V (Ti ). Como k pertenece a Ti , existe
en Ti un camino dirigido P1 de k a j. Supongamos que existe un nodo k′ en P1 . Entonces necesariamente
k′ ∈ Ti , pues existe camino dirigido de k′ a j. Sea P′ el camino dirigido en Ti desde k hasta k′ , y sea P2 el
camino dirigido desde j hasta k en To . Si k′ está en P2 , entonces k′ ∈ To , y si no lo está, entonces la unión
de P2 y P′ es un camino dirigido de j a k′ . En cualquier caso, k′ ∈ To . En consecuencia, todos los nodos
en el camino P1 están en V (To ) ∩V (Ti ). Usando el mismo tipo de argumento, para cualquier nodo k′ que
se encuentre en el camino P2 , el camino dirigido desde j hasta k en To , se tiene que k′ ∈ V (To ) ∩V (Ti ).
Sean ahora k1 y k2 dos nodos en V (To ) ∩ V (Ti ). Como existe camino dirigido de k1 a j en Ti , y
camino dirigido de j a k2 en To , existe un camino dirigido de k1 a k2 . Además, por el razonamiento
anterior, todos los nodos de ese camino que une a k1 con k2 tienen que estar en V (To ) ∩ V (Ti ). Por la
misma razón, existe un camino dirigido de k2 a k1 , usando sólo vértices en V (To ) ∩ V (Ti ). Esto implica
106 Capítulo 3. Introducción a la teoría de grafos

que todos los nodos en V (To ) ∩V (Ti ) (que incluye a j), deben estar en la misma componente fuertemente
conexa, que necesariamente ha ser G j . Por tanto, V (To ) ∩V (Ti ) ⊆ V j .
En definitiva, V j = V (To ) ∩V (Ti ), como queríamos demostrar.

El teorema da entonces un método para calcular las componentes fuertemente conexas de un grafo
dirigido. Se toma un nodo j, se construyen los árboles BFS “out” y BFS “in” comenzando en j, y se
toman los nodos comunes a los dos árboles. Dichos nodos definirán la componente fuertemente conexa
G j asociada al nodo j. Si hay algún nodo j′ del grafo dirigido que no está en G j , se repite el proceso
para calcular la componente fuertemente conexa asociada a j′ . Y se va repitiendo la misma operación
mientras queden nodos del grafo sin incluir en componentes fuertemente conexas.
Resumiendo, el algoritmo para calcular las componentes fuertemente conexas de un grafo dirigido
sería el siguiente.

Algoritmo para calcular componentes fuertemente conexas


Entrada. Un grafo dirigido G.
Salida. El conjunto de componentes fuertemente conexas de G.

1. Inicializar C como vacío (conjunto de componentes fuertemente conexas).


2. Inicializar i a 1.
3. Mientras haya nodos de G no incluidos en C, repetir lo siguiente.
Tomar un nodo j que no esté en C. Construir To , el árbol BFS “out” comenzando en j. Construir
Ti , el árbol BFS “in” comenzando en j. Incluir en C(i) todos los nodos comunes a To y Ti . Hacer
C = C ∪C(i). Hacer i = i + 1.
4. Devolver C(1),C(2), . . ., el conjunto de componentes fuertemente conexas.

2
1 Listas de vecinos “out” e “in”
Nodo Vecinos “out” Vecinos “in”
3 1 7, 8 2, 3, 9
2 1 3, 8
3 1, 2, 4, 5, 9 4
4 3, 6 3, 5
8 9 4 5 4, 6, 7 3, 9
6 7 4, 5
7 8 1, 5, 6, 8, 9
7 5 8 2, 7 1, 7
9 1, 5, 7 3
6

Figura 3.33: Grafo de la figura 3.15. Tabla 3.19: Listas de vecinos “out” e “in”.

Para el grafo dirigido de la figura 3.33, ya vimos que las componentes fuertemente conexas (ver la
figura 3.18b) eran C1 = {1, 2, 7, 8}, C2 = {3, 4, 5, 9} y C3 = {6}. Veamos en el siguiente ejemplo cómo
calcularlas.

Ejemplo 3.10. Para el grafo de la figura 3.33, calcular las componentes fuertemente conexas.

Solución. Tomamos por ejemplo el nodo 1. Para calcular su componente fuertemente conexa, realizamos
BFS “out” comenzando en 1, y BFS “in” comenzando en 1. Las tablas 3.20a y 3.20b muestran los
resultados obtenidos. Los modos marcados en las dos tablas son el 1, el 2, el 7 y el 8, que están resaltados
en rojo. Esos cuatro vértices son los nodos comunes en los árboles BFS “out” e “in” comenzando en 1,
Grafos y Combinatoria. Javier Tejel 107

por lo que la componente fuertemente conexa asociada el nodo 1 va a estar formada por esos cuatro
nodos.
Tomamos ahora otro nodo que no esté en esa componente, por ejemplo el 3, y repetimos el proceso.
Las tablas 3.20c y 3.20d muestran los resultados obtenidos tras la aplicación del BFS “out” y del BFS
“in”, comenzando en el nodo 3. Los modos marcados ahora en las dos tablas son el 3, el 4, el 5 y el 9.
Esos cuatro vértices son los nodos comunes en los árboles BFS “out” e “in” comenzando en 3, por lo
que la componente fuertemente conexa asociada el nodo 3 va a estar formada por esos cuatro nodos.
Al tomar el único nodo no incluido todavía en ninguna componente fuertemente conexa, el nodo 6, y
realizar BFS “out” e “in” comenzando en ese nodo (ver las tablas 3.20e y 3.20f), el único nodo marcado
que es común en las dos tablas es el 6. Por tanto, el nodo 6 define la tercera componente fuertemente
conexa de nuestro grafo.

“out” en 1 “in” en 1 “out” en 3 “in” en 3 “out” en 6 “in” en 6


N. M. L. N. M. L. N. M. L. N. M. L. N. M. L. N. M. L.
1 * 1 1 * 1 1 3 3 1 3 1 2 6 1 6
2 8 7 2 1 2 2 3 1 2 4 2 8 7 2 4
3 8 3 1 3 3 * 2 3 * 5 3 8 3 4 5
4 2 4 3 9 4 3 4 4 3 9 4 2 4 6 3
5 5 4 8 5 3 5 5 4 5 1 5 6 9
6 6 7 4 6 4 9 6 6 * 6 *
7 1 7 8 7 7 1 7 7 7 6 7
8 1 8 2 5 8 1 8 8 8 7 8
9 9 1 6 9 3 6 9 5 9 9 5
(a) (b) (c) (d) (e) (f)

Tabla 3.20: BFS “out” e “in” comenzando en los nodos 1, 3 y 6.

A partir de las componentes fuertemente conexas de un grafo dirigido G, se puede definir un grafo,
conocido como el grafo de componentes de G.

Definición 3.30. Sean C1 , . . . ,Ck las componentes fuertemente conexas de un grafo dirigido G = (V, A).
El grafo de componentes de G es un grafo C(G), que tiene como nodos a C1 , . . . ,Ck , y donde existe arco
(Ci ,C j ), si y sólo si, existe un arco en G desde un nodo de Ci a un nodo de C j .

Hay que resaltar que el grafo de componentes es un DAG. Si existiese un ciclo (Ci1 ,Ci2 , . . . ,Ci j ) en
C(G), entonces la unión de Ci1 ,Ci2 , . . . ,Ci j definiría una componente fuertemente conexa, pues desde
cualquier nodo de esas componentes se podría pasar a cualquier otro nodo mediante un camino dirigido,
contradiciendo la maximalidad de las componentes fuertemente conexas Ci1 ,Ci2 , . . . ,Ci j .
Una de las aplicaciones del cálculo del grafo de componentes está relacionada con los conceptos de
base y antibase, que definimos a continuación.

Definición 3.31. Dado un grafo dirigido G = (V, A), una base es un subconjunto minimal B ⊂ V de
nodos tal que, para cualquier nodo j ̸∈ B, existe un i ∈ B de forma que hay un camino dirigido desde i
hasta j. Una antibase es un subconjunto minimal B′ ⊂ V de nodos tal que, para cualquier nodo j ̸∈ B′ ,
existe un i ∈ B′ de forma que hay un camino dirigido desde j hasta i.

El hecho de que las bases y antibases sean minimales implica que no hay otros subconjuntos con
menos nodos verificando esas propiedades sobre la existencia de caminos dirigidos. Además, observar
que no puede existir un camino dirigido entre dos nodos de una base, o de una antibase, puesto que
entonces uno de los nodos se podría eliminar de la base, o antibase, contradiciendo la minimalidad de
esos conjuntos.
108 Capítulo 3. Introducción a la teoría de grafos

El cálculo de bases y antibases es interesante en algunas aplicaciones prácticas. Por ejemplo, mirando
G como una red donde se transmite información de un nodo a otro, una base es un conjunto minimal de
nodos donde puedo colocar una información, de forma que esa información irá llegando al resto de los
nodos, pues existen caminos dirigidos desde los nodos de la base a todos los demás.
El cálculo de una base de G se basa en las siguientes observaciones.

1. Si G es un grafo fuertemente conexo, cualquier conjunto de un sólo nodo es una base.


2. Si G es un DAG, la única base es la formada por todos los nodos tales que su grado “in” es cero,
es decir, los nodos a los que no llega ningún arco.
3. El grafo de componentes de un grafo dirigido G es un DAG.

De las tres observaciones, la segunda es la que requiere un poco de explicación. Si tenemos un DAG
y tomamos un nodo j con algún vecino “in”, podemos pasar a ese vecino “in“ j′ mediante un arco hacia
atrás, y de j′ a otro vecino “in” de j′ , y así sucesivamente, hasta llegar a un nodo sin vecinos “in”.
Luego para cualquier nodo j con vecinos “in”, siempre existe un camino de un nodo sin vecinos “in” a
j. Además, cualquier nodo k sin vecinos “in” tiene que pertenecer a la base, pues en otro caso no habría
camino dirigido que llegase a k. Por tanto, la base de un DAG está compuesta por todos los nodos cuyo
grado “in” es cero.
Por otra parte, recordad que un DAG siempre tiene algún nodo sin vecinos “out”, y algún nodo
sin vecinos “in”, como ya vimos en la sección 3.2.3. El algoritmo para el cálculo de una base sería el
siguiente.

Algoritmo para calcular una base


Entrada. Un grafo dirigido G.
Salida. Una base de G.

1. Inicializar B como vacío (la base).


2. Calcular C(G), el grafo de componentes de G.
3. Calcular las componentes fuertemente conexas Ci1 ,Ci2 , . . . ,Ci j , tales que su grado “in” en C(G) sea
cero.
4. Para cada una de las componentes Ci1 ,Ci2 , . . . ,Ci j , elegir uno de sus nodos y añadirlo a B.
5. Devolver B.

El cálculo de una antibase es básicamente el mismo que el anterior. La diferencia está en que, cuando
se tiene un DAG, la única antibase del DAG está compuesta por todos los nodos para los que su grado
“out” es cero, es decir, los nodos de los que nos sale ningún arco.

Algoritmo para calcular una antibase


Entrada. Un grafo dirigido G.
Salida. Una antibase de G.

1. Inicializar B como vacío (la antibase).


2. Calcular C(G), el grafo de componentes de G.
3. Calcular las componentes fuertemente conexas Ci1 ,Ci2 , . . . ,Ci j , tales que su grado “out” en C(G)
sea cero.
4. Para cada una de las componentes Ci1 ,Ci2 , . . . ,Ci j , elegir uno de sus nodos y añadirlo a B.
5. Devolver B.

Vamos a calcular una base y una antibase para el grafo dirigido de la figura 3.33.
Grafos y Combinatoria. Javier Tejel 109

Ejemplo 3.11. Para el grafo dirigido de la figura 3.33, calcular una base y una antibase.

Solución. Lo primero que hay que hacer es calcular el grafo de componentes. En el ejemplo 3.10, ob-
tuvimos que las componentes fuertemente conexas del grafo eran C1 = {1, 2, 7, 8}, C2 = {3, 4, 5, 9} y
C3 = {6}.

1 2 3 4
C1 5 C2
7 8
9

C3 6

Figura 3.34: Grafo de componentes del grafo de la figura 3.33.

Como hay un arco en el grafo que conecta el nodo 6 con el 7, en el grafo de componentes habrá
un arco que conecte C3 con C1 . Como el arco (3, 1) conecta el nodo 3 con el 1, entonces en el grafo de
componentes habrá un arco desde C2 hasta C1 . Finalmente, como hay un arco que conecta el nodo 4 con
el 6, en el grafo de componentes habrá un arco que conecte C2 con C3 . La figura 3.34 muestra el grafo de
componentes del grafo de la figura 3.33.
El único nodo de ese grafo de componentes al que no llega ningún arco es C2 . Por tanto, una base para
el grafo de la figura 3.33 estaría formada por un único nodo, cualquiera que esté en C2 . Por ejemplo, el
4. El único nodo de ese grafo de componentes del que no sale ningún arco es C1 . Por tanto, una antibase
estaría formada por un único nodo, cualquiera que esté en C1 . Por ejemplo, el 8.

Ejemplo 3.12. Supongamos que nos dan una red social, donde la red contiene un arco (u, v), si y sólo
si, todo lo que crea o recibe u lo transmite a v. Supongamos que la figura 3.35 muestra el grafo de
componentes de esa red. Calcular el numero mínimo de nodos de la red de forma que, al introducir
un bulo (“fake news”) en ellos, ese bulo vaya llegando a todos los nodos de la red. Decidir también el
número mínimo de nodos de la red que hay que explorar, para detectar todos los bulos introducidos en
esa red.

Solución. Por definición, en una cualquiera de las componentes Ci tenemos a todos los nodos que son
capaces de enviar y recibir información entre ellos, pues existen caminos dirigidos entre ellos. Sin embar-
go, cuando tomamos dos nodos en componentes distintas, la información sólo puede ir en una dirección,
de una de las componentes a la otra.

C9 C1

C2
C8
C3

C7
C4
C6
C5

Figura 3.35: Grafo de componentes de una red.

En la primera pregunta del ejercicio, calcular el numero mínimo de nodos de la red de forma, que al
introducir un bulo en ellos, ese bulo vaya llegando a todos los nodos de la red, lo que nos están pidiendo
110 Capítulo 3. Introducción a la teoría de grafos

es encontrar una base de la red. Las componentes fuertemente conexas que tienen grado “in” cero en el
grafo de componentes son la C4 , la C6 y la C8 . Por tanto, podemos formar una base eligiendo un nodo de
cada una de esas tres componentes. Si desde esos tres nodos se difunde un bulo, ese bulo irá llegando a
todos los nodos de la red.
En la segunda pregunta del ejercicio, calcular el número mínimo de nodos de la red que hay que
explorar para detectar todos los bulos introducidos en esa red, lo que nos están pidiendo es calcular una
antibase de la red. Las componentes fuertemente conexas que tienen grado “out” cero en el grafo de
componentes son la C5 y la C7 . Por tanto, podemos formar una antibase eligiendo un nodo de cada una
de esas dos componentes. Independientemente de dónde se haya generado un bulo, el bulo acabará en
algunos de los dos nodos elegidos, por lo que nos bastará con revisar los bulos llegados a esos dos nodos
para saberlos todos.

Nota 3.9. Utilizando el método descrito, la complejidad del cálculo de las componentes fuertemente
conexas, las bases y las antibases de un grafo dirigido con n nodos y m arcos puede llegar a ser O(n · m)
en el peor de los casos, pues para cada uno de los n nodos del grafo puede que haya que aplicar BFS
“out” y BFS “in”.

3.4. Algunos problemas de recuento


Ya hemos comentado en la introducción a la teoría de grafos, que nos íbamos a centrar en la reso-
lución de problemas básicos sobre grafos, haciendo especial hincapié en algoritmos que resuelvan esos
problemas. En esta sección, sin embargo, vamos a ver algunos resultados clásicos para algunos proble-
mas de recuento sobre grafos.
Algunos ejemplos de problemas de recuento serían los siguientes.

Dados n vértices sin etiquetar, ¿cuántos árboles generadores no isomorfos se pueden construir
sobre esos n vértices? Así, si n = 3, sólo hay un árbol generador, que consiste en conectar uno
de los vértices con los otros dos. Si n = 4, entonces hay dos árboles generadores no isomorfos
distintos, un camino de longitud 3 conectando los cuatro vértices, y una estrella centrada en uno
de los vértices, es decir, uno de los vértices conectado con los otros tres vértices.

Dado un grafo no dirigido G con sus vértices etiquetados, ¿cuántos árboles generadores distintos
contiene dicho grafo?

Dado un grafo dirigido G con sus vértices etiquetados, ¿cuántos caminos de longitud l hay entre
dos vértices cualesquiera?

En general, los problemas de recuento sobre grafos suelen ser difíciles de resolver. Aquí vamos a dar
algunos de los resultados más conocidos para contar paseos o contar árboles generadores. A pesar de la
sencillez de algunos de estos resultados, no por ello dejan de ser sorprendentes.

3.4.1. Paseos
Sea G = (V, E) un grafo no dirigido, con V = {v1 , . . . , vn } como su conjunto de vértices. Recordad
que la matriz de adyacencia M de G es una matriz simétrica de forma que mi j = m ji = 1, si la arista
(vi , v j ) pertenece a E, y mi j = 0, en otro caso. El siguiente teorema nos permite contar el número de
paseos de longitud exactamente k, entre dos vértices cualesquiera vi y v j .

Teorema 3.10. Sea M la matriz de adyacencia del grafo no dirigido G = (V, E), donde V = {v1 , . . . , vn }.
Sea M k la matriz obtenida multiplicando k veces la matriz M por sí misma. El número de paseos desde vi
hasta v j , usando exactamente k aristas, es mkij , el elemento de la fila i y de la columna j de la matriz M k .
Grafos y Combinatoria. Javier Tejel 111

Demostración. Veamos la demostración por inducción. Si k = 1, el teorema es cierto, ya que un paseo


de longitud uno se corresponde con una arista.
Veamos el resultado para un cierto k ≥ 2, suponiendo el teorema cierto para k − 1. Sea vl un vértice
cualquiera, y supongamos que hay bil paseos de longitud k − 1 desde vi a vl . Esos paseos se podrán
extender hasta v j siempre que haya una arista entre vl y v j (ml j = 1). Por tanto, hay bil · ml j paseos de
longitud k desde vi hasta v j , cuyo penúltimo vértice es vl . Luego el número de paseos de longitud k desde
vi hasta v j es
n
∑ bil · ml j
l=1

Por otra parte, como M k = M k−1 · M, el elemento mkij de M k viene dado por
n
mkij = ∑ milk−1 ml j
l=1

donde mk−1
il es el elemento de la fila i y de la columna l de la matriz M k−1 . Por inducción, bil = mk−1
il ,
k
por lo que mi j da precisamente el número de paseos de longitud k desde vi hasta v j .

Nota 3.10. El resultado anterior es también válido para un grafo dirigido, y la demostración es totalmente
análoga a la anterior. En el caso de un grafo dirigido, mkij dará el número de paseos dirigidos desde vi
hasta v j , usando exactamente k arcos. También es válido el teorema anterior para multigrafos. Para un
multigrafo, el elemento mi j de la matriz de adyacencia se define como el número de aristas entre vi y v j ,
en el caso no dirigido, y como el número de arcos entre vi y v j , en el caso dirigido.

El teorema anterior, no sólo permite calcular el número de paseos de longitud k desde vi hasta v j , si
no que permite obtener una fórmula explícita de dicho número a través del estudio de los valores propios
de la matriz de adyacencia M. Para ello, recordamos brevemente algunas nociones básicas del álgebra
lineal relacionadas con matrices reales y simétricas.
Sea G un grafo no dirigido. La matriz de adyacencia M de G es una matriz simétrica real, con va-
lores propios reales, que denotaremos por λ1 , . . . , λn . A los valores propios de M se les suele denominar
también valores propios de G. Cualquier matriz simétrica real M de tamaño n × n tiene n vectores pro-
pios reales linealmente independientes, que pueden tomarse ortonormales (es decir, ortogonales y con
norma 1). Sean u1 , . . . , un vectores propios (reales y ortonormales) correspondientes a los valores propios
λ1 , . . . , λn de M. Consideraremos cada ui como un vector columna n × 1. El traspuesto de un vector v se
denota por vt , que será un vector fila 1 × n. El producto escalar del vector v por el vector u es vt u.
Sea U la matriz cuyas columnas son los vectores u1 , . . . , un . Esta matriz es ortonormal, y su inversa
−1
U coincide con su traspuesta U t , que tiene como filas los vectores ut1 , . . . , utn . Además, U diagonaliza
M, es decir,
U −1 MU = diag(λ1 , . . . , λn )
donde diag(λ1 , . . . , λn ) representa la matriz diagonal con entradas λ1 , . . . , λn .

Corolario 3.2. Sea G un grafo no dirigido y M su matriz de adyacencia. Sean λ1 , . . . , λn los valores
propios de M, y sean vi y v j dos vértices cualesquiera de V . Entonces existen números reales c1 , . . . , cn
tales que
mkij = c1 λ1k + . . . + cn λnk
para cualquier k. De hecho, si U = (urs ) es una matriz real ortonormal tal que U −1 MU = diag(λ1 , . . . , λn ),
entonces
cl = uil u jl

Demostración. Usando propiedades del producto de matrices, es claro que

U −1 M kU = diag(λ1k , . . . , λnk )
112 Capítulo 3. Introducción a la teoría de grafos

por lo que
M k = U diag(λ1l , . . . , λnl ) U −1
Además, como U −1 = U t , tomando la fila i y columna j en ambas partes de la igualdad, obtenemos que
n
mkij = ∑ uil λlk u jl
l=1

como queríamos probar.

Este teorema nos da una fórmula explícita para el número de paseos de longitud k desde vi a v j , que
depende de los valores y vectores propios de la matriz de adyacencia M. La dificultad suele radicar en
calcular esos valores y vectores propios.
Nota 3.11. Como sucedía con el Teorema 3.10, el Corolario 3.2 es también válido cuando se tiene de
entrada un multigrafo en lugar de un grafo. Dado un multigrafo no dirigido G con matriz de adyacencia
M, el número de paseos de longitud k desde un vértice vi hasta un vértice v j viene dado por c1 λ1k +
. . . + cn λnk , con λ1 , . . . , λn los valores propios de M, y c1 , . . . , cn constantes que dependen de los vectores
propios de M.
El corolario anterior también tiene otros usos a la hora de resolver problemas de conteo. Vamos a
ilustrar ese uso a través de un ejemplo.
Ejemplo 3.13. Calcular el número de secuencias a1 . . . an , tales que ai es 1, 2, ó 3, donde está prohibido
que aparezcan las secuencias 11, 23 y 32. Así, si n = 3, las secuencias 131 y 213 son legales, pero las
secuencias 123 y 311 no lo son.
Solución. Denotemos por f (n) al número de secuencias de tamaño n satisfaciendo las condiciones del
enunciado.
Sea G el grafo no dirigido G = (V, E), con V = {1, 2, 3}, donde existen todas las aristas (i, j), excepto
la (1, 1) y la (2, 3). Notar que G es un multigrafo, pues contiene los bucles (2, 2) y (3, 3). La matriz de
adyacencia de G es
 
0 1 1
 1 1 0 
1 0 1
y sus valores propios son −1, 1, 2.
Notar también que f (n) se corresponde con el número de paseos de longitud n − 1 en el multigrafo
no dirigido G, es decir, que si pn−1
i j es el número de caminos de longitud n − 1 con comienzo en i y final
en j, entonces
f (n) = ∑ pn−1
ij
i, j
Por el Corolario 3.2, para cualesquiera i y j tenemos que
pn−1
i j = c1 (−1)
n−1
+ c2 1n−1 + c3 2n−1
con c1 , c2 y c3 unas determinadas constantes. Por consiguiente,
f (n) = d1 (−1)n−1 + d2 1n−1 + d3 2n−1
con d1 , d2 y d3 constantes.
Se podrían calcular estas constantes d1 , d2 y d3 desde los vectores propios de M. Pero como f (n) es
el total de caminos de longitud n − 1, y el número de caminos de longitud n − 1, para n − 1 = 0, 1 y 2, es
3, 6 y 12, respectivamente, deducimos que d1 = d2 = 0 y d3 = 3. Por tanto,
f (n) = 3 · 2n−1
Observar que hubiésemos obtenido el mismo resultado resolviendo este problema usando recurrencias,
pues f (n) = 2 f (n − 1), con f (1) = 3.
Grafos y Combinatoria. Javier Tejel 113

Hay un caso especialmente interesante, y es el caso en el que queremos calcular todos los paseos
cerrados de longitud k, es decir, paseos donde el vértice inicial coincide con el final. Por el Corolario 3.2,
este número será
n
∑ mkii = tr(Mk )
i=1

donde tr denota la traza de una matriz (suma de los elementos diagonales).


Sabiendo que la traza de una matriz cuadrada es la suma de sus valores propios, y que si λ1 , . . . , λn
son los valores propios de una matriz M, entonces λ1k , . . . , λnk son los valores propios de la matriz M k ,
tenemos el siguiente corolario.

Corolario 3.3. Sea G un grafo no dirigido y M su matriz de adyacencia. Supongamos que M tiene
valores propios λ1 , . . . , λn . Entonces el número de paseos cerrados de G de longitud k es

λ1k + . . . + λnk

3.4.2. Árboles generadores. Teorema matrix-tree


Dado un grafo G, en esta sección vamos a estudiar cuántos árboles generadores se pueden construir a
partir de G. Por conveniencia, vamos a realizar el análisis para grafos dirigidos, y luego estudiaremos el
caso no dirigido. Recordad que un grafo no dirigido se puede considerar dirigido, construyendo un grafo
G′ con los arcos (vi , v j ) y (v j , vi ), por cada arista (vi , v j ) de G.

Definición 3.32. Diremos que el grafo dirigido T = (V, A) es un árbol dirigido con raíz en v, si consta
de n − 1 arcos, y para cada nodo u ∈ V hay un camino dirigido desde v a u.

Los arcos en rojo de la figura 3.36 muestran un árbol dirigido con raíz en v4 .
Como hay un camino dirigido de v a cualquier nodo u, hay en T un camino no dirigido entre dos
nodos cualesquiera, por lo que T es conexo. El grafo subyacente a T (la versión no dirigida de T ) es
entonces también conexo, y como tiene n − 1 aristas es un árbol. Como en un árbol el camino que une
dos vértices en único, esto implica que el camino dirigido desde v a cada nodo u en T es único también.

v2
v1 v1 v2 v3 v4 v5 v6 v7 v8 v9
0 −1 −1
 
v3 v1 3 0 0 0 0 0
v2  −1
 2 0 0 0 0 0 0 0 
 −1
v3  −1 1 −1 −1 0 0 0 −1 

 0
v4  0 −1 2 0 −1 0 0 0 
v8 v9 v4  0
v5  0 0 −1 2 −1 −1 0 0 

 0
v6  0 0 0 0 2 −1 0 0 

 0
v7  0 0 0 0 0 5 −1 0 

v7 v5 v8  0 −1 0 0 0 0 −1 2 0 
v9 −1 0 0 0 −1 0 −1 0 1
v6

Figura 3.36: Árbol dirigido con raíz en v4 .


Tabla 3.21: Matriz Laplaciana del grafo de la derecha.

El siguiente lema es bastante evidente.

Lema 3.1. Un grafo conexo dirigido T = (V, A) con n − 1 arcos es un árbol dirigido con raíz en v, si y
sólo si, para cada nodo u ̸= v hay un arco que termina en u.

Demostración. Si T es un árbol dirigido con raíz en v, existe un camino dirigido desde v a cualquier
nodo u, por lo que a cada nodo u debe llegar un arco.
114 Capítulo 3. Introducción a la teoría de grafos

Veamos por inducción el recíproco, que si para cada nodo u ̸= v hay un arco que termina en u,
entonces T es un árbol dirigido. Si n = 2, T consta de dos vértices v y u. Como por hipótesis a u llega un
arco, entonces hay un camino dirigido de v a u, lo que implica que T es un árbol dirigido.
Supongamos el lema cierto para cualquier grafo conexo dirigido de n − 1 nodos y n − 2 arcos. Pro-
bemos entonces que T es un árbol dirigido con raíz en v. Como T es conexo, el grafo subyacente T ′ es
un árbol, que ha de contener al menos dos hojas (vértices de grado 1). Tomemos una de las hojas, w,
y sea u su vecino en T ′ (y en T ). Necesariamente, el arco que conecta u con w en T es el arco (u, w),
puesto que por hipótesis a w (que sólo puede ser incidente a un arco) debe llegar un arco. Al eliminar w
de T , obtenemos un grafo conexo dirigido T ′′ de n − 1 nodos y n − 2 arcos, que por inducción es un árbol
dirigido con raíz en v. Cualquier camino dirigido en T ′′ es también un camino dirigido en T , y como el
camino dirigido en T ′′ de v a u se puede extender a un camino dirigido de v a w en T , entonces T es un
árbol con raíz en v.

Dado un grafo dirigido G = (V, A) y un nodo v ∈ V , vamos a calcular cuantos árboles generadores
dirigidos con raíz en v contiene. Llamemos τ(G, v) a ese número. Por ejemplo, los arcos en rojo de la
figura 3.36 muestran un árbol generador dirigido con raíz en v4 para ese grafo. Si reemplazamos el arco
(v8 , v2 ) del árbol por el arco (v3 , v2 ), obtenemos otro árbol generador dirigido con raíz en v4 distinto al
anterior. Obviamente, si desde un vértice v no se alcanzan todos los nodos del grafo dirigido G, entonces
τ(G, v) = 0. En el grafo de la figura 3.36, como desde v6 no se puede llegar a v5 , entonces τ(G, v6 ) = 0.
Antes de continuar, recordamos algunas propiedades básicas sobre los determinantes. Usaremos la
notación det(M) para referirnos al determinante de una matriz M.

1. Si una fila (o columna) de una matriz M cuadrada consta de todo ceros, entonces det(M) = 0.
2. Si una fila (o columna) de una matriz M cuadrada es una combinación lineal de las restantes,
entonces det(M) = 0.
3. Si a una fila (o columna) de una matriz M cuadrada se le suma una combinación lineal de las
restantes, entonces el determinante de la nueva matriz no varía.
4. Si M es una matriz cuadrada triangular (inferior o superior), entonces su determinante es el pro-
ducto de los elementos de la diagonal principal.
5. Propiedad multilineal. Si M1 y M2 son dos matrices cuadradas con las mismas entradas, salvo en
una fila (o columna) fija i0 , entonces

det(M1 ) + det(M2 ) = det(M)

donde M es la matriz con las mismas entradas que M1 y M2 , excepto que la fila (o columna) i0 de
M es la suma de las filas (columnas) i0 de las matrices M1 y M2 .
6. Sea M una matriz de tamaño n × n. Consideremos las submatrices M11 , M12 , M21 y M22 de M,
donde M11 consta de las i primeras filas y columnas de M, M12 de las primeras i filas y las (n − i)
últimas columnas, M21 de las últimas (n − i) filas y las i primeras columnas, y M22 de las últimas
(n − i) filas y columnas. Si M12 y M21 son las matrices nulas, entonces

det(M) = det(M11 ) · det(M22 )

También utilizaremos la siguiente propiedad, que damos sin demostración.


Propiedad 3.1. Dado un árbol dirigido T con raíz en v, siempre existe un orden de los nodos, de forma
que v es el último nodo y la matriz de adyacencia es una matriz triangular inferior.
A dicho orden se le suele conocer como postorden, y se construye de forma que, para cualquier nodo
u, todos sus descendientes en el árbol aparecen antes que él en el postorden.
Por ejemplo, para al árbol dirigido rojo con raíz en v4 mostrado en la figura 3.36, el postorden corres-
pondiente sería v1 , v5 , v9 , v3 , v2 , v8 , v7 , v6 y v4 . Con ese orden, la matriz de adyacencia correspondiente a
ese árbol dirigido con raíz en v4 se muestra a continuación.
Grafos y Combinatoria. Javier Tejel 115

v1 v5 v9 v3 v2 v8 v7 v6 v4
 
v1 0 0 0 0 0 0 0 0 0
v5 
 0 0 0 0 0 0 0 0 0 
v9 
 0 1 0 0 0 0 0 0 0 
v3 
 1 0 1 0 0 0 0 0 0 
v2 
 0 0 0 0 0 0 0 0 0 
v8 
 0 0 0 0 1 0 0 0 0 
v7 
 0 0 0 0 0 1 0 0 0 
v6  0 0 0 0 0 0 1 0 0
v4 0 0 0 1 0 0 0 1 0

Sea M la matriz de adyacencia de un grafo dirigido G = (V, A), con V = {v1 , v2 , . . . , vn }, y sea D la
matriz diagonal n × n, tal que dii contiene el grado “in” de vi en G. La matriz L = D − M, de tamaño
n × n, es llamada la matriz laplaciana del grafo G. La tabla 3.21 muestra la matriz laplaciana asociada
al grafo dirigido de la figura 3.36.
Una propiedad básica de la matriz laplaciana L de un grafo dirigido G es que det(L) = 0. Esto es así
puesto que, como la suma de los elementos de cualquier columna j de L es 0, cualquier fila de L se puede
obtener como combinación lineal de las restantes, lo que implica que det(L) = 0.
Dado un grafo dirigido G y su matriz laplaciana L, denotemos por L−v a la matriz obtenida quitando a
L la fila y columna correspondientes al vértice v. El Teorema 3.11, conocido como Teorema matrix-tree,
permite calcular τ(G, v) en función del determinante de L−v .
Teorema 3.11 (Teorema matrix-tree). Sea G = (V, A) un grafo dirigido, sea M su matriz de adyacencia,
sea L la matriz laplaciana de G, y sea v un nodo de G. Entonces

τ(G, v) = det(L−v )

Demostración. Una primera observación es que si cambiamos el orden de los nodos, las matrices M, L
y L−v cambian (se están permutando filas y columnas), pero sus determinates no cambian. Por tanto,
renumerando los vértices si es necesario, podemos asumir sin pérdida de generalidad que v es el último
vértice, por lo que L−v se obtiene borrando la última fila y la última columna de L.
Haremos la demostración del teorema por inducción sobre el número de arcos m del grafo G. Antes,
veamos el caso particular en el que G no es conexo.
Si G no es conexo, necesariamente τ(G, v) tiene que ser cero. Veamos que, en efecto, det(L−v ) = 0.
Al no ser G conexo, podemos reordenar el conjunto de nodos V en dos partes: los primeros i nodos, que
van a definir un conjunto V1 de nodos, serán los que no estén en la componente conexa de v, y los últimos
(n − i) nodos, que van a definir un conjunto V2 de nodos, serán los que estén en la misma componente
conexa que v, siendo v el último de éllos. Con ese nuevo orden, la matriz L−v se puede descomponer
entonces en cuatro submatrices L11 , L12 , L21 y L22 , donde L11 consta de las i primeras filas y columnas
de L−v , L12 de las primeras i filas y las (n − 1 − i) últimas columnas, L21 de las últimas (n − 1 − i) filas
y las i primeras columnas, y L22 de las últimas (n − 1 − i) filas y columnas. Notar que L12 y L21 son
matrices nulas, pues los nodos de V1 y V2 están en diferentes componentes conexas y no hay conexiones
entre ellos. Por tanto, det(L−v ) = det(L11 ) · det(L22 ). Además, puesto que L11 es la matriz laplaciana del
subgrafo definido por los nodos en V1 , necesariamente det(L11 ) = 0, por lo que det(L−v ) = 0.
Procedemos ya con la inducción sobre el número de arcos. Supongamos primero que m < n − 1. En
ese caso, G no puede ser conexo, y por tanto τ(G, v) = det(L−v ) = 0.
Supongamos ahora que m = n − 1 y G es conexo. Estudiaremos dos casos, en función de si hay o no
algún nodo al que no llegan arcos. Si hay algún nodo u ̸= v al que no llega ningún arco, entonces G no es
un árbol dirigido con raíz en v por el Lema 3.1, con lo que τ(G, v) = 0. Veamos que también det(L−v ) es
cero en este caso. Como a u no llega ningún arco, los elementos de la columna de L−v correspondiente
a u son cero, por lo que det(L−v ) = 0. Por el contrario, si a cada nodo u ̸= v llega un arco, G es un
116 Capítulo 3. Introducción a la teoría de grafos

árbol generador dirigido con raíz en v, con lo que τ(G, v) = 1. Veamos que también det(L−v ) = 1 en este
caso. Por la propiedad 3.1, tomando los nodos del árbol en postorden con v siendo el último, la matriz de
adyacencia es triangular inferior. Por tanto, la matriz laplaciana es también triangular inferior, con todo
unos en la diagonal (salvo en la última fila), con lo que det(L−v ) = 1.
Supongamos finalmente que m ≥ n y G es conexo (si no lo fuera, ya tendríamos el resultado). Estu-
diaremos dos casos, en función de si hay arcos que terminan en v o no. Supongamos primero que el grafo
G contiene algún arco e = (u, v) que termina en v. Al eliminar ese arco e, obtenemos un grafo dirigido
G′ con m − 1 arcos. Las laplacianas de G y G′ son la misma salvo por el -1 correspondiente a la fila del
nodo u y la columna del nodo v, por lo que L−v es la misma para ambos grafos. Además, G y G′ tienen
el mismo número de árboles generadores dirigidos con raíz en v, pues el arco (u, v) no puede formar
parte de ninguno de esos árboles. Por inducción, sabemos que τ(G′ , v) = det(L−v ), lo que implica que
τ(G, v) = det(L−v ).
Supongamos ahora que G es conexo, que contiene m ≥ n arcos, y que ninguno de ellos termina en
v. Por el Teorema 3.5, se tiene que la suma de los grados “in” de los nodos de un grafo dirigido es el
número de arcos. Como estamos asumiendo que el grado “in” de v es cero y el número de arcos es al
menos n, necesariamente hay un nodo u ̸= v con grado “in” h al menos 2, en el que terminan los arcos
e1 = (vi1 , u), . . . , eh = (vih , u).
Sea G1 el grafo dirigido con m − h + 1 arcos, obtenido de G borrando todos los arcos que llegan a
u excepto el arco e1 , y sea G2 el grafo dirigido con m − 1 arcos, obtenido de G borrando sólo el arco e1
de G. Sea T un árbol generador dirigido de G con raíz en v. Por el Lema 3.1, en T sólo puede llegar un
arco a u. Si ese arco es e1 , entonces T es un árbol generador dirigido con raíz en v de G1 , y si ese arco es
distinto a e1 , entonces T es un árbol generador dirigido con raíz en v de G2 . En consecuencia, τ(G, v) =
τ(G1 , v) + τ(G2 , v). Por otra parte, observar que las matrices laplacianas L, L1 y L2 correspondientes a
G, G1 y G2 , respectivamente, son todas iguales excepto por la columna correspondiente al nodo u. En
L, la columna correspondiente a u tiene valor h en la fila correspondiente a u, valor −1 en las filas
correspondientes a vi1 , . . . , vih , y 0 en el resto. En L1 , la columna correspondiente a u tiene valor 1 en
la fila correspondiente a u, valor −1 en la fila correspondiente a vi1 , y 0 en el resto. Por último, en L2 ,
la columna correspondiente a u tiene valor h − 1 en la fila correspondiente a u, valor −1 en las filas
correspondientes a vi2 , . . . , vih , y cero en el resto. Por tanto, la suma de las columnas correspondientes a
u en L1 y L2 es la columna correspondiente a u en L. Al construir L−v , L1−v y L2−v , se sigue manteniendo
esta propiedad sobre la suma de las columnas, por lo que aplicando la propiedad multilineal de los
determinantes e inducción sobre G1 y G2 , tenemos que

det(L−v ) = det(L1−v ) + det(L2−v ) = τ(G1 , v) + τ(G2 , v) = τ(G, v)

como queríamos demostrar.

Ejemplo 3.14. Para el grafo dirigido de la figura 3.36, calcular el número de árboles generadores dirigi-
dos con raíz en v4 .

Solución. Si queremos calcular el número de árboles generadores dirigidos con raíz en v4 , tendremos
que borrar la cuarta fila y la cuarta columna de la matriz laplaciana mostrada en la tabla 3.21, y cal-
cular el determinante de la matriz resultante. Dicho determinante vale 192, por lo que hay 192 árboles
generadores con raíz en v4 para ese grafo.

Nota 3.12. Dado un grafo dirigido G = (V, A), si tomamos como matriz diagonal D′ una matriz n × n
cuya entrada dii es el grado “out” de vi en lugar del grado “in”, y definimos L′ = D′ − M como una nueva
matriz laplaciana, tendremos que
τ ′ (G, v) = det(L′−v )

donde τ ′ (G, v) es el número de árboles generadores dirigidos con raíz en v, pero donde ahora todos los
arcos van dirigidos hacia v, es decir con la orientación opuesta al caso anterior.
Grafos y Combinatoria. Javier Tejel 117

Cuando G = (V, E) es un grafo no dirigido, podemos considerarlo como un grafo dirigido construyen-
do un grafo G′ con los arcos (vi , v j ) y (v j , vi ), por cada arista (vi , v j ) de G. Ahora, a cada árbol generador
dirigido en G′ con raíz en v le corresponde, prescindiendo de la orientación, un árbol generador de G con
raíz en v. Recíprocamente, para cada árbol generador T de G, podemos elegir un vértice cualquiera v y
orientar todas las aristas de forma que todos los caminos empiecen en v, produciendo por tanto un árbol
dirigido generador de G′ con raíz en v. La matriz laplaciana L se define como L = D − M, donde D es
una matriz diagonal cuyo elemento dii es el grado del vértice vi , y M es la matriz de adyacencia de G.
Notar que la matriz laplaciana de G coincide con la de G′ .
Con estas observaciones tenemos como corolario el llamado Teorema matrix-tree para grafos no
dirigidos.

Corolario 3.4 (Teorema matrix-tree para grafos no dirigidos). El número de árboles generadores de
un grafo no dirigido G = (V, E) es el determinante de la matriz obtenida a partir de la matriz laplaciana
L borrando la fila y columna i-ésima, para cualquier i = 1, 2, . . . , n.

Nota 3.13. Los resultados anteriores sirven incluso para multigrafos sin bucles.

Para terminar esta sección, y como consecuencia del corolario anterior, damos el Teorema de Cayley
sobre el número de árboles etiquetados sobre n vértices.

Corolario 3.5. Dados n vértices etiquetados, hay nn−2 árboles etiquetados no dirigidos diferentes.

Demostración. Ese número de árboles etiquetados diferentes es el mismo que el número de árboles
generadores diferentes que contiene el grafo completo Kn . La matriz laplaciana L de Kn es una matriz
de tamaño n × n, con entradas n − 1 en la diagonal principal, y −1 en todas las demás entradas. Por el
Corolario 3.4, el número de árboles etiquetados diferentes será el determinante de la matriz L−n , obtenida
borrando la última fila y la última columna de L. El determinante de L−n , una matriz de tamaño (n − 1) ×
(n − 1), con valores (n − 1) en la diagonal principal y −1 en el resto, se puede calcular de la siguiente
manera. Si a cada una de las filas 1, 2, . . . , n − 2 de L−n le restamos la fila n − 1, obtenemos una matriz L′
con el mismo determinante, tal que sus (n − 2) × (n − 2) primeras filas y columnas son la matriz diagonal
con valor n en todas las entradas de la diagonal principal, su fila (n − 1) es (−1, −1, . . . , −1, n − 1) y su
columna (n − 1) es (−n, −n, . . . , −n, n − 1). Ahora, si a la última columna de L′ le sumamos todas las
anteriores, obtenemos una matriz L′′ con el mismo determinante, que es triangular inferior, y que en la
diagonal principal tiene (n − 2) veces el valor n y una vez el valor 1. Por tanto, el determinante de L′′ (y
de L−n ) es nn−2 .

3.5. Ejercicios propuestos


1. Hallar todos los grafos no dirigidos no isomorfos con 2, 3 y 4 vértices.

2. ¿Existe un grafo de 6 vértices con grados 2, 3, 3, 3, 3 y 3? ¿Y uno con 7 vértices y grados 0, 2, 2,


2, 4, 4 y 6? ¿Cuántos grafos existen con 10 vértices y grados 1, 1, 1, 1, 1, 1, 1, 1, 1 y 1?

3. Dado un grafo no dirigido, demostrar que dicho grafo tiene al menos dos vértices con el mismo
grado.

4. ¿Cuántos grafos no dirigidos hay con 20 vértices etiquetados? ¿Cuántos subgrafos tiene un ciclo
simple de longitud 4?

5. Supongamos que el grafo no dirigido G contiene dos subgrafos conexos G1 y G2 , y que tienen al
menos un vértice común. Demostrar que el subgrafo unión es también conexo.

6. Demostrar que no puede haber ninguna arista de un grafo G conectando vértices que estén en
distintas componentes conexas.
118 Capítulo 3. Introducción a la teoría de grafos

(n−1)(n−2)
7. Demostrar que un grafo no dirigido con n vértices y al menos 2 + 1 aristas es siempre
conexo.

8. Demostrar que si un grafo no dirigido G no es conexo, su grafo complementario sí lo es.

9. Hallar todos los árboles no etiquetados con 2, 3, 4, 5 y 6 vértices.

10. Demostrar que un grafo no dirigido con n vértices y m < n aristas tiene al menos n − m compo-
nentes conexas.

11. Demostrar que si un árbol tiene un vértice de grado d, al menos tiene d hojas.

12. Demostrar que en cualquier árbol, dos caminos cualesquiera con longitud la máxima posible con-
tienen al menos un nodo común.

13. Sea G = (V, E) un grafo no dirigido con vértices V = {1, 2, 3, 4, 5, 6, 7, 8} y aristas E = {(1, 5),
(1, 6), (1, 7), (1, 8), (2, 5), (2, 6), (2, 7), (2, 8), (3, 5), (3, 6), (3, 7), (3, 8), (4, 5), (4, 6), (4, 7),
(4, 8)}. Hallar un ciclo euleriano.

14. Sea G = (V, E) un grafo no dirigido con vértices V = {1, 2, 3, 4, 5, 6, 7, 8} y aristas E = {(1, 5),
(1, 3), (1, 4), (1, 8), (2, 5), (2, 3), (2, 8), (3, 7), (3, 6), (4, 6), (4, 7), (5, 6), (5, 7), (6, 8), (7, 8)}.
Hallar un camino conteniendo todas las aristas de G una sola vez.

15. Sea G = (V, E) un grafo no dirigido con vértices V = {1, 2, 3, 4, 5, 6, 7, 8} y aristas E = {(1, 2),
(1, 5), (1, 6), (1, 7), (1, 8), (2, 5), (2, 6), (2, 7), (2, 8), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (4, 5),
(4, 6), (4, 7), (4, 8), (6, 8)}. Hallar tres caminos P1 , P2 y P3 , tales que cualquier arista de G esté en
exactamente uno de esos tres caminos. ¿Pueden hallarse dos caminos de forma que toda arista de
G pertenezca a uno de ellos?

16. Sea G = (V, E) un grafo no dirigido con vértices V = {1, 2, 3, 4, 5, 6, 7, 8} y aristas E = {(1, 5),
(1, 6), (1, 3), (1, 4), (2, 5), (2, 6), (2, 7), (2, 8), (3, 5), (3, 6), (3, 7), (3, 8), (4, 3), (4, 5), (4, 6)}.
Hallar un ciclo que contenga a todas las aristas de G y sin aristas repetidas.

17. Para el grafo no dirigido de la figura, hallar un ciclo que contenga a todas las aristas de G, sin
repetir aristas.

2
1
3
7
5 4

6
11

8
9 10

18. Para el grafo no dirigido de la figura, hallar tres caminos P1 , P2 y P3 , tales que cualquier arista de
G esté en exactamente uno de esos tres caminos. ¿Pueden hallarse dos caminos de forma que toda
arista de G pertenezca a uno de ellos?
Grafos y Combinatoria. Javier Tejel 119

4 5
3

2
7
1
8
12

11 10 9

19. Para el grafo de la figura realizar lo siguiente.

2 3 4 5 6

7 10 11
9
8
14 15 16
12 13

17 19
18

a) Construir las listas de vecinos “out” e “in”.


b) Hallar el árbol BFS “out” y el árbol BFS “in” comenzando en el nodo 1.
c) Hallar el árbol BFS “out + in” de caminos no dirigidos comenzando en el mismo nodo 1.
d) Hallar las componentes fuertemente conexas.
e) Hallar una base y una antibase.

20. Para el grafo dirigido con nodos V = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} y arcos A = {(1, 3), (1, 10), (2, 5),
(2, 8), (5, 8), (6, 9), (6, 10), (7, 1), (7, 3), (7, 6), (7, 10), (8, 5), (9, 10), (10, 3), (10, 9)}, calcular
sus componentes conexas.

21. Para el grafo no dirigido con vértices V = {1, 2, 3, 4, 5, 6, 7, 8, 9} y aristas E = {(1, 2), (1, 5), (1, 6),
(2, 5), (2, 6), (3, 7), (3, 8), (4, 9), (5, 6), (7, 8)}, calcular sus componentes conexas.

22. Usar BFS para determinar si los siguientes tres grafos no dirigidos son árboles, o si contienen
ciclos. Los tres grafos tienen el mismo conjunto de nodos, V = {1, 2, 3, 4, 5, 6, 7, 8, 9}, y sus aristas
son, respectivamente:

a) E1 = {(1, 6), (2, 6), (3, 5), (3, 6), (5, 4), (9, 3), (6, 8), (7, 9)}.
b) E2 = {(1, 6), (2, 6), (3, 5), (3, 7), (5, 2), (9, 3), (1, 7), (4, 9)}.
c) E3 = {(1, 6), (2, 6), (8, 5), (8, 1), (5, 4), (9, 7), (7, 3), (3, 9)}.

23. Para el grafo de la figura realizar lo siguiente.


120 Capítulo 3. Introducción a la teoría de grafos

1 2

3 4 5 6

7 10 11
8 9

12 13 14

15 18
16 17

a) Construir las listas de vecinos “out” e “in”.


b) Hallar el árbol BFS “out” y el árbol BFS “in” comenzando en el nodo 1.
c) Hallar el árbol BFS “out + in” de caminos no dirigidos comenzando en el mismo nodo 1.
d) Hallar las componentes fuertemente conexas.
e) Hallar una base y una antibase.

24. Para el grafo no dirigido de la figura, construir las listas de vecinos, y hallar el árbol BFS comen-
zando en el vértice 1, determinando el orden en que se visitan (marcan) los vértices del grafo.

1 2 3 4

5 6 9 10
7
8

11 13 14 15 16
12

17 18 19 22
20 21

23 24
25 26

27 28 29 30

25. Probar que el siguiente grafo es un DAG y dar un orden “natural” para los nodos de ese DAG.

2 3 4 5 6

7 10 11
9
8
14 15 16
12 13

17 19
18
Grafos y Combinatoria. Javier Tejel 121

26. Decidir si los siguientes grafos dirigidos, definidos sobre el conjunto V = {1, 2, 3, 4, 5, 6, 7, 8, 9},
forman un DAG (y dar entonces un orden “natural”), o contienen un ciclo dirigido (y dar entonces
un ciclo).

a) A1 = {(1, 4), (1, 8), (2, 4), (2, 8), (2, 7), (3, 1), (3, 5), (4, 7), (5, 2), (5, 9), (6, 1), (6, 5), (6, 9),
(8, 4), (8, 7), (9, 8), (9, 4)}.
b) A2 = {(1, 2), (1, 5), (2, 8), (2, 9), (3, 6), (3, 1), (3, 5), (4, 7), (5, 9), (5, 2), (6, 1), (6, 8), (8, 4),
(8, 7), (9, 1), (9, 4), (9, 7)}.

27. Para el grafo no dirigido con el conjunto de vértices V = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, y con
el conjunto de aristas E = {(1, 2), (1, 4), (1, 8), (2, 8), (3, 5), (3, 9), (3, 11), (3, 12), (4, 8), (4, 10),
(5, 12), (6, 7), (6, 10), (7, 8), (7, 10), (11, 12)}, determinar si es conexo o no, y hallar sus compo-
nentes conexas en caso de que no lo sea.

28. Usar BFS para determinar si los siguientes cuatro grafos no dirigidos son conexos, son árboles o
contienen ciclos. Los cuatro grafos tienen el mismo conjunto de vértices, V = {1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11}, y sus aristas son, respectivamente,

a) E1 = {(1, 2), (1, 4), (1, 5), (2, 3), (2, 4), (3, 5), (4, 5), (6, 7), (6, 8), (7, 10), (8, 9), (9, 10)}.
b) E2 = {(1, 2), (1, 4), (1, 5), (2, 3), (3, 5), (5, 6), (6, 7), (6, 8), (7, 11), (8, 9), (9, 10)}.
c) E3 = {(1, 2), (1, 4), (1, 5), (2, 3), (3, 5), (6, 7), (6, 8), (7, 11), (8, 9), (9, 10)}.
d) E4 = {(1, 2), (1, 4), (1, 5), (2, 3), (5, 6), (6, 7), (6, 8), (7, 11), (8, 9), (9, 10)}.

29. Consideremos un grafo dirigido con el conjunto de nodos V = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} y
con las siguientes listas de vecinos “out”.

Listas de vecinos “out”


Nodo Vecinos “out”
1 2, 7
2 3, 7
3 4, 8
4 5
5 9, 10
6 1, 2, 11, 12
7 12
8 3, 9
9 4, 5
10 4, 9
11 12
12 11

a) Hallar el árbol BFS “out” y el árbol BFS “in” comenzando en el nodo 3.


b) Hallar el árbol BFS “out + in” de caminos no dirigidos comenzando en el mismo nodo 3.
c) Hallar la componente fuertemente conexa que contiene al nodo 3.

30. Para el grafo dirigido de la figura, realizar lo siguiente


122 Capítulo 3. Introducción a la teoría de grafos

12
2
11 1
3
10
4
9
5
8
6
7

a) Construir las listas de vecinos “out” e “in”.


b) Hallar el árbol BFS “out” y el árbol BFS “in” comenzando en el nodo 1.
c) Hallar el árbol BFS “out + in” de caminos no dirigidos comenzando en el mismo nodo 1.
d) Hallar la componente fuertemente conexa que contiene al nodo 1.

31. Probar que el grafo dirigido con el conjunto de nodos V = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} y con
el conjunto de arcos A = {(1, 2), (1, 6), (2, 3), (2, 6), (2, 7), (3, 8), (4, 3), (4, 5), (4, 9), (4, 10),
(5, 10), (6, 7), (7, 12), (8, 7), (8, 9), (10, 9), (11, 6), (11, 12)} es un DAG, y dar un orden “natural”
para los nodos de ese DAG.

32. Probar que el grafo dirigido de la figura es un DAG, y dar un orden “natural” para sus nodos.

1 2 3 4 5

6 9 12
7 8
10 11

13 14 15 16 17

33. Tenemos que realizar 12 tareas, etiquetadas de 1 a 12. Las tareas no pueden realizarse en cualquier
orden, si no que algunas deben realizarse antes que otras. La siguiente tabla especifica las relacio-
nes de precedencia entre las tareas. Por ejemplo, las tareas 3 y 8 han de realizarse antes que la 1.
Calcular, si existe, un orden para realizar esas 12 tareas que sea compatible con las restricciones
dadas.

Tarea Tareas previas


1 3, 8
2 3, 7
3 5, 8
4 5, 12
5 10
6 1, 2, 11, 12
7 12
8 5, 12
9 3, 5, 12
10
11 7, 5, 12
12
Capítulo 4

Grafos con costos

En la práctica, hay diferentes situaciones en las que, además de modelizar un problema a través de
un grafo, aparecen de forma natural costos asociados a los arcos (o los nodos) de una red. El ejemplo
clásico de este tipo de situaciones es el de una red de carreteras, donde las ciudades son los nodos de la
red, las carreteras conectando ciudades son los arcos de la red, y los arcos tienen asociados unos costos,
que son las distancias entre ciudades.
Usualmente, este tipo de situaciones se modeliza de la siguiente manera. Para un grafo dirigido
G = (V, A) (las ciudades y las carreteras), se dispone de una función w : A → R (la distancia), donde
w(i, j) representa el costo (o peso) de usar el arco (vi , v j ) ∈ A. Para el ejemplo de la red de carreteras, el
problema básico a resolver sería el de encontrar el camino que minimice la distancia entre dos ciudades
cualesquiera, donde la distancia entre las ciudades sería la suma de los costos de los arcos usados en ese
camino.
En este capítulo, vamos a ver los algoritmos básicos para resolver los problemas de cálculo de cami-
nos más cortos (o más largos) y de cálculo de árboles generadores de costo mínimo. También veremos
cómo aplicar el cálculo de caminos óptimos a algunos problemas de planificación de proyectos.

4.1. Cálculo de caminos más cortos


Además del ejemplo de la red de carreteras, hay otras situaciones en las que aparecen de forma natural
costos asociados a los arcos. Otro ejemplo es el de una red eléctrica, donde a cada conexión entre nodos
de la red se le asigna el porcentaje de electricidad perdida cuando se envía corriente por esa conexión.
También podemos pensar en una red de comunicaciones, donde el costo asociado a una conexión entre
nodos representa la probabilidad de que la conexión falle (o sea hackeada).
En todas esta situaciones, uno de los objetivos prioritarios es el de encontrar el camino más corto
entre dos nodos. En el caso de la red de carreteras, el camino más corto que minimize la distancia entre
dos ciudades, en el caso de la red eléctrica, el camino que minimize la pérdida de electricidad cuando se
envía corriente eléctrica entre dos estaciones, y en el caso de la red de comunicaciones, el camino que
minimize la probabilidad de que se pierda la señal entre dos nodos de la red. Hay que notar que esos
caminos más cortos ya no tienen por qué ser los caminos que utilizan el mínimo número de arcos.
En esta sección, el problema básico que vamos a estudiar es el siguiente. Dado un grafo dirigido
G = (V, A), una función de costos w sobre los arcos de G, y un nodo inicial i, encontrar los caminos
dirigidos de costo mínimo (o más cortos o de mínimo peso) desde el nodo inicial i a cada uno de los
nodos de G, donde el costo de un camino es la suma de los costos de los arcos del camino. En general,
volveremos a usar en esta sección i, j, . . . para denotar a los nodos del grafo.
Una de las primeras observaciones que hay que realizar es que si w(i, j) = 1 para cualquier arco
(vi , v j ) de G, entonces el algoritmo BFS “out” resuelve el problema. Dado un grafo dirigido G y un
nodo i, en la sección 3.3.1 ya vimos cómo calcular los caminos dirigidos más cortos (en el número de
arcos) desde el nodo i a todos los nodos j alcanzables desde i. Como w(i, j) = 1 para cualquier arco,

123
124 Capítulo 4. Grafos con costos

el problema de encontrar el camino de cost mínimo es equivalente al de encontrar el que usa el menor
número de arcos.
Aunque normalmente en las diferentes aplicaciones los costos son no negativos, hay alguna situación
en la que alguno de los costos es negativo. Una segunda observación a tener en cuenta en esos casos es
que si en el grafo dirigido existen ciclos dirigidos con costo negativo, donde el costo de un ciclo es la
suma de los costos de los arcos que lo forman, entonces no va a haber solución para encontrar algunos de
los caminos dirigidos. Supongamos que C = (i0 , i1 , . . . , il = i0 ) es un ciclo tal que w(i0 , i1 ) + w(i1 , i2 ) +
. . . + w(il−1 , i0 ) < 0. Si existe un camino dirigido (i, . . . , i0 , . . . j) desde i hasta j que involucra al nodo
i0 , entonces podemos añadir el ciclo C un número arbitrario de veces al camino, obteniendo cada vez un
paseo entre i y j de costo cada vez menor.

3 1
4
1
1 10
2 10 −3 5

1 8 7 6 10
1 10

Figura 4.1: Grafo con un ciclo dirigido negativo.

La figura 4.1 muestra un ejemplo de un grafo dirigido con 8 nodos, donde los costos de los arcos
aparecen en morado sobre ellos. Ese grafo contiene un ciclo con costo negativo, el ciclo C = (3, 4, 5, 3),
cuyo costo es w(3, 4) + w(4, 5) + w(5, 3) = 1 + 1 − 3 = −1. Si queremos calcular los caminos de costo
mínimo desde el nodo 1 a todos los demás, sólo se van a poder calcular dos caminos, el que va al nodo
2 (con costo 10 a través del arco (1, 2)) y el que va al nodo 8 (con costo 1 a través del arco (1, 8)).
En el resto de los casos, es fácil ver que siempre se puede incorporar el ciclo C a cualquier camino, de
forma que se van obteniendo paseos con costo cada vez menor. Así, por ejemplo, podemos construir un
paseo del nodo 1 al 7 con costo −8, el paseo (1, 2, 3, 4, 5, 3, 4, 5, . . . , 3, 4, 5, 6, 7), usando una vez los arcos
(1, 2), (2, 3), (3, 4), (4, 5), (5, 6) y (6, 7) y cincuenta veces el ciclo C = (3, 4, 5, 3).
Hay diferentes métodos para resolver el problema de encontrar los caminos más cortos en un grafo
dirigido con costos. Los más conocidos son los algoritmos de Dijkstra y de Bellman-Ford, que vamos a
ver a continuación. Mientras que en el algoritmo de Dijkstra se requiere que los costos sean no negativos,
en el de Bellman-Ford los costos pueden ser negativos. En este último caso, el algoritmo encuentra los
caminos más cortos o un ciclo de costo negativo.
Una propiedad sencilla pero fundamental en la que se basan los diferentes métodos para encontrar
los caminos de menor costo la proporciona el siguiente teorema.

Teorema 4.1. Sea G = (V, A) un grafo dirigido con función de costos w. Supongamos que P = (i =
i0 , i1 , . . . , il = j) es el camino dirigido de costo mínimo desde i hasta j. Entonces, para cualesquiera r y
s, tal que 0 ≤ r < s ≤ l, el camino dirigido (ir , ir+1 , . . . , is ) es el de costo mínimo desde ir hasta is .

Demostración. Supongamos que P1 = (ir , ir+1 , . . . , is ) no es el camino de costo mínimo desde ir hasta
is . Sea P2 = (ir , i′r+1 , . . . , is ) el camino de costo mínimo de ir a is . Sustituyendo en P el camino P1 por el
camino P2 , obtendríamos un camino de i a j con costo menor que el mínimo, una contradicción.

4.1.1. Algoritmo de Dijkstra


El primero de los algoritmos que vamos a ver para el cálculo de caminos más cortos es el algoritmo
de Dijkstra, que es un algoritmo rápido y eficiente. Para su aplicación se requiere que todos los costos
w(i, j) sean no negativos. El algoritmo es similar al método BFS, y se basa en la siguiente propiedad.
Sea G = (V, A) un grafo dirigido, w una función de costos no negativa, e i un nodo de G. Supongamos
que conocemos el camino dirigido de costo mínimo desde i a todos los nodos de un conjunto S ⊂ V .
Podemos suponer que esos caminos óptimos sólo contienen nodos de S, puesto que si en un camino
óptimo P desde i hasta j ∈ S existiese un nodo k ∈
/ S, por el Teorema 4.1 el camino dirigido en P desde i
Grafos y Combinatoria. Javier Tejel 125

hasta k sería óptimo, con lo que k estaría en S. Supongamos además que para los nodos k ̸∈ S conocemos
un camino dirigido P(k) desde i hasta k, tal que todos los nodos intermedios en P(k) pertenecen a S, y
entre todos los caminos dirigidos entre i y k que sólo usan nodos de S, P(k) es el de costo mínimo. De
entre los nodos que no están en S, sea k′ el nodo tal que el costo de P(k′ ) sea mínimo.

Teorema 4.2. P(k′ ) es un camino dirigido en G desde i hasta k′ de costo mínimo.

Demostración. Supongamos que en lugar de P(k′ ) hay otro camino dirigido P′ = (i = k0 , k1 , . . . , kl =


k′ ) con un costo estrictamente menor que P(k′ ). Como k′ ∈ / S, en la secuencia de nodos k0 , k1 , . . . nos
encontraremos en algún momento con un nodo kr que no está en S. Para ese nodo kr , el costo del camino
dirigido entre i y kr a través de P′ , que sólo usa nodos de S, sería menor que el costo de P(k′ ), lo cual es
una contradicción por la elección de k′ .

El teorema anterior da el método para ir construyendo los caminos dirigidos de costo mínimo desde
un nodo i. Inicialmente, el conjunto S está formado por el nodo i. En cada iteración del algoritmo, si
conocemos todos los caminos más cortos P(k) desde i hasta k, para todo k ∈ / S, tal que esos caminos más
cortos sólo usan nodos de S, entonces podemos incorporar un nuevo nodo k′ a S, donde k′ es el nodo
que verifica que costo(P(k′ )) = mı́nk∈S ′
/ costo(P(k)). Al incorporar k a S, hay que actualizar los caminos
P(k). Dado k ∈ ′
/ S, tras incorporar k a S, el nuevo camino dirigido más corto desde i hasta k usando sólo
nodos de S, o es el mismo P(k) que antes de incorporar a k′ , o es el camino desde i hasta k′ más el arco
(k′ , k).
Hay que notar que en el proceso anterior nunca se producen ciclos. Si se produjese un ciclo, como
todos los costos son no negativos, se podría eliminar el ciclo obteniendo un camino más corto. Además,
cada vez que se incorpora un nuevo nodo k′ a S, podemos anotar el nodo j de S (su marca) desde el que
se llega. Tal y como sucedía al aplicar BFS, el resultado del algoritmo de Dijkstra es el árbol de caminos
dirigidos más cortos con raíz en i, donde la marca de cada nodo es su padre en ese árbol.
Resumiendo, el algoritmo de Dijkstra proporciona el árbol de caminos más cortos desde i hasta todos
los nodos j que son alcanzables desde i. El vector marca dará el predecesor de cada nodo j en el camino
dirigido más corto desde i hasta j, y en el vector c el costo del camino más corto usando los nodos de
S, para todos los nodos que no están en S. Como sucedía con el método BFS, los nodos que queden
marcados al final del algoritmo serán los nodos a los que se puede llegar desde i con caminos dirigidos.

Algoritmo de Dijkstra

Entrada. Un grafo dirigido G, una función de costos no negativa, y un nodo i de G.


Salida. T , el árbol de caminos dirigidos más cortos desde i.

1. Inicializar como vacíos T , S y el vector marca. Inicializar como infinito el vector c.


2. Hacer marca(i) = ∗, c(i) = 0.
3. Mientras haya un nodo k que no está en S tal que c(k) ̸= ∞, repetir lo siguiente.
Hallar el nodo k′ tal que c(k′ ) = mı́nk∈S ′ ′
/ c(k) e incluir k en S. Explorar la lista de vecinos “out” de k ,
y para cada nodo k de esa lista tal que k no esté en S y c(k ) + w(k , k) < c(k), hacer marca(k) = k′
′ ′

y c(k) = c(k′ ) + w(k′ , k)


4. Para todos los nodos j marcados (excepto i), añadir el arco (marca( j), j) a T .
5. Devolver T .

Veamos un ejemplo del método.

Ejemplo 4.1. Para el grafo dirigido con costos en los arcos de la figura 4.2, calcular el árbol de caminos
dirigidos de costo mínimo desde el nodo 4.
126 Capítulo 4. Grafos con costos

Solución. La tabla 4.1 muestra la lista de vecinos “out” del grafo de la figura 4.2, así como los costos
asociados a cada arco, entre paréntesis.

2 Listas de vecinos “out”


1 9
Nodo Vecinos “out”
42
12 41
3 1 7(30), 8(9)
14
2 1(9)
9 25 32 3 1(41), 2(42), 4(32), 5(60), 9(25)
30
60
45 4 3(45), 6(40)
8 21 9 4 5 4(25), 6(25), 7(41)
33
11 6 7(10)
25
11 41 7 8(11)
7 5 8 2(12), 7(11)
25 40
10 9 1(14), 5(33), 7(21)
6
Tabla 4.1: Listas de vecinos “out” y costos
Figura 4.2: Grafo dirigido con costos. asociados.

Veamos cómo se iría ejecutando el algoritmo, cuando comenzamos en el nodo 4. Para una mejor
visualización, vamos a emplear una tabla con tres columnas, como la mostrada en la tabla 4.2a. La
primera columna con los nodos (N.), la segunda con las marcas de los nodos (M.), y la tercera (C.) con
los costos c( j) de los caminos dirigidos más cortos desde el nodo 4 a los nodos j, usando los nodos de S.
Los nodos que se vayan incorporando al conjunto S los iremos marcando en rojo, así como el costo del
camino dirigido más corto desde el nodo raíz, que es el 4, a ese nodo. En cada tabla, iremos marcando
en azul el coste del camino P(k′ ) del Teorema 4.2.

1. El algoritmo comienza marcando el nodo 4 con * (va a ser la raíz del árbol), y pone c(4) = 0, que
es lo que cuesta llegar al nodo 4 desde el 4. Véase la tabla 4.2a. Para el resto de nodos j, su costo
c( j) será infinito.
2. Como el único nodo tal que no está en S y tiene c( j) finito es el nodo 4, el algoritmo añade el
nodo 4 a S (marcado en rojo en la tabla 4.2b). Al explorar la lista de vecinos “out” del nodo 4,
los nodos 3 y 6 no están en S. Como c(3) = ∞, y se puede llegar al nodo 3 desde el 4 con costo
c(4) + w(4, 3) = 0 + 45 = 45 < ∞, marcaremos el nodo 3 con la marca 4, y actualizamos c(3) = 45,
costo del camino más corto hasta el 3 usando los nodos de S (de momento sólo está el nodo 4). Lo
mismo sucede con el nodo 6, lo marcamos con el 4 y actualizamos c(6) a 40. Véase la tabla 4.2b.
3. De entre todos los nodos j que no están en S y tienen c( j) finito, que son el 3 y el 6, el que tiene un
costo menor c( j) asociado (marcado en azul en la tabla 4.2b) es el 6 (40 frente a 45). El algoritmo
añade el nodo 6 al conjunto S (lo marcamos en rojo en la tabla 4.2c) y explora su lista de vecinos
“out”. Al único nodo al que se puede llegar desde el 6 es el nodo 7. Como c(7) = ∞, y lo que cuesta
llegar desde el nodo 4 al nodo 7 a través del 6 es c(6) + w(6, 7) = 40 + 10 = 50 < ∞, se marca el
nodo 7 con el 6, y se actualiza c(7) = 50. Véase la tabla 4.2c.
4. Los nodos 3 y 7 son lo que no están en S y tienen c( j) finito (véase la tabla 4.2c). Como c(3) = 45
es menor que c(7) = 50, el siguiente nodo que pasa a S es el nodo 3. Los vecinos “out” del nodo
3 son el 1, el 2, el 4, el 5 y el 9. Como el 4 es el único de esos nodos en S, hay que actualizar
la información de los nodos 1, 2, 5 y 9. Los costos de llegar a ellos en esta etapa es infinito,
luego como va a ser más barato llegar a ellos a través del 3, a todos se les pone marca 3, y los
costos de los caminos dirigidos para llegar a ellos desde el 4, usando los nodos de S, serán c(1) =
c(3) + w(3, 1) = 45 + 41 = 86, c(2) = c(3) + w(3, 2) = 45 + 42 = 87, c(5) = c(3) + w(3, 5) =
45 + 60 = 105 y c(9) = c(3) + w(3, 9) = 45 + 25 = 70, respectivamente. Véase la tabla 4.2d.
5. En el siguiente paso, el menor de los c( j) para los nodos que no están en S es c(7) = 50 (el menor
de 86, 87, 105, 50 y 70 en la tabla 4.2d). Luego el siguiente nodo que pasa a S es el nodo 7. El
Grafos y Combinatoria. Javier Tejel 127

N. M. C. N. M. C. N. M. C. N. M. C. N. M. C.
1 1 1 1 3 86 1 3 86
2 2 2 2 3 87 2 3 87
3 3 4 45 3 4 45 3 4 45 3 4 45
4 * 0 4 * 0 4 * 0 4 * 0 4 * 0
5 5 5 5 3 105 5 3 105
6 6 4 40 6 4 40 6 4 40 6 4 40
7 7 7 6 50 7 6 50 7 6 50
8 8 8 8 8 7 61
9 9 9 9 3 70 9 3 70
(a) (b) (c) (d) (e)

N. M. C. N. M. C. N. M. C. N. M. C.
1 3 86 1 3, 9 86,
 84
 1 3, 9, 2 86,

 84,
 82 1 3, 9, 2 86,

 84,
 82
2 3, 8 87,
 73
 2 3, 8 87,
 73
 2 3, 8 87, 73
 2 3, 8 87, 73

3 4 45 3 4 45 3 4 45 3 4 45
4 * 0 4 * 0 4 * 0 4 * 0
5 3 105 5 3, 9 105,
 103 5 3, 9 105,
 103 5 3, 9 105,
 103
6 4 40 6 4 40 6 4 40 6 4 40
7 6 50 7 6 50 7 6 50 7 6 50
8 7 61 8 7 61 8 7 61 8 7 61
9 3 70 9 3 70 9 3 70 9 3 70
(f) (g) (h) (i)

Tabla 4.2: Tablas con la ejecución del algoritmo de Dijkstra comenzando en el nodo 4.

único vecino “out” que tiene el nodo 7 es el 8, que tiene c(8) = ∞. Por tanto, se marca el nodo 8
con 7 y se actualiza c(8) = c(7) + w(7, 8) = 50 + 11 = 61. Véase la tabla 4.2e.
6. Ahora, en la tabla 4.2e, el menor de los c( j) para los nodos que no están en S es c(8) = 61
(el menor de 86, 87, 105, 61 y 70). Luego el siguiente nodo que pasa a S es el nodo 8. Los
vecinos “out” del nodo 8 son el 2 y el 7. Como el nodo 7 ya está en S, sólo hay que actualizar la
información del nodo 2. Lo que costaba llegar al nodo 2 antes de añadir el nodo 8 era c(2) = 87
a través del 3. Al añadir el nodo 8 a S, al nodo 2 se puede llegar desde el 4 a través del 8 con
costo c(8) + w(8, 2) = 61 + 12 = 73 < 87. Por tanto, se actualiza la marca del 2 a 8 y se actualiza
c(2) = 73. Véase la tabla 4.2f.
7. En la siguiente etapa, el menor de 86, 73, 105 y 70 (véase la tabla 4.2f) es c(9) = 70, por lo que
el nodo 9 es el siguiente que se añade a S. Los vecinos “out” del nodo 9 son el 1, el 5 y el 7.
Como el nodo 7 ya está en S, sólo hay que actualizar la información de los nodos 1 y 5. En ambos
casos, es más corto llegar a ellos desde el 4 a través del 9 (c(9) + w(9, 1) = 70 + 14 = 84 < 86 y
c(9) + w(9, 5) = 70 + 33 = 103 < 105), que llegar a ellos desde el 3. Por tanto, se actualizan las
marcas del 1 del 5 a 9, y se actualizan c(1) = 84 y c(5) = 103. Véase la tabla 4.2g.
8. A continuación, el menor de 84, 73 y 103 (véase la tabla 4.2g) es c(2) = 73, por lo que el nodo 2
es el siguiente que pasa a S. El único vecino “out” del nodo 2 es el 1. El camino más corto desde
el nodo 4 al 1 a través del 2 tiene un costo de c(2) + w(2, 1) = 73 + 9 = 82, que es más pequeño
que 84, lo que costaba llegar al 1 desde el 9. Luego se actualiza la marca del 1 a 2 y el costo c(1)
a 82. Véase la tabla 4.2h.
9. Ya sólo quedan dos nodos que todavía no están en S, los nodos 1 y 9 (véase la tabla 4.2h). Como
82 es menor que 103, el siguiente nodo que se añade a S es el nodo 1. Los vecinos “out” del 1, el
7 y el 8, ya están en S, por lo que no hay costos que actualizar. Véase la tabla 4.2i.
128 Capítulo 4. Grafos con costos

4
45
2 40
1 9
42
12 41 3 6
3 25 10
14
25 9 7
9 32
30
45 33 11
60
8 21 9 4 5 8
33
11 12
25
11 41
2
7 25 5 40 9
10
1
6

Figura 4.3: Árbol de caminos dirigidos más cortos desde el nodo 4.

10. El único nodo que no está en S es el nodo 5 (véase la tabla 4.2i). Se añade a S y el algoritmo
termina.

El árbol de caminos dirigidos más cortos de muestra en la figura 4.3. El árbol se construye utilizando
las marcas de los nodos. Así, al nodo 1 se llega desde el 2, al nodo 2 desde 8, al 3 desde el 4, y así
sucesivamente. En el árbol vemos que, por ejemplo, el camino dirigido más corto desde el 4 hasta el 8
tiene costo 61, usando el arco (4, 6) con costo 40, el arco (6, 7) con costo 10 y el arco (7, 8) con costo
11.

Como sucedía con el método BFS, el algoritmo de Dijkstra también se puede utilizar para calcular
el árbol de caminos dirigidos más cortos desde los diferentes nodos a uno dado i, y para calcular el árbol
de caminos no dirigidos más cortos comenzando en un nodo i. En el primer caso usando las listas de
vecinos “in” en lugar de las “out”, y en el segundo caso usando a la vez las listas de vecinos “out” e “in”.
Resumimos cómo quedarían los algoritmos en los diferentes casos y haremos algunos ejemplos.

Algoritmo de Dijkstra para caminos dirigidos de costo mínimo hacia un nodo i

Entrada. Un grafo dirigido G, una función de costos no negativa, y un nodo i de G.


Salida. T , el árbol de caminos dirigidos más cortos hacia i.

1. Inicializar como vacíos T , S y el vector marca. Inicializar como infinito el vector c.


2. Hacer marca(i) = ∗, c(i) = 0.
3. Mientras haya un nodo k que no está en S tal que c(k) ̸= ∞, repetir lo siguiente.
Hallar el nodo k′ tal que c(k′ ) = mı́nk∈S ′ ′
/ c(k) e incluir k en S. Explorar la lista de vecinos “in” de k ,
y para cada nodo k de esa lista tal que k no esté en S y c(k ) + w(k, k ) < c(k), hacer marca(k) = k′
′ ′

y c(k) = c(k′ ) + w(k, k′ )


4. Para todos los nodos j marcados (excepto i), añadir el arco ( j, marca( j)) a T .
5. Devolver T .

Veamos un ejemplo del método.

Ejemplo 4.2. Para el grafo dirigido de la figura 4.2, calcular el árbol de caminos dirigidos de costo
mínimo desde los diferentes nodos hasta el nodo 4.
Grafos y Combinatoria. Javier Tejel 129

Listas de vecinos “in”


Nodo Vecinos “in”
1 2(9), 3(41), 9(14)
2 3(42), 8(12)
3 4(45)
4 3(32), 5(25)
5 3(60), 9(33)
6 4(40), 5(25)
7 1(30), 5(41), 6(10), 8(11), 9(21)
8 1(9), 7(11)
9 3(25)

Tabla 4.3: Listas de vecinos “in” del grafo de la figura 4.2, junto con los costos de los arcos.

Solución. La tabla 4.3 muestra la lista de vecinos “in” del grafo de la figura 4.2, así como los costos
asociados a cada arco (entre paréntesis).
La tabla 4.4 muestra las diferentes tablas en los diferentes pasos del algoritmo. Se comienza marcan-
do el nodo 4 y marcando a sus vecinos “in”, que son el nodo 3 y el nodo 5, con la marca 4. Lo que cuesta
llegar al nodo 4 desde el 3 es w(3, 4) = 32, y desde el nodo 5 es w(5, 4) = 25, por lo que actualizamos
c(3) a 32 y c(5) a 25. Véase la tabla 4.4b.
De los costos de esa tabla, 32 y 25, el menor es 25, por lo que el nodo 5 es el siguiente que entra
en S. Los vecinos “in” del nodo 5 son el 3 y el 9. El nodo 3 ya está en S, por lo que sólo hay que
actualizar la información del nodo 9. Del nodo 9 nos cuesta w(9, 5) = 33 llegar al 5, y del nodo 5 nos
cuesta c(5) = 25 llegar al 4. Como c(9) era infinito, ponemos la marca 5 al nodo 9 y actualizamos
c(9) = w(9, 5) + c(5) = 58. Véase la tabla 4.4c.

N. M. C. N. M. C. N. M. C. N. M. C. N. M. C.
1 1 1 1 1
2 2 2 2 2
3 3 4 32 3 4 32 3 4 32 3 4 32
4 * 0 4 * 0 4 * 0 4 * 0 4 * 0
5 5 4 25 5 4 25 5 4 25 5 4 25
6 6 6 6 6
7 7 7 7 7
8 8 8 8 8
9 9 9 5 58 9 5 58 9 5 58
(a) (b) (c) (d) (e)

Tabla 4.4: Tablas con la ejecución del algoritmo de Dijkstra para el árbol de caminos dirigidos más cortos
desde los diferentes nodos hasta el nodo 4.

De entre los costos de esa tabla, 32 y 58, el menor es 32, por lo que el nodo 3 es el siguiente nodo
que entra en S. El único vecino “in“ del nodo 3 es el nodo 4, que ya está en S, por lo que no tenemos que
actualizar costos. Véase la tabla 4.4d.
El único costo sin marcar que queda en la tabla 4.4d es 58. Por tanto, el nodo 9 es el siguiente nodo
que se añade a S. Como el único vecino “in” del nodo 9 es el 3, no hace falta actualizar nada. Véase la
tabla 4.4e. Al no quedar ningún costo finito, el algoritmo termina.
En este ejemplo, al nodo 4 sólo se puede llegar con caminos dirigidos desde los nodos 3, 5 y 9. El
árbol de caminos más cortos es el que se muestra en la figura 4.4, que se obtiene a través de los nodos
marcados 3, 5 y 9, añadiendo al árbol los arcos (3, 4), (5, 4) y (9, 5). En el árbol vemos que, por ejemplo,
130 Capítulo 4. Grafos con costos

2
1 9
42
12 41
3
4
14 32
25 25
9 32
30
45
60
3 5
8 21 9 33
4 33
11
25 9
11 41

7 25 5 40
10
6

Figura 4.4: Árbol de caminos dirigidos más cortos desde los diferentes nodos hasta el nodo 4.

el camino dirigido más corto desde el nodo 9 al nodo 4 es el camino (9, 5, 4), con un costo de 58.

Para caminos no dirigidos más cortos en un grafo dirigido, se procesan a la vez las listas de vecinos
“out” e “in”, añadiendo un menos a la marca de un nodo cuando el arco se usa hacia atrás.

Algoritmo de Dijkstra para caminos no dirigidos de costo mínimo


Entrada. Un grafo dirigido G, una función de costos no negativa, y un nodo i de G.
Salida. T , el árbol de caminos no dirigidos más cortos comenzando en i.
1. Inicializar como vacíos T , S y el vector marca. Inicializar como infinito el vector c.
2. Hacer marca(i) = ∗, c(i) = 0.
3. Mientras haya un nodo k que no está en S tal que c(k) ̸= ∞, repetir lo siguiente.
Hallar el nodo k′ tal que c(k′ ) = mı́nk∈S ′
/ c(k) e incluir k en S.
Explorar la lista de vecinos “out” de k′ , y para cada nodo k de esa lista tal que k no esté en S y
c(k′ ) + w(k′ , k) < c(k), hacer marca(k) = k′ y c(k) = c(k′ ) + w(k′ , k).
Explorar la lista de vecinos “in” de k′ , y para cada nodo k de esa lista tal que k no esté en S y
c(k′ ) + w(k, k′ ) < c(k), hacer marca(k) = −k′ y c(k) = c(k′ ) + w(k, k′ ).
4. Para todos los nodos j marcados (excepto i), añadir a T el arco (marca( j), j) si marca( j) es
positiva, y el arco ( j, marca( j)) si marca( j) es negativa.
5. Devolver T .

Listas de vecinos “out” e “in”


Nodo Vecinos “out” Vecinos “in”
1 7(30), 8(9) 2(9), 3(41), 9(14)
2 1(9) 3(42), 8(12)
3 1(41), 2(42), 4(32), 5(60), 9(25) 4(45)
4 3(45), 6(40) 3(32), 5(25)
5 4(25), 6(25), 7(41) 3(60), 9(33)
6 7(10) 4(40), 5(25)
7 8(11) 1(30), 5(41), 6(10), 8(11), 9(21)
8 2(12), 7(11) 1(9), 7(11)
9 1(14), 5(33), 7(21) 3(25)

Tabla 4.5: Listas de vecinos “out” e “in” del grafo de la figura 4.2, junto con los costos de los arcos.
Grafos y Combinatoria. Javier Tejel 131

Ejemplo 4.3. Para el grafo dirigido de la figura 4.2, calcular el árbol de caminos no dirigidos de costo
mínimo con raíz en el nodo 4.
Solución. Recordamos las listas de vecinos “out” e “in” para ese grafo en la tabla 4.5. En la tabla 4.6 se
muestran todas las tablas que se irían construyendo en el desarrollo del algoritmo.

N. M. C. N. M. C. N. M. C. N. M. C. N. M. C.
1 1 1 1 3 73 1 3 73
2 2 2 2 3 74 2 3 74
3 3 -4 32 3 -4 32 3 -4 32 3 -4 32
4 * 0 4 * 0 4 * 0 4 * 0 4 * 0
5 5 -4 25 5 -4 25 5 -4 25 5 -4 25
6 6 4 40 6 4 40 6 4 40 6 4 40
7 7 7 5 66 7 5 66 7 5, 6 66,
 50

8 8 8 8 8
9 9 9 -5 58 9 −5,
 3 58,
 57
 9 −5,
 3 58,
 57

(a) (b) (c) (d) (e)

N. M. C. N. M. C. N. M. C. N. M. C.
1 3 73 1 3, 9 73,
 71
 1 3, 9, -8 73,

 71,
 70 1 3, 9, -8 73,

 71,
 70
2 3 74 2 3 74 2 3, 8 74,
 73 2 3, 8 74,
 73
3 -4 32 3 -4 32 3 -4 32 3 -4 32
4 * 0 4 * 0 4 * 0 4 * 0
5 -4 25 5 -4 25 5 -4 25 5 -4 25
6 4 40 6 4 40 6 4 40 6 4 40
7 5, 6 66, 50

 7 5, 6 66, 50

 7 5, 6 66, 50

 7 5, 6 66, 50


8 7 61 8 7 61 8 7 61 8 7 61
9 −5, 3
  58, 57

 9 −5, 3
  58, 57

 9 −5, 3
 58, 57

 9 −5, 3
 58, 57


(f) (g) (h) (i)

Tabla 4.6: Tablas con la ejecución del algoritmo de Dijkstra para el árbol de caminos no dirigidos más
cortos con raíz en el nodo 4.

El funcionamiento es el mismo que el descrito en los ejercicios anteriores y no vamos a dar los
detalles de la ejecución. La principal diferencia radica en que se pone un menos en la marca de un nodo,
cuando se usa un arco hacia atrás. Por ejemplo, en la tabla 4.6b, cuando se ha añadido el nodo 4 a S y
se están procesando las listas de vecinos “out” e “in” del nodo 4, como es más barato ir al nodo 3 hacia
atrás ((w(3, 4) = 32) que hacia adelante (w(4, 3) = 45), se pone -4 como marca del nodo 3 y 32 como
c(3).
En la figura 4.5 se muestra el árbol de caminos no dirigidos más cortos comenzando en el nodo 4.
Ahora, podemos llegar al nodo 1 desde el 4 con un camino no dirigido de costo 70, mientras que en el
caso dirigido el costo del camino dirigido más corto para llegar al nodo 1 desde el 4 era 82.

Cuando el grafo de partida es un grafo no dirigido G y queremos calcular el árbol de caminos más
cortos desde un vértice i dado, podemos aplicar el algoritmo de Dijkstra procesando las listas de vecinos
“out”, sobre la versión dirigida de G, donde por cada arista (vi , v j ) de G se definen los arcos (vi , v j ) y
(v j , vi ). También se pueden calcular esos caminos más cortos aplicando el algoritmo directamente sobre
las listas de adyacencias.
Nota 4.1. El algoritmo de Dijkstra se puede implementar sobre un grafo dirigido de n nodos y m arcos
de forma que el número de cálculos sea O(m + n2 ). El término n2 aparece porque hacemos O(n) veces
(vamos incorporando los nodos al conjunto S uno tras otro) el cálculo del mínimo de un conjunto de
132 Capítulo 4. Grafos con costos

2
1 9 4
42 32 40
12 41 25
3
14 3 5 6
9 25 32 25 10
30
45
60 9 7
8 21 9 33 4 11
11
25 8
11 41 12
9
7 25 5 40 1 2
10
6

Figura 4.5: Árbol de caminos no dirigidos más cortos con raíz en el nodo 4.

O(n) valores (los c( j)). El término m aparece porque recorremos una sola vez las listas de vecinos
“out”, y el número de elementos en el total de esas listas es precisamente el número de arcos. Hay otras
implementaciones que requieren O(m log(n)) pasos, pero sólo son efectivas si el número de nodos es
muy grande y el número de arcos pequeño.

4.1.2. Algoritmo de Bellman-Ford


El algoritmo de Dijkstra sólo se puede aplicar si los costos sobre los arcos son no negativos. Si hay
costos negativos, el problema del cálculo de los caminos más cortos se complica, puesto que, aunque un
nodo j sea alcanzable desde un nodo i, podría no haber un camino dirigido más corto desde i hasta j,
como sucedía en el grafo de la figura 4.1, donde no existían algunos caminos dirigidos más cortos debido
a la existencia de ciclos con costo negativo.
La existencia o no de ciclos negativos es precisamente lo que permite decidir si se pueden calcular
los caminos dirigidos más cortos, como muestra el siguiente teorema.

Teorema 4.3. Dado un grafo dirigido G = (V, A), una función de costos sobre los arcos, y un nodo i, sea
Vi el conjunto de nodos alcanzables desde i mediante un camino dirigido. Sea Gi el subgrafo inducido
por Vi . Entonces, existe un camino dirigido de costo mínimo desde i hasta j, para todo j ∈ Vi , si y sólo
si, Gi no contiene ciclos dirigidos de costo negativo.

Demostración. Veamos primero que si existe un camino dirigido de costo mínimo desde i hasta j, para
todo j ∈ Vi , entonces Gi no contiene ciclos dirigidos de costo negativo. Supongamos que Gi contiene un
ciclo C de costo negativo. Sea j un nodo de C. A cualquier camino P desde i hasta j podemos añadirle
cuantas veces queramos el ciclo C, obteniendo paseos dirigidos que van de i a j con costo cada vez
menor. Esto implicaría que no existiría un camino con costo mínimo desde i a j, una contradicción.
Recíprocamente, supongamos que Gi no contiene ciclos de costo negativo. En ese caso, cualquier
camino dirigido comenzando en i que no sea simple, tiene un costo mayor o igual que el camino simple
obtenido quitando los ciclos que contiene, puesto que todos esos ciclos tienen costo positivo. Por tanto,
para buscar caminos dirigidos de costo mínimo desde i hasta j, nos basta buscar entre los caminos
dirigidos simples. Como siempre hay un número finito de caminos dirigidos simples, existirá uno con
costo mínimo.

El algoritmo de Bellman-Ford se puede aplicar a cualquier grafo dirigido G de n nodos con costos
arbitrarios. Dado un nodo i, si Gi no contiene ciclos negativos, entonces el algoritmo da una solución al
problema del cálculo de los caminos dirigidos más cortos desde i. En caso contrario, si Gi contiene ciclos
con costo negativo, el algoritmo permite hallar un ciclo dirigido con costo negativo.
El algoritmo va calculando cuál es el costo del camino dirigido más corto desde i hasta j, para todo
j, cuando el camino puede usar a lo más l arcos, para l = 0, 1, . . . , n. El cálculo de los caminos óptimos
Grafos y Combinatoria. Javier Tejel 133

se basa en la siguiente observación. De entre los caminos dirigidos desde i hasta j que usan a lo más
l arcos, sea cl ( j) el costo del óptimo de ellos. Si no existen tales caminos, entonces cl ( j) = ∞. Si el
camino usa menos de l arcos, entonces se tiene que cl ( j) = cl−1 ( j). En caso contrario, si el camino usa
l arcos, el camino será de la forma (i = j0 , j1 , . . . , jl = j). Pero entonces, (i = j0 , j1 , . . . , jl−1 ) tiene que
ser un camino óptimo para llegar a jl−1 usando a lo más (l − 1) arcos, por lo que en ese caso cl ( j) =
cl−1 ( jl−1 )+w( jl−1 , j). Por consiguiente, si conocemos cl−1 (k) para todo nodo k, podemos conocer cl ( j),
pues éste tendrá que ser el mínimo de los valores cl−1 ( j) y mı́n{cl−1 (k) + w(k, j)}, donde este segundo
mínimo está tomado sobre los nodos k que son vecinos “in” de j.
Aunque algunos detalles adicionales del algoritmo de Bellman-Ford los comentaremos más adelante,
damos ya el algoritmo. En cada paso l del algoritmo, jc es una variable que contiene el último nodo j
tal que su valor cl ( j) ha sido modificado, o contiene 0 si ninguno de esos valores ha sido modificado en
ese paso. Veremos después su uso. Como en otras ocasiones, el vector marca dará el predecesor de cada
nodo j en el camino dirigido más corto desde i hasta j.

Algoritmo de Bellman-Ford
Entrada. Un grafo dirigido G, una función de costos no negativa, y un nodo i de G.
Salida. El árbol T de caminos no dirigidos más cortos comenzando en i, o un ciclo de costo negativo.
1. Inicializar como vacíos T y el vector marca. Inicializar como infinito el vector c0 .
2. Hacer l = 0, marca(i) = ∗, c0 (i) = 0, jc = i.
3. Mientras l < n y jc ̸= 0, repetir lo siguiente.
Incrementar l en 1 y hacer jc = 0.
Recorrer los n nodos en el orden 1, 2, . . . , n. Al explorar el nodo j, encontrar entre sus vecinos
“in” el nodo k que minimiza cl−1 (k) + w(k, j). Si cl−1 (k) + w(k, j) < cl−1 ( j), entonces jc = j,
marca( j) = k, cl ( j) = cl−1 (k) + w(k, j). Si cl−1 (k) + w(k, j) ≥ cl−1 ( j), entonces cl ( j) = cl−1 ( j).
4. Si jc = 0, para los nodos j marcados (excepto i) añadir a T los arcos (marca( j), j). Devolver T .
5. Si jc ̸= 0, devolver la secuencia jc, marca( jc), marca(marca( jc)), . . ., pues contiene un ciclo con
costo negativo.
En la ejecución del algoritmo, si el paso 3 termina porque jc = 0 para un cierto valor de l, esto quiere
decir que todos los valores cl ( j) coinciden con los valores cl−1 ( j). Por tanto, si siguiésemos calculando
los valores cl ( j) para los siguientes valores de l, siempre se repetirían los mismos datos cl ( j). Esto
implica que cl ( j) contiene el costo de un camino óptimo de i a j cuando permitimos que contenga un
número arbitrario l de arcos, con lo que cl ( j) va a ser el costo de la solución óptima para el camino
dirigido mas corto desde i hasta j. Podemos construir entonces el árbol de caminos dirigidos más cortos
desde el nodo i hasta los nodos marcados, utilizando las marcas.
Por el contrario, supongamos que el paso 3 termina porque l = n (y entonces jc ̸= 0). Como el valor
cn ( jc) se ha modificado en la etapa l = n, necesariamente en la etapa anterior se ha modificado el valor
de cn−1 (marca( jc)), y así sucesivamente. En particular, esto implica que existe un camino P desde i
hasta jc con n arcos, con costo menor que cualquier otro camino con menos arcos. Por tanto, en P debe
aparecer necesariamente un nodo k repetido, con lo que la parte de P entre las repeticiones del nodo k es
un ciclo. Si el ciclo tuviese costo positivo, al eliminarlo obtendríamos un camino dirigido desde i hasta
jc con a lo más n arcos y con costo menor que P, una contradicción. Por tanto, el costo de ese ciclo debe
ser negativo.
Veamos algunos ejemplos de aplicación del método.
Ejemplo 4.4. Para el grafo dirigido con costos en los arcos de la figura 4.2, calcular mediante el algoritmo
de Bellman-Ford el árbol de caminos dirigidos de costo mínimo desde el nodo 4.
Solución. En el ejemplo 4.1, ya calculamos dicho árbol, que se encuentra en la figura 4.3. Por comodidad,
reproducimos las tablas de vecinos “out” e “in” del grafo de la figura 4.2.
134 Capítulo 4. Grafos con costos

Listas de vecinos “out” e “in”


Nodo Vecinos “out” Vecinos “in”
1 7(30), 8(9) 2(9), 3(41), 9(14)
2 1(9) 3(42), 8(12)
3 1(41), 2(42), 4(32), 5(60), 9(25) 4(45)
4 3(45), 6(40) 3(32), 5(25)
5 4(25), 6(25), 7(41) 3(60), 9(33)
6 7(10) 4(40), 5(25)
7 8(11) 1(30), 5(41), 6(10), 8(11), 9(21)
8 2(12), 7(11) 1(9), 7(11)
9 1(14), 5(33), 7(21) 3(25)

Veamos cómo se iría ejecutando el algoritmo de Bellman-Ford, cuando comenzamos en el nodo 4.


Como en otras ocasiones, para una mejor visualización, vamos a emplear una tabla con tres columnas,
como la mostrada en la tabla 4.7a. La primera columna con los nodos (N.), la segunda con las marcas de
los nodos (M.), y la tercera (C.) con los costos cl ( j) de los caminos dirigidos más cortos desde el nodo 4
a los nodos j, usando a los más l arcos.

l=0 l=1 l=2 l=3


N. M. C. N. M. C. N. M. C. N. M. C.
1 1 1 3 86 1 3, 9 86,
 84
2 2 2 3 87 2 3 87
3 3 4 45 3 4 45 3 4 45
4 * 0 4 * 0 4 * 0 4 * 0
5 5 5 3 105 5 3, 9 
105,
 103
6 6 4 40 6 4 40 6 4 40
7 7 7 6 50 7 6 50
8 8 8 8 7 61
9 9 9 3 70 9 3 70
(a) (b) (c) (d)

l=4 l=5 l=6


N. M. C. N. M. C. N. M. C.
1 3, 9 86,
 84 1 86,
3, 9, 2 
 84,
 82 1 86,
3, 9, 2 
 84,
 82
2 3, 8 87,
 73 2 3, 8  73
87,
 2 3, 8  73
87,

3 4 45 3 4 45 3 4 45
4 * 0 4 * 0 4 * 0
5 3, 9 
105, 103
 5 3, 9 105, 103
 5 3, 9 105, 103

6 4 40 6 4 40 6 4 40
7 6 50 7 6 50 7 6 50
8 7 61 8 7 61 8 7 61
9 3 70 9 3 70 9 3 70
(e) (f) (g)

Tabla 4.7: Tablas con la ejecución del algoritmo de Bellman-Ford comenzando en el nodo 4.

Cuando l = 0, marcamos el nodo 4 con *, pues es la raíz del árbol e inicializamos c0 (4) = 0. Véase
la tabla 4.7a. Al pasar a l = 1, como el único costo que ha variado en la etapa l = 0 ha sido c0 (4) = 0, los
únicos costos que podrían variar ahora son los de aquellos nodos que tengan al nodo 4 en sus listas de
vecinos “in”. Dichos nodos son el 3 y el 6. Para el nodo 3, tenemos que c1 (3) = c0 (4) + w(4, 3) = 0 + 45
Grafos y Combinatoria. Javier Tejel 135

y para el nodo 6 tenemos que c1 (6) = c0 (4) + w(4, 6) = 0 + 40. Véase la tabla 4.7b.
Cuando l = 2, los costos que pueden variar son los de los nodos que tengan al 3 y 6 en sus listas de
vecinos “in”, pues el 3 y el 6 son los únicos nodos que han cambiado su costo en la etapa l = 1. El nodo
3 está en las listas de vecinos “in” de los nodos 1, 2, 4, 5 y 9, y el nodo 6 en la lista de vecinos “in” del
nodo 7. Los costos asociados a los nodos en esta etapa se muestran en la tabla 4.7c. Por ejemplo, para el
nodo 1, tenemos que c2 (1) = c1 (3) + w(3, 1) = 45 + 41 = 86. Notar que para el nodo 4, se podría llegar
desde el 3 con costo c1 (3) + w(3, 4) = 45 + 32 = 77, pero como esta cantidad es mayor que c1 (4) = 0,
se mantiene para c2 (4) el costo c1 (4).
La tabla 4.7d muestra los costos actualizados cuando l = 3. Por ejemplo, para el nodo 1, como
sus vecinos “in” son el 2, el 3 y el 9, hay que calcular el mínimo de c2 (2) + w(2, 1) = 87 + 9 = 96,
c2 (3) + w(3, 1) = 45 + 41 = 86 y c2 (9) + w(9, 1) = 70 + 14 = 84. Como ese mínimo, 84, es menor que
c2 (1) = 86, entonces c3 (1) = 84 y la nueva marca del nodo 1 será 9.
La tabla 4.7e muestra los costos actualizados cuando l = 4. El único que cambia es el correspondiente
al nodo 2, puesto que c3 (8) + w(8, 2) = 61 + 12 = 73, que es menor que c3 (2) = 87.
Como en la etapa l = 4 el único costo que ha cambiado es el correspondiente al nodo 2, el único
nodo que podría variar su costo cuando l = 5 es el nodo 1, que es el único nodo que tiene al nodo 2 en
la lista de vecinos “in”. Como c4 (2) + w(2, 1) = 73 + 9 = 82 es menor que c4 (1) = 84, actualizamos el
costo y la marca asociados al nodo 1. Véase la tabla 4.7f.
Al pasar a l = 6 (véase la tabla 4.7g), ninguno de los costos cambia. En ese caso, el algoritmo termina
dando el árbol de caminos dirigidos más cortos desde el nodo 4, que se construye a partir de las marcas
(el arco (2, 1), el arco (8, 2), el arco (4, 3), ...), y que coincide con el mostrado en la figura 4.3.
Ejemplo 4.5. Para el grafo dirigido con costos en los arcos de la figura 4.6, que es el mismo de la figura
4.1, calcular mediante el algoritmo de Bellman-Ford el árbol de caminos dirigidos de costo mínimo desde
el nodo 1, o dar un ciclo con costo negativo en caso de que no se pueda.

Listas de vecinos “in”


Nodo Vecinos “in”
3 4 1
1
1
2 1(10)
1 10
2 10 −3 5 3 2(10), 5(-3)
4 3(1)
1 8 7 6 10 5 4(1)
1 10 6 5(10)
Figura 4.6: Grafo dirigido con costos. 7 6(10), 8(1)
8 1(1)

Tabla 4.8: Listas de vecinos “in” y costos asociados.

Solución. La tabla 4.9 muestra las diferentes tablas que se van obteniendo en la ejecución del algoritmo
de Bellman-Ford. Se puede observar que, cuando el algoritmo llega a la etapa l = n = 8 (véase la tabla
4.9i), alguno de los costos se ha actualizado. En este caso, los costos correspondientes a los nodos 3 y
6, c8 (3) y c8 (6), que pasan de 19 y 32, a 18 a 31, respectivamente, Esto es así puesto que en la etapa
anterior se había modificado el costo c7 (5) asociado al nodo 5, que había pasado de 22 a 21, y el nodo 5
es un vecino “in” del 3 y del 6.
Lo que implica la modificación de costos en la etapa l = n = 8 es que la longitud del camino dirigido
más corto desde el nodo 1 al nodo 6 (o al 3) es 8, por lo que necesariamente hay un ciclo en ese camino
y de costo negativo. Por ejemplo, partiendo del nodo 6, que es uno de los nodos que han modificado
su costo en la etapa l = 8, y siguiendo las marcas, obtenemos que, en el camino más corto hasta el 6,
llegaríamos desde el nodo 5, al 5 desde el 4, al 4 desde el 3 y al 3 desde el 5, nodo que se repite. Por
tanto, el ciclo (5, 3, 4, 5) es un ciclo con costo negativo. En efecto, si calculamos su costo, tenemos que
w(5, 3) + w(3, 4) + w(4, 5) = −3 + 1 + 1 = −1.
136 Capítulo 4. Grafos con costos

l=0 l=1 l=2 l=3 l=4


N. M. C. N. M. C. N. M. C. N. M. C. N. M. C.
1 * 0 1 * 0 1 * 0 1 * 0 1 * 0
2 2 1 10 2 1 10 2 1 10 2 1 10
3 3 3 2 20 3 2 20 3 2 20
4 4 4 4 3 21 4 3 21
5 5 5 5 5 4 22
6 6 6 6 6
7 7 7 8 2 7 8 2 7 8 2
8 8 1 1 8 1 1 8 1 1 8 1 1
(a) (b) (c) (d) (e)

l=5 l=6 l=7 l=8


N. M. C. N. M. C. N. M. C. N. M. C.
1 * 0 1 * 0 1 * 0 1 * 0
2 1 10 2 1 10 2 1 10 2 1 10
3 2, 5 
20,
 19 3 2, 5 
20,
 19 3 2, 5 
20,
 19 3 2, 5, 5 
20,
 19,
 18
4 3 21 4 3, 3 
21,
 20 4 3, 3 
21,
 20 4 3, 3 21,
 20
5 4 22 5 4 22 5 4, 4 
22,
 21 5 4, 4 22,
 21
6 5 32 6 5 32 6 5 32 6 5, 5 32,
 31
7 8 2 7 8 2 7 8 2 7 8 2
8 1 1 8 1 1 8 1 1 8 1 1
(f) (g) (h) (i)

Tabla 4.9: Tablas con la ejecución del algoritmo de Bellman-Ford para los caminos dirigidos más cortos
comenzando en el nodo 1.

Nota 4.2. Dado un grafo dirigido de n nodos y m arcos, la complejidad del algoritmo de Bellman-Ford
para el cálculo de los caminos dirigidos de menor costo es O(nm). Esto es así puesto que el paso 2 del
algoritmo hay que realizarlo en el peor de los casos n veces, y en cada una de esas iteraciones se exploran
las listas “in” de todos los nodos, que en global contienen m elementos.

Nota 4.3. Para calcular todos los caminos dirigidos más cortos desde todos los nodos i hasta todos los
nodos j, una primera opción sería repetir n veces el algoritmo de Dijkstra o el de Bellman-Ford. Para
cada i, calcular el árbol de caminos dirigidos más cortos comenzado en i.
Hay otros algoritmos que pueden ser más eficientes. Uno de ellos es el de Floyd-Warshall, que se
basa en calcular las cantidades cli j , donde cli j representa el costo del camino dirigido más corto desde i
hasta j usando los nodos 1, 2, . . . , l. Si no existe dicho camino, entonces cli j vale ∞. Se puede demostrar
que
cli j = mı́n{cl−1 l−1 l−1
i j , cil + cl j }

lo que da un método de complejidad O(n3 ) para el cálculo de todos los caminos dirigidos más cortos.

4.1.3. Algoritmo de Ford para un DAG


Si nuestro grafo de entrada es un DAG, el cálculo de los caminos dirigidos más cortos se simplifica
bastante. Por una parte, como un DAG no contiene ciclos, no puede contener en particular un ciclo de
costo negativo. Por tanto, siempre existirán los caminos dirigidos más cortos comenzando en un nodo
dado.
Por otra parte, un DAG siempre tiene un orden compatible donde los arcos van de izquierda a derecha,
como vimos en la sección 3.2.3. Esto implica que, explorando los nodos en el orden compatible con el
Grafos y Combinatoria. Javier Tejel 137

DAG, para calcular el camino dirigido más corto hasta un nodo j nos basta con conocer los caminos más
cortos hasta los vecinos “in” de j, que ya estarán calculados previamente, pues todos los nodos “in” de
j han de aparecer antes que j en el orden compatible. El costo c( j) del camino dirigido más corto desde
i hasta j será c( j) = mı́nk {c(k) + w(k, j)}, donde el mínimo se calcula sobre todos los nodos k que son
vecinos “in” de j.
El algoritmo de Ford para calcular los caminos dirigidos más cortos desde un nodo i se describe a
continuación. Como en algoritmos previos, el vector marca dará los predecesores de los nodos j alcan-
zables desde i, en los caminos dirigidos más cortos desde i hasta los nodos j. Notar que todos los nodos
que aparezcan antes que el nodo i en el orden compatible van a ser inalcanzables desde i. También puede
suceder que algún nodo posterior a i en el orden compatible tampoco sea alcanzable desde i.

Algoritmo de Ford para el cálculo de caminos dirigidos más cortos en un DAG


Entrada. Un DAG G, una función de costos, y un nodo i de G.
Salida. El árbol T de caminos dirigidos más cortos comenzando en i.

1. Hallar un orden compatible para el DAG.


2. Inicializar como vacíos T y el vector marca. Inicializar como infinito el vector c.
3. Hacer marca(i) = ∗, c(i) = 0.
4. Siguiendo el orden compatible, explorar los nodos posteriores a i (en ese orden compatible) que
tengan sus listas “in” no vacías.
Al explorar el nodo j, sea k′ su vecino “in” tal que c(k′ ) + w(k′ , j) = mı́nk {c(k) + w(k, j)}, donde
el mínimo se calcula para todos los nodos k que sean vecinos “in” de j.
Si c(k′ ) + w(k′ , j) es finito, hacer marca( j) = k′ y c( j) = c(k′ ) + w(k′ , j).
5. Para los nodos j marcados (excepto i) añadir a T los arcos (marca( j), j). Devolver T .

Veamos un ejemplo de aplicación.

Ejemplo 4.6. Para el DAG con costos representado en la figura 4.7, calcular los caminos más cortos
desde el nodo 7 a los demás.

2 Listas de vecinos “in”


1 2
−3 Nodo Vecinos “in”
3 1 4(-2)
−2 1
−2 2 1(2), 4(3), 5(1)
9 −2 3 2(-3), 6(1), 9(-2)
3
−3 4 7(4)
2
8 −1 −1 4 5 1(-2), 4(1), 8(-1)
6 5(4), 9(-1)
2 1
1 7
4 1 8 7(2)
7 4
5
9 5(2), 7(1), 8(-3)
6
Tabla 4.10: Listas de vecinos “in” y
Figura 4.7: DAG con costos. costos asociados.

Solución. La tabla 4.10 muestra las listas de vecinos “in” del grafo de la figura 4.7, con los costos de los
arcos incorporados entre paréntesis.
Lo primero que hay que realizar es el sort topológico (ver la sección 3.2.3) para encontrar un orden
compatible con el DAG. Al realizar el sort topológico procesando las listas de vecinos “in”, las capas
138 Capítulo 4. Grafos con costos

encontradas se muestran en la figura 4.8a. A partir de las capas, un orden compatible con el DAG sería
el orden 7, 4, 8, 1, 5, 2, 9, 6 y 3.

1 1
4 −2 2 2 4 −2 2 2
4 −2 3 −3 4 −2 3 −3
7 1 1 3 7 1 1 3
4 6 4 6
1 1 1 1
5 −1 0 5 −1
2 2
2 −1 −2 2 −1 −2
8 8
−3 9 −3 9
(a) (b)

1
1 4 −2 2 2
4 −2 2 2 4 3 −3
7 4 −2 1 3
4 −2 3 −3 1
7 4 1 3 4 6
1 4 6 1
0 1
0 1 1 5 2 −1
5 2 −1 −2
2 −1
2 −1 −2 8
8 −3 9
−3 9 2
(c) (d)

1 1
4 −2 2
2 2 4 −2 2
2 2
4 4 −2 3 −3 4 4 −2 3 −3
7 1 1 3 7 1 1 3
4 6 0 4 6
0 1 1 1 1
5 −1 0 5 −1
2 2
2 −1 −2 2 −1 −2
8 8
−3 9 −3 9
2 2
(e) (f)

1 1
4 −2 2
2 2 4 −2 2
2 2
4 4 −2 3 1 −3 4 4 −2 3 1 −3
7 1 1 3 7 1 1 3
0 4 6 0 4 6
1 1 0 1 1
0 5 −1 5 −1
2 2
2 −1 −2 2 −1 -1 −2
8 8
−3 9 −3 9
2 2
(g) (h)

1 1
4 −2 2
2 2 4 −2 2
2 2
4 4 −2 3 1 −3 4 4 −2 3 1 −3
7 1 1 3 7 1 1 3
0 4 6 0 4 6
1 -2 1 1 -2 1
0 5 −1 0 5 −1 -3
2 2
2 −1 -1 −2 2 −1 -1 −2
8 8
−3 9 −3 9
2 2
(i) (j)

Figura 4.8: Algoritmo de Ford sobre el DAG de la figura 4.7 para el cálculo de los caminos dirigidos más
cortos desde el nodo 7.
Grafos y Combinatoria. Javier Tejel 139

Tenemos que calcular los caminos dirigidos más cortos comenzando en el nodo 7. Como es el primero
en el orden compatible, tenemos que explorar todos los nodos del DAG, según el orden compatible. Si el
DAG no tiene muchos nodos ni muchos arcos, los cálculos se suelen realizar más rápidamente utilizando
una representación gráfica del DAG, como se muestra en la figura 4.8, aunque normalmente los cálculos
se van almacenando en una tabla, como la que se muestra en la tabla 4.11.
En primer lugar se define c(7) = 0 (en rojo, al lado del nodo 7 en la figura 4.8b), puesto que es lo que
cuesta llegar al 7 desde el 7. A continuación, el primer nodo que hay que explorar es el nodo 4. Como
sólo tiene un vecino “in“, el 7, el costo de llegar al nodo 4 desde el 7 por el camino dirigido más corto
será c(7) + w(7, 4) = 0 + 4 = 4. En la figura 4.8c aparece en rojo dicho costo, así como el arco utilizado
para llegar nodo 4.
El siguiente nodo a procesar es el nodo 8. Como el nodo 7 es el único vecino “in” del 8, vuelve a
suceder lo mismo que con el nodo 4, y el costo de llegar al nodo 8 desde el 7 a través del camino dirigido
más corto es c(7) + w(7, 8) = 0 + 2 = 2. Véase la figura 4.8d.
Ahora toca el nodo 1. Sólo tiene un vecino “in”, el nodo 4. Por tanto, al nodo 1 se va a llegar desde
el nodo 7 a través del nodo 4, con un costo de c(4) + w(4, 1) = 4 − 2 = 2. Véase la figura 4.8e.
El siguiente nodo a explorar es el nodo 5, al que se puede llegar desde el 1, el 4 o el 8. Hay que calcular
entonces el mínimo de c(1)+w(1, 5) = 2−2 = 0, c(4)+w(4, 5) = 4+1 = 5 y c(8)+w(8, 5) = 2−1 = 1.
Como la menor de esas cantidades es 0, el camino dirigido más corto llegará al nodo 5 desde el 7 a través
del nodo 1. Véase la figura 4.8f.
Así se seguirían procesando los nodos 2, 9, 6 y 3 (ver las figuras 4.8g, 4.8h,4.8i y 4.8j). El árbol de
caminos dirigidos más cortos desde el nodo 7 se muestra en la figura 4.8j, junto con los costos de dichos
caminos (en rojo al lado de cada nodo).

N. M. C.
1 4 2
2 5 1
3 9 -3
4 7 4
5 1 0
6 9 -2
7 * 0
8 7 2
9 8 -1

Tabla 4.11: Algoritmo de Ford sobre el DAG de la figura 4.7 para el cálculo de los caminos dirigidos más
cortos desde el nodo 7.

La tabla 4.11 sería la tabla resumen de los cálculos. En la columna marca (M.) se va colocando para
cada nodo j su vecino “in” k′ , para el que se minimiza c(k) + w(k, j). La columna costo (C.) almacena
los costos de los caminos dirigidos más cortos desde el nodo 7 al resto de los nodos.

El algoritmo anterior tiene una fácil adaptación al caso en el que queramos calcular los caminos
dirigidos más largos comenzando en un nodo i. La única diferencia es que, en lugar de calcular el mínimo
de las cantidades c(k) + w(k, j) para los nodos k vecinos “in” de un nodo j, ahora hay que calcular el
máximo de esas cantidades. Aunque a priori parecería que no tiene mucho interés calcular caminos
dirigidos más largos, tiene sus aplicaciones, como veremos en la sección 4.2.
El algoritmo para el cálculo de caminos dirigidos más largos en un DAG sería el siguiente.

Algoritmo de Ford para el cálculo de caminos dirigidos más largos en un DAG


Entrada. Un DAG G, una función de costos, y un nodo i de G.
Salida. El árbol T de caminos dirigidos más largos comenzando en i.
140 Capítulo 4. Grafos con costos

1. Hallar un orden compatible para el DAG.


2. Inicializar como vacíos T y el vector marca. Inicializar como -infinito el vector c.
3. Hacer marca(i) = ∗, c(i) = 0.
4. Siguiendo el orden compatible, explorar los nodos posteriores a i (en ese orden compatible) que
tengan sus listas “in” no vacías.
Al explorar el nodo j, sea k′ su vecino “in” tal que c(k′ ) + w(k′ , j) = máxk {c(k) + w(k, j)}, donde
el máximo se calcula para todos los nodos k que sean vecinos “in” de j.
Si c(k′ ) + w(k′ , j) es finito, hacer marca( j) = k′ y c( j) = c(k′ ) + w(k′ , j).
5. Para los nodos j marcados (excepto i) añadir a T los arcos (marca( j), j). Devolver T .

Nota 4.4. Una alternativa al algoritmo anterior es resolver un problema de caminos dirigidos más cortos
con la función de costos w′ , donde w′ (i, j) = −w(i, j). Calcular caminos dirigidos más largos con la
función de costos w es equivalente a calcular caminos dirigidos más cortos con la función de costos w′ .

1 1
4 −2 0
2 2 4 −2 0
2 2
4 −2 3 −3 4 −2 3 −3
7 1 1 3 7 1 1 3
4 6 4 6
1 1 1 -2 1
5 2 −1 5 2 −1
2 −1 −2 2 −1 −2
8 8
−3 9 −3 9
(a) (b)

1 1
4 −2 0
2 2 4 −2 0
2 2
4 −2 3 2 −3 4 −2 3 2 −3
7 1 1 3 7 1 1 3
4 6 4 6
1 -2 1 1 -2 1
5 2 −1 5 2 −1
2 −1 −2 2 −1 0 −2
8 8
−3 9 −3 9
(c) (d)

1 1
4 −2 0
2 2 4 −2 0
2 2
4 −2 3 2 −3 4 −2 3 2 −3
7 1 1 3 7 1 1 3
4 62 4 62
1 -2 1 1 -2 1
5 5 3
2 −1 2 −1
2 −1 0 −2 2 −1 0 −2
8 8
−3 9 −3 9
(e) (f)

Figura 4.9: Algoritmo de Ford sobre el DAG de la figura 4.7 para el cálculo de los caminos dirigidos más
largos desde el nodo 1.

Ejemplo 4.7. Para el DAG con costos representado en la figura 4.7, calcular los caminos más largos
desde el nodo 1 a los demás.

Solución. En el ejemplo 4.6, ya calculamos un orden compatible con el DAG de la figura 4.7, el orden
7, 4, 8, 1, 5, 2, 9, 6 y 3.
Grafos y Combinatoria. Javier Tejel 141

Como los nodos 7, 4 y 8 están antes que el nodo 1 en el orden compatible, no van a existir caminos
dirigidos desde el 1 a esos nodos. Luego el algoritmo comenzará asignado c(1) = 0 (véase la figura 4.9a)
y procesará los nodos 5, 2, 9, 6 y 3 en ese orden.
El proceso de cálculo se ilustra en la figura 4.9. El primer nodo que se procesa es el nodo 5, que tiene
tres vecinos “in”, los nodos 1, 4 y 8. Como el único de sus vecinos que tiene costo finito asociado es el
nodo 1, el costo del camino más largo desde el nodo 1 al nodo 5 será c(1) + w(1, 5) = 0 − 2 = −2. Véase
la figura 4.9b.
Las figuras 4.9c y 4.9d ilustran el cálculo de los caminos dirigidos más largos hasta los nodos 2 y 9,
respectivamente. Para encontrar el camino dirigido más largo desde el nodo 1 al 6 (véase la figura 4.9e),
hay que calcular el máximo de c(5) + w(5, 6) = −2 + 4 = 2 y c(9) + w(9, 6) = 0 − 1 = −1, puesto que
el nodo 6 tiene a los nodos 5 y 9 como sus vecinos “in”. El máximo de esas cantidades es 2, por lo que
el camino dirigido más largo desde el 1 llegará al nodo 6 desde el 5. La figura 4.9f muestra el árbol de
caminos más largos desde el nodo 1. La tabla 4.12 muestra el resumen de los cálculos.

N. M. C.
1 * 0
2 1 2
3 6 3
4
5 1 -2
6 5 2
7
8
9 5 0

Tabla 4.12: Tabla resumen con el cálculo de los caminos dirigidos más largos desde el nodo 1.

Los dos algoritmos anteriores son fácilmente adaptables a los casos en los que se quiera calcular los
caminos dirigidos más cortos o más largos desde los diferentes nodos a un nodo inicial i. La diferencia
está en que los nodos ahora hay que explorarlos en orden inverso al orden compatible con el DAG, y en
lugar de calcular el mínimo o el máximo de las cantidades c(k) + w(k, j) para los nodos k que son vecinos
“in” de j, hay que calcular el mínimo o el máximo de las cantidades c(k) + w( j, k), para los nodos k que
son vecinos “out” de j.
Los dos nuevos algoritmos quedarían de la siguiente manera.

Algoritmo de Ford para el cálculo de caminos dirigidos más cortos terminando en un nodo
Entrada. Un DAG G, una función de costos, y un nodo i de G.
Salida. El árbol T de caminos dirigidos más cortos terminando en i.

1. Hallar un orden compatible para el DAG.


2. Inicializar como vacíos T y el vector marca. Inicializar como infinito el vector c.
3. Hacer marca(i) = ∗, c(i) = 0.
4. Siguiendo el orden inverso al orden compatible, explorar los nodos anteriores a i (en ese orden
inverso) que tengan sus listas “out” no vacías.
Al explorar el nodo j, sea k′ su vecino “out” tal que c(k′ ) + w( j, k′ ) = mı́nk {c(k) + w( j, k)}, donde
el mínimo se calcula para todos los nodos k que sean vecinos “out” de j.
Si c(k′ ) + w( j, k′ ) es finito, hacer marca( j) = k′ y c( j) = c(k′ ) + w( j, k′ ).
5. Para los nodos j marcados (excepto i) añadir a T los arcos ( j, marca( j)). Devolver T .
142 Capítulo 4. Grafos con costos

Algoritmo de Ford para el cálculo de caminos dirigidos más largos terminando en un nodo

Entrada. Un DAG G, una función de costos, y un nodo i de G.


Salida. El árbol T de caminos dirigidos más largos terminando en i.

1. Hallar un orden compatible para el DAG.


2. Inicializar como vacíos T y el vector marca. Inicializar como -infinito el vector c.
3. Hacer marca(i) = ∗, c(i) = 0.
4. Siguiendo el orden inverso al orden compatible, explorar los nodos anteriores a i (en ese orden
inverso) que tengan sus listas “out” no vacías.
Al explorar el nodo j, sea k′ su vecino “out” tal que c(k′ ) + w( j, k′ ) = máxk {c(k) + w( j, k)}, donde
el máximo se calcula para todos los nodos k que sean vecinos “out” de j.
Si c(k′ ) + w( j, k′ ) es finito, hacer marca( j) = k′ y c( j) = c(k′ ) + w( j, k′ ).
5. Para los nodos j marcados (excepto i) añadir a T los arcos ( j, marca( j)). Devolver T .

Ejemplo 4.8. Para el DAG con costos representado en la figura 4.7, calcular los caminos más cortos y
los más largos desde los diferentes nodos hasta el nodo 3.

Solución. El orden compatible que habíamos calculado para ese DAG era el orden 7, 4, 8, 1, 5, 2, 9, 6 y
3. Como queremos caminos dirigidos más cortos que terminen en el nodo 3, tendremos que procesar los
nodos en el orden 3, 6, 9, 2, 5, 1, 8, 4 y 7, que es el inverso del orden compatible.

N. M. C.
1 1 5 -4
4 −2 -4 2 2 2 3 -3
4 -6 −2 3 -3 −3 3 * 0
7 1 1 3
4 61 4 1 -6
1 -2 1
-3 5 0 5 2 -2
2 −1
2 −1 -2 −2 6 3 1
8 7 8 -3
−3 9
-5 8 9 -5
Figura 4.10: Cálculo de los caminos dirigidos más 9 3 -2
cortos hasta el nodo 3.
Tabla 4.13: Tabla resumen de los cálcu-
los.

La figura 4.10 y la tabla 4.13 muestran el resumen del cálculo de los caminos más cortos de los
diferentes nodos al nodo 3.
Para el nodo 3, hacemos c(3) = 0. Para el nodo 6, como sólo tiene un vecino “out”, el nodo 3, el
camino más corto desde el 6 hasta el 3 será c(3) + w(6, 3) = 0 + 1 = 1. Para el nodo 9, como tiene dos
vecinos “out”, el 6 y el 3, habrá que elegir el mínimo de las cantidades c(6) + w(9, 3) = 1 − 1 = 0 y
c(3) + w(9, 3) = 0 − 2 = −2. Luego el camino dirigido más corto para ir del 9 al 3 es ir directamente
al nodo 3, en lugar de pasar por el 6. El nodo 2 sólo tiene al 3 como vecino “out”, luego c(2) = c(3) +
w(2, 3) = 0 − 3 = −3. El nodo 5 tiene tres vecinos ´´out”, el 2, el 6 y el 9. Luego hay que elegir el
mínimo entre c(2) + w(5, 2) = −3 + 1 = −2, c(6) + w(5, 6) = 1 + 4 = 5 y c(9) + w(5, 9) = −2 + 2 = 0.
Luego lo más corto para ir desde el 5 hasta el 3 es ir a través del 2. Para el resto de los nodos, los cálculos
serían similares.
Grafos y Combinatoria. Javier Tejel 143

N. M. C.
1 1 5 3
4 −2 3
2 2 2 3 -3
4 6 −2 3 -3 −3 3 * 0
7 1 1 3
4 61 4 5 6
10 1 5 1 0
5 2 −1 5 6 5
2 −1 0 −2 6 3 1
8 7 4 10
−3 9
4 8 5 4
Figura 4.11: Cálculo de los caminos dirigidos más 9 6 0
largos hasta el nodo 3.
Tabla 4.14: Tabla resumen de los cálcu-
los.

La figura 4.11 y la tabla 4.14 muestran el resumen del cálculo de los caminos dirigidos más largos
hasta el 3. Por ejemplo, para el nodo 9, ahora es más largo ir hasta el 3 pasando por el 6 (c(6) + w(9, 6) =
1 − 1 = 0), que ir directamente hasta el 3 (c(0) + w(9, 3) = 0 − 2 = −2). Para el nodo 5, como tiene tres
vecinos “out”, hay que elegir el máximo de c(2) + w(5, 2) = −3 + 1 = −2, c(6) + w(5, 6) = 1 + 4 = 5 y
c(9) + w(5, 9) = 0 + 2 = 2. Luego lo más largo para ir desde el nodo 5 hasta el 3 es ir a través del nodo
6. Para el resto de los nodos, los cálculos son similares.

Nota 4.5. Una vez obtenido el orden compatible para el DAG G de n nodos y m arcos, la complejidad
del algoritmo de Ford es O(m). Conforme se van explorando los nodos, se van explorando las listas de
vecinos “in” de todos ellos, una sola vez, y el total de elementos entre todas las listas de vecinos “in”
coincide con el número de arcos m.

4.2. Técnicas PERT-CPM de planificación de proyectos


En esta sección vamos a ver una aplicación muy interesante del sort topológico (ver la sección 3.2.3)
y del cálculo de caminos dirigidos más cortos y más largos en un DAG (ver la sección 4.1.3). Esta
aplicación se enmarca dentro de un conjunto de técnicas conocidas por el nombre genérico de técnicas
PERT. Por técnicas PERT (acrónimo de Project Evaluation and Review Technique) se entiende todas las
herramientas matemáticas y estadísticas que se suelen usar para la gestión de grandes proyectos, en los
que hay que realizar y coordinar múltiples tareas para completarlos.
Una de las técnicas empleadas en esa gestión de proyectos es el método del camino crítico (método
CPM, Critical Path Method), que resuelve la cuestión central de cómo programar las tareas, cuándo debe
empezar cada una de ellas, y cómo se van realizando con el paso del tiempo. Esta sección la vamos a
dedicar a describir dicha técnica, que utiliza como base el algoritmo del sort topológico y el algoritmo
de Ford para el cálculo de caminos dirigidos más cortos y más largos en un DAG.
Para ilustrar el método CPM, vamos a suponer que nuestro proyecto consiste en construir una nueva
urbanización en nuestra ciudad, y sólo es necesario realizar 13 tareas para llevarla a cabo. Las tareas, las
unidades de tiempo que se necesitan para llevarlas a cabo (por ejemplo, su duración en semanas), y qué
tareas han tenido que ser completadas antes de poder comenzar una determinada tarea, vienen dadas en
la tabla 4.15. Por ejemplo, la tarea B cuesta realizarla 14 semanas, y no puede empezarse hasta que no se
hayan terminado las tareas A y E. Las restricciones de orden, como que B no puede hacerse hasta que no
se haya acabado A, pueden ser debidas a causas lógicas (no se puede poner el tejado si no está hecho el
edificio), u organizativas (las tareas A y B las hacen los mismos trabajadores y prefieren empezar por la
tarea A).
La tabla 4.15 se puede interpretar como un grafo dirigido G, donde los nodos son las tareas a realizar,
y las tareas en la segunda columna los vecinos “in” de cada nodo. Por ejemplo, que la tarea B tenga que
hacerse después de la A, indica que existe el arco (A, B) en G. Para que las tareas puedan realizarse
144 Capítulo 4. Grafos con costos

Tarea Después de Duración


A 26
B A, E 14
C B, F 31
D C, H, K 18
E 20
F E, I 19
G B, E, F 10
H C, G, J 10
I 15
J F, I 16
K G, J 18
L J, K 21
M G, H, K 23

Tabla 4.15: Resumen de las tareas a realizar.

cumpliendo esas restricciones de orden, es necesario que no haya ciclos dirigidos en G, es decir, G tiene
que ser un DAG. Si existiese un ciclo, por ejemplo que la tarea A se tenga que hacer antes que la B, la
B antes que la C y la C antes que la A, no habría manera de realizar las tareas, pues no habría forma de
comenzar.
Una de las primeras cuestiones que interesa calcular es la duración del proyecto, es decir, el número
de semanas que se requieren como mínimo para completar todas las tareas. Esa duración del proyecto
no tiene por qué ser la suma de las duraciones de todas las tareas, pues muchas tareas podrían hacerse de
forma simultánea. En el ejemplo, inicialmente podemos comenzar simultáneamente con las tareas A, E e
I, pues no hay restricciones de orden para ellas. La duración del proyecto será la suma de las duraciones
de todas las tareas sólo si las tareas han de realizarse secuencialmente, una detrás de otra.
Otra de las cuestiones de interés es conocer cuándo se puede comenzar cada tarea. Por ejemplo, si
fuésemos los gestores de la obra, tendríamos que decirles a los trabajadores que van a hacer cada tarea, en
qué fecha tienen que comenzar a hacer esa tarea. Esas fechas se suelen denominar fechas tempranas de
comienzo, y las denotaremos mediante t(·). Así, t(K) indicaría en qué fecha puede comenzar a realizarse
la tarea K, si las tareas se van realizando según lo planificado.

A C D
A C D 31
26 14 10 18
0 B 31 H
B H F inal
Inicio E 20 14 G 10 10 M
E G M 0 23
20 10
19 10 18
20 F 19 K 18
F K 0 16
I 15 19 J 18 L 21
I J L 16
15 16
(a) (b)

Figura 4.12: Red del proyecto.

Para calcular la duración del proyecto y las fechas tempranas de comienzo, lo primero que hay que
hacer es comprobar que nuestro grafo es un DAG. Esta comprobación se puede realizar aplicando el
algoritmo del sort topológico procesando las listas de vecinos “in”, que además nos permite ordenar los
nodos por capas en caso de que el grafo sea un DAG. En nuestro ejemplo, tras la aplicación del sort
topológico, las capas obtenidas se muestran en la figura 4.12a. A una representación de este tipo se la
suele denominar red del proyecto.
Observar que en la red hay algunos arcos que resultan redundantes. Por ejemplo, el arco (I, J) es
Grafos y Combinatoria. Javier Tejel 145

redundante, ya que si F tiene que hacerse antes que J, e I antes que F, necesariamente I ha de realizarse
antes que J. Se podrían buscar y quitar los arcos redundantes, pero como lleva su tiempo, nosotros
dejaremos el grafo como está.
Una vez comprobado que nuestro grafo de tareas es un DAG y calculadas las capas, se hace lo
siguiente. Añadimos al grafo un nodo llamado Inicio, que indica el comienzo del proyecto, el momento
en el que pueden comenzar las obras. Para cada tarea X cuyo grado “in“ sea cero en la red del proyecto,
añadimos un arco desde el nodo Inicio hasta X. En nuestro ejemplo, como las tareas A, E e I no tienen
vecinos “in”, añadimos los arcos (Inicio, A), (Inicio, E) y (Inicio, I) (ver la figura 4.12b). Si lo miramos
como tarea, Inicio es una actividad que debería “hacerse” antes que todas las demás. Al añadir los tres
arcos (Inicio, A), (Inicio, E) y (Inicio, I) conseguimos precisamente que esta tarea se haga antes que
todas las demás, no sólo antes que las tareas A, E e I.
De forma similar, añadimos otro nodo Final, que indica la finalización del proyecto, la entrega de
llaves, el momento en que todas las tareas están terminadas. Como tarea, Final debe realizarse después
de todas las demás tareas, y para conseguir eso basta con añadir un arco (X, Final), para cada tarea X
cuyo grado “out” en el grafo sea 0. En el ejemplo, esas tareas son D, M y L, por lo que añadimos a nuestro
grafo los arcos (D, Final), (M, Final) y (L, Final) (ver la figura 4.12b). Notar que las tareas sin sucesor
no son necesariamente las de la última capa.
Por último, añadimos a cada arco un costo. Para un arco cualquiera (X,Y ), su costo w(X,Y ) será la
duración de la tarea X, teniendo en cuenta que si X es Inicio, entonces esa duración es cero. Véase la
figura 4.12b.
Una vez definida la red del proyecto con costos, veamos cómo calcular las fechas tempranas de
comienzo t(·) para todas las tareas, incluidas las tareas Inicio y Final. Obviamente, t(Inicio) = 0, que
es el instante en el que vamos a comenzar el proyecto. Dada una tarea j, sean j1 , . . . , jl las tareas de
las que depende, es decir, sus vecinos “in” en la red. Suponiendo que cualquier tarea jk comienza a
realizarse en el instante t( jk ), el instante en el que finaliza dicha tarea es t( jk ) + w( jk , j), pues w( jk , j) es
la duración de la tarea jk . Como j no puede empezar hasta que no se hayan finalizado las tareas j1 , . . . , jl ,
necesariamente
t( j) = máx{t(k) + w(k, j)}
k
donde k recorre todos los vecinos (tareas) “in” de la tarea j.
Luego el problema de calcular las fechas tempranas de comienzo no es más que el problema de
calcular el árbol de caminos dirigidos más largos en la red con costos comenzando en Inicio, que se
calcula mediante el algoritmo de Ford visto en la sección 4.1.3.
La figura 4.13 ilustra la aplicación del algoritmo de Ford, procesando los nodos (tareas) por capas, de
izquierda a derecha. Al lado de cada nodo aparece en rojo el costo del camino dirigido más largo desde el
Inicio hasta ese nodo, que no es más que la fecha temprana de comienzo de la tarea. Por ejemplo, para la
tarea B, la fecha temprana de comienzo es 26, que es cuando termina la tarea A, tarea que da el máximo
entre t(A) + w(A, B) = 0 + 26 y t(E) + w(A, B) = 0 + 20.
Observar que la duración del proyecto va a ser precisamente la fecha temprana de comienzo para
el nodo Final, que es precisamente el instante en el que se podría comenzar la tarea Final, indicando
la finalización de todas las tareas previas. Esta fecha temprana de comienzo para el nodo Final es la
longitud del camino dirigido más largo desde Inicio a Final, el camino dirigido

Inicio, A, B,C, H, M, Final

en nuestro ejemplo.
Este camino, llamado el camino crítico del proyecto, explica por qué la duración mínima del pro-
yecto es 104, pues las actividades del camino crítico tienen que hacerse en ese orden, y la suma de sus
duraciones, 26 + 14 + 31 + 10 + 23, es la duración mínima del proyecto. A las actividades que aparecen
en el camino crítico se les llama actividades críticas, y cualquier retraso en su realización implica un
retraso de la misma magnitud en la duración del proyecto.
Sin embargo, hay otras actividades que, aunque se retrasen algo, es posible que el proceso no se
retrase. Por ejemplo, si la tarea I del ejemplo se hubiese retrasado tres unidades de tiempo, y hubiese
146 Capítulo 4. Grafos con costos

A C D A C D
31 31
0 26 14 0 26 14
10 18 10 18
0 B 31 H 0 B 31 H
Inicio E 20 14 G 10 10 M F inal Inicio E 20 14 G 10 10 M F inal
0 23 0 26 23
20 10 20 10
0 0 19 10 18 0 0 19 10 18
20 F 19 K 18 20 F 19 K 18
0 16 0 16
I 15 19 J 18 L 21 I 15 19 J 18 L 21
16 20 16
0 15 16 0 15 16

(a) (b)

A C D A C D
31 31
0 26 14 0 26
4031 H 10 18 14 4031 H 10 18
0 B 0 B
Inicio E 20 14 G 10 10 M F inal Inicio E 20 14 G 10 10 M F inal
0 26 23 0 26 71 23
20 10 20 10
0 0 19 4010 18 0 0 19 4010 18
20 F 19 K 18 20 F 19 K 18
0 0
I 15 19 J 16 18 L 21 I 15 19 J 16 18 L 21
20 16 20 16 55
0 15 39 16 0 15 39 16

(c) (d)

A C D A C D
31 31
0 26 14 0 26 14
4031 H 10 81 18 4031 H 10 81 18
0 B 0 B
Inicio E 20 14 G 10 10 M F inal Inicio E 20 14 G 10 10 M F inal
0 26 71 23 0 26 71 23
20 10 20 10
0 0 19 4010 18 81 0 0 19 4010 18 81 104
20 F 19 K 18 0
20 F 19 K 18
0
I 15 19 J 16 55 18 L 21 I 15 19 J 16 55 18 L 21
20 16 20 16
0 15 39 16 73 0 15 39 16 73
(e) (f)

Figura 4.13: Algoritmo de Ford sobre la red del proyecto con costos para el cálculo de los caminos
dirigidos más largos desde el nodo Inicio.

empezado en la fecha 3 en lugar de la fecha 0, terminando en la fecha 18 en lugar de la 15, no se hubiese


producido ningún retraso en el proyecto, pues las tareas F y J que dependen de la finalización de la tarea
I se hubiesen podido comenzar en sus fechas tempranas de comienzo, que eran 20 y 39, respectivamente.
La cantidad máxima en la que una tarea puede retrasarse sin que eso suponga necesariamente un
retraso de la duración del proyecto se llama holgura de esa tarea. Por definición, las actividades críticas
tiene holgura 0, pues cualquier retraso en ellas genera un retraso en el proyecto. Para calcular las holguras,
hay que calcular para cada actividad otra fecha, llamada fecha tardía de comienzo, que es la fecha en
la que puede comenzar una actividad como muy tarde, sin que eso suponga retrasos en la duración del
proyecto. Representando por T (X) a la fecha tardía de comienzo de la actividad X, la holgura h(X) de la
actividad X será por definición h(X) = T (X) − t(X).
Por ejemplo, la tarea D puede comenzar en cualquier fecha en el rango [81, 86] sin producir retraso,
ya que aún empezando en la fecha 86, se terminaría su ejecución en la fecha 86 + 18 = 104. Sin embargo
si empezase en la fecha 87, el proyecto se retrasaría en una unidad de tiempo. Para la tarea D, diríamos
que su holgura h(D) es de 5 unidades, la diferencia entre la fecha tardía de comienzo, T (D) = 86, y la
temprana, t(D) = 81. De la misma forma, la fecha tardía para la tarea L sería T (L) = 83, por lo que L
tiene una holgura de 10 unidades.
Aunque el nodo Final no es ninguna tarea, se define T ( f inal) como la duración del proyecto, es
decir, T (Final) = 104 (no se puede acabar más tarde de la fecha 104). De esa forma, la fecha tardía
de comienzo para la tarea D sería T (Final) − w(D, Final) = 104 − 18 = 86, puesto que D sólo tiene al
nodo Final como vecino “out”. En general, las fechas tardías de comienzo se calculan de la siguiente
manera. Dada una tarea j, sean j1 , . . . , jl las tareas que no pueden comenzar si no ha finalizado dicha
tarea, es decir, sus vecinos “out” en la red. Si la tarea jk puede comenzar como muy tarde en la fecha
T ( jk ), la tarea j puede comenzar como muy tarde en la fecha T ( jk ) − w( j, jk ), donde recordar que
Grafos y Combinatoria. Javier Tejel 147

A C D A C D
31
31
26 14
26 10 86 18
14
31 H 10 18 0 B 31 H
0 B 14 F inal
Inicio E 14 G 10 10 M F inal Inicio E 20 G 10 10 M
20 0 23
0 23 20 10
20 10 19 10 18 81 104
20 F
19 10 K
18 104
0
20 F 19 K 18
0 19 18 16
I 19 J 16
18 L 21 I 15 19 J 18 L 21
15 16
16 15 16
15 16 83
(a) (b)

A C D A C D
31 40 31
26 14 26 14
10 86 18 10 86 18
0 B 31 H 0 B 31 H
Inicio E 20 14 G 10 10 M F inal Inicio E 20 14 G 10 10 M F inal
0 71 23 0 71 23
20 10 20 10
19 10 18 81 104 19 5310 18 81 104
20 F 19 K 18 20 F 19 K 18
0 16 0
I 15 19 J 18 L 21 I 15 19 J 16 18 L 21
16 63 16 63
15 16 15 47 16
83 83
(c) (d)

A C D A C D
40 31 40 31
26 14 0 26 14
10 86 18 10 86 18
0 B 31 H 0 B 31 H
Inicio E 20 14 G 10 10 M F inal Inicio E 20 14 G 10 10 M F inal
0 26 71 23 0 26 71 23
20 10 20 10
19 5310 18 81 104 0 1 19 5310 18 81 104
0
20 F 19 K 18 0
20 F 19 K 18
I 15 19 J 16 18 L 21 I 15 19 J 16 18 L 21
21 16 63 21 16 63
15 47 16 6 15 47 16
83 83
(e) (f)

Figura 4.14: Algoritmo de Ford sobre la red del proyecto con costos para el cálculo de los caminos
dirigidos más cortos hasta el nodo Final.

w( j, jk ) es la duración de la tarea j. Si la tarea j comenzase más tarde de la fecha T ( jk ) − w( j, jk ), la


tarea jk nunca podría comenzar antes de la fecha T ( jk ). Por tanto, j nunca puede comenzar más tarde de
T ( jk ) − w( j, jk ), para cualquiera de sus vecinos “out”. En consecuencia, necesariamente

T ( j) = mı́n{T (k) − w( j, k)}


k

donde k recorre todos los vecinos (tareas) “out” de la tarea j.


Luego el problema de calcular las fechas tardías de comienzo no es más que el problema de calcular
el árbol de caminos dirigidos más cortos desde todas las tareas hasta la tarea Final, donde ahora el costo
de un arco ( j, k) es −w( j, k), el opuesto de la duración de la tarea j. Como antes, estos caminos más
cortos se pueden calcular mediante el algoritmo de Ford visto en la sección 4.1.3.
La figura 4.14 ilustra el algoritmo de Ford por capas, de derecha a izquierda, para el cálculo del
árbol de los caminos dirigidos más cortos hasta el nodo Final. Las aristas del árbol se van coloreando
en azul y el costo del camino dirigido más corto desde cada tarea al Final, que no es más que la fecha
tardía de comienzo de la tarea, aparece coloreado en azul al lado de cada nodo. Notar que el algoritmo
comienza en el nodo Final, y el costo de dicho nodo es T (Final) = 104, no 0 como suele ser habitual en
los cálculos de los caminos más cortos. Esto es así puesto que ahora hay que interpretar el costo como
lo más tarde que se puede empezar una tarea, y en el caso del nodo Final, lo más tarde que se puede
empezar es la fecha 104 para que el proyecto no esté retrasado.
A modo de ejemplo, veamos cómo se calcula la fecha tardía de comienzo para la tarea K. Como
lo más tarde que pueden empezar las tareas D, M y L (sus vecinos “out”) es en las fechas 86, 81 y 83,
respectivamente, lo más tarde que puede empezar la tarea K para no retrasar a las tareas D, M y L es la
fecha más pequeña de 86 − 18 = 68, 81 − 18 = 63 y 83 − 18 = 65, que es 63.
148 Capítulo 4. Grafos con costos

Tarea Después de Duración t(·) T (·) h(·)


A 26 0 0 0
B A, E 14 26 26 0
C B, F 31 40 40 0
D C, H, K 18 81 86 5
E 20 0 1 1
F E, I 19 20 21 1
G B, E, F 10 40 53 13
H C, G, J 10 71 71 0
I 15 0 6 6
J F, I 16 39 47 8
K G, J 18 55 63 8
L J, K 21 73 83 10
M G, H, K 23 81 81 0

Tabla 4.16: Fechas tempranas y tardías de comienzo, así como holguras.

Observar que el camino crítico Inicio, A, B,C, H, M, Final vuelve a aparecer en el árbol de caminos
más cortos. Esto es así porque, al tomar los costos negativos, lo que antes era lo más largo para ir del
Inicio al Final ahora es lo más corto para ir del Inicio al Final.
La tabla 4.16 muestra el resumen de las fechas tempranas de comienzo y las fechas tardías de co-
mienzo, así como las holguras.

Nota 4.6. Este método del camino crítico es fácilmente adaptable para algunas restricciones adicionales
al problema. Veamos un par de restricciones fácilmente adaptables.
Supongamos que nos dicen que una cierta tarea X no puede comenzar hasta pasadas d unidades de
tiempo desde el inicio del proyecto. En este caso, nos basta con añadir un arco desde Inicio hasta la tarea
X con costo w(Inicio, X) = d.
Supongamos que nos dice ahora que la tarea Y no puede comenzar hasta pasadas d unidades de
tiempo tras la finalización de la tarea X. En este caso, nos basta redefinir el costo del arco que conecta X
con Y de forma que sea la suma de la duración de la tarea X y las d unidades de tiempo de retraso en el
comienzo de la tarea Y .

Nota 4.7. En la práctica, no se suele conocer con exactitud cuál es la duración de una tarea, si no que sólo
se conoce su duración de una forma aproximada. En esos casos, se suele asumir que la duración de una
tarea se comporta como una variable aleatoria (una variable normal, una uniforme, ...). Asumiendo ese
comportamiento aleatorio de las duraciones de las tareas, se realizan entonces simulaciones mediante
ordenador sobre cómo se comportaría el proyecto. A través de esas simulaciones, se pueden obtener
estadísticas sobre el proyecto: cuál sería en promedio su duración, cuáles serían las actividades críticas,
cuáles serían las fechas aproximadas de comienzo de las tareas, cuáles serían las holguras, ...

4.3. Árboles generadores de costo mínimo


Supongamos que el grafo no dirigido de la figura 4.16 refleja un estudio sobre lo que costaría realizar
las diferentes conexiones entre los nodos de una red de comunicaciones, y el objetivo es minimizar el
costo de realizar algunas de estas conexiones, garantizando que siempre se pueda enviar información
desde cualquier vértice a cualquier otro. Para que siempre se pueda enviar información entre dos vértices
cualesquiera, hay que garantizar la conectividad de la red. Ya vimos en la sección 3.1.4 que cualquier
grafo conexo minimal debe ser un árbol, por lo que nuestro problema se traduce en encontrar el árbol ge-
nerador de costo mínimo sobre la red. Recordar que dado un grafo G = (V, E), un subgrafo es generador
si su conjunto de vértices coincide con V .
Grafos y Combinatoria. Javier Tejel 149

En esta sección, el problema que vamos a estudiar es el siguiente. Dado un grafo no dirigido G =
(V, E) y una función de costos w no negativa, encontrar el árbol generador de costo mínimo (o MST o
minimum spanning tree), donde el costo del árbol es la suma de los costos de las aristas que lo componen.
Por comodidad, seguiremos utilizando i, j, . . . para denotar a los vértices del grafo.
Antes de continuar, veamos el concepto de bosque.
Definición 4.1. Un grafo no dirigido G de n vértices es un bosque si cada una de las componentes
conexas de G es un árbol.
Notar que si una componente conexa está formada por un único vértice, esta componente también se
considera un árbol. Notar además que si G es un bosque formado por k árboles, al añadir una arista que
conecte vértices en árboles diferentes, el resultado un bosque con k − 1 árboles, donde los dos árboles
conectados por la arista añadida se transforman en un sólo. Por tanto, hay que añadir k − 1 aristas para
transformar un bosque con k árboles en un árbol generador.

Figura 4.15: Un bosque y un árbol.

Por ejemplo, la parte izquierda de la figura 4.15 muestra un bosque generador con 8 vértices, com-
puesto de tres árboles. La parte de la derecha de la figura muestra un árbol generador obtenido añadiendo
dos nuevas aristas (en discontinuo) al bosque, que permiten conectar los diferentes subárboles.
El siguiente teorema da la propiedad fundamental para encontrar un árbol generador de costo mínimo.
Teorema 4.4. Sea G = (V, E) un grafo no dirigido conexo y w una función de costos no negativa. Sea
B = {(V1 , E1 ), (V2 , E2 ), . . . , (Vk , Ek )} un bosque generador de G, con k > 1, y sea F = ∪ki=1 Ei . De entre
todas las aristas de G que conectan un vértice de V1 y un vértice que no está en V1 , sea (i, j) la de costo
mínimo. Entonces, de entre los árboles generadores conteniendo todas las aristas de F, hay uno de costo
mínimo que contiene a la arista (i, j).
Demostración. Notar que al ser B es un bosque generador, cada uno de los subgrafos (Vi , Ei ) es un árbol,
los conjuntos Vi son disjuntos dos a dos, y su unión es V .
Como G es conexo, necesariamente existe en G alguna arista que conecta algún vértice de V1 con
algún vértice que no está en V1 . De entre todas las aristas de G que conectan vértices de V1 con vértices
que no están en V1 , sea e = (i, j) la de costo mínimo, es decir, la que tiene menor costo w(i, j), con i ∈ V1
y j∈ / V1 .
Sea F la familia de árboles generadores de G que contienen a F, que es no vacía pues G es conexo.
De entre todos los árboles generadores en la familia F , sea T = (V, F ′ ) uno de costo mínimo. Si e =
(i, j) pertenece a T , ya hemos terminado. Supongamos por el contrario que T no contiene a la arista
e = (i, j). Si añadimos a T la arista (i, j), por el Teorema 3.4 obtenemos necesariamente un ciclo C que
la contiene. Supongamos que el ciclo es C = (i = j0 , j = j1 , j2 , . . . , jl = i). Como j1 = j no pertenece
a V1 y jl = i sí, debe existir una arista e′ = ( jr , jr+1 ) en C tal que jr ∈ / V1 y jr+1 ∈ V1 . Definamos el
grafo T ′ = T + e − e′ con n − 1 aristas, donde se añade a T la arista e y se elimina la arista e′ . Por cada
camino P de T , se puede construir un camino P′ en T ′ sustituyendo la arista e′ , si es que pertenece a
P, por el camino C − e′ . Por tanto, como T era conexo, entonces T ′ también lo es, con lo que T ′ es un
árbol generador. Además, claramente T ′ pertenece a F . Por otra parte, si w(T ) es el costo del árbol
T , entonces w(T ′ ) = w(T ) + w(i, j) − w( jr , jr+1 ). Por hipótesis sobre la elección de (i, j), se tiene que
w( jr , jr+1 ) ≥ w(i, j), por lo que w(T ′ ) ≤ w(T ). Al ser T un árbol generador en F de costo mínimo,
necesariamente w(T ′ ) = w(T ), con lo que T ′ satisface el teorema.
150 Capítulo 4. Grafos con costos

El Teorema 4.4 es la base del diseño de varios algoritmos para encontrar el árbol generador de costo
mínimo. Nosotros vamos a ver dos de éllos, el algoritmo de Prim y el de Kruskal.

4.3.1. Algoritmo de Prim


El algoritmo de Prim funciona de la siguiente manera. Inicialmente se toma el bosque formado por
los n árboles Ti = (Vi , Ei ), con Vi = {i} y Ei = 0.
/ Como F = 0,/ buscar un árbol mínimo que contenga a F
es equivalente a buscar un mínimo árbol generador de G. Por tanto, tomando V1 = {1}, por el Teorema
4.4 la arista (1, k) que minimiza w(1, k) = mı́n j {w(1, j)}, donde j recorre todos los vecinos de 1, forma
parte de un mínimo árbol generador de G. Una vez elegida esa arista, se repite el proceso tomando como
nuevo conjunto V1 = {1, k}. Por el Teorema 4.4, la arista (i, j) que minimice w(i, j), con i en V1 y j no
en V1 , va a formar parte de un árbol generador mínimo que contenga a (1, k). Reiterando el proceso, se
van obteniendo aristas con la propiedad de que el mínimo árbol generador que las contiene es un árbol
generador mínimo de G. Como al final obtenemos n − 1 aristas, necesariamente obtenemos un mínimo
árbol generador de G.
Resumiendo, el algoritmo quedaría de la siguiente manera. El conjunto S irá almacenado los vértices
ya procesados (los vértices que se van añadiendo a la componente V1 del Teorema 4.4) y el vector marca
irá dando los predecesores de los vértices en el mínimo árbol generador. El vector c( j) irá almacenado
para cada vértice j todavía no en S el costo mínimo de conectarlo a los vértices en S.

Algoritmo de Prim para el cálculo de un MST


Entrada. Un grafo no dirigido G y una función de costos w no negativa.
Salida. Un mínimo árbol generador de G.

1. Inicializar como vacíos S, T y el vector marca. Inicializar como infinito el vector c.


2. Para un vértice i, hacer marca(i) = ∗, c(i) = 0.
3. Mientras haya vértices j que no están en S, hacer lo siguiente.
Hallar el vértice j′ tal que c( j′ ) = mı́n j {c( j)}, donde j recorre todos los vértices que no están en
S. Incluir j′ en S.
Explorar la lista de vecinos de j′ . Para cada vecino j de j′ que no esté en S y además w( j′ , j) < c( j),
hacer c( j) = w( j′ , j) y marca( j) = j′ .
4. Para todos los vértices j (excepto i) añadir a T las aristas (marca( j), j). Devolver T .

Veamos un ejemplo.

2 Listas de vecinos
1 9
42 Vértice Vecinos
12 41
3 1 2(9), 3(41), 7(30), 8(9), 9(14)
14 2 1(9), 3(42), 8(12)
9 25 3 1(41), 2(42), 4(32), 5(60), 9(25)
30 32
60 4 3(32), 5(25), 6(40)
8 21 9 4 5 3(60), 4(25), 6(25), 7(41), 9(33)
33
11 6 4(40), 5(25), 7(10)
25
41 7 1(30), 5(41), 6(10), 8(11), 9(21)
8 1(9), 2(12), 7(11)
7 25 5 40
10 9 1(14), 3(25), 5(33), 7(21)
6
Tabla 4.17: Listas de vecinos, junto con los
Figura 4.16: Grafo no dirigido con costos. costos de las aristas.
Grafos y Combinatoria. Javier Tejel 151

Ejemplo 4.9. Hallar mediante el algoritmo de Prim el mínimo árbol generador del grafo mostrado en la
figura 4.16.

Solución. Como en otras ocasiones, iremos realizando los diferentes cálculos sobre una tabla con tres
columnas. La primera para los vértices, la segunda para las marcas, y la tercera para ir guardando para
cada vértice j no en S el costo mínimo de conectarlo a los vértices de S. En las diferentes tablas, iremos
marcando en rojo el vértice que se incluye en S y en azul el menor de los c( j) para los vértices j todavía
no en S.
Vamos a comenzar en el vértice 8 (podíamos haber empezado en cualquier otro vértice), al que
colocamos * como marca y c(8) = 0. Los demás costos c( j) tendrán valor ∞. Véase la tabla 4.18a. El
menor de todos los c( j) no en S corresponde al nodo 8 (c(8) = 0), con lo que incluimos en S (marcado
en rojo en la tabla 4.18b). Los vecinos del vértice 8 son el 1, el 2 y el 7. Como todos tienen c( j) = ∞,
marcamos a los tres vértices con la marca 8 y actualizamos los costos a c(1) = w(8, 1) = 9, c(2) =
w(8, 2) = 12 y c(7) = w(8, 7) = 11. Véase la tabla 4.18b.

N. M. C. N. M. C. N. M. C. N. M. C. N. M. C.
1 1 8 9 1 8 9 1 8 9 1 8 9
2 2 8 12 2 8, 1 12,
 9
 2 8, 1 12,
 9
 2 8, 1 12,
 9

3 3 3 1 41 3 1 41 3 1 41
4 4 4 4 4
5 5 5 5 5 7 41
6 6 6 6 6 7 10
7 7 8 11 7 8 11 7 8 11 7 8 11
8 * 0 8 * 0 8 * 0 8 * 0 8 * 0
9 9 9 1 14 9 1 14 9 1 14
(a) (b) (c) (d) (e)

N. M. C. N. M. C. N. M. C. N. M. C.
1 8 9 1 8 9 1 8 9 1 8 9
2 8, 1 12, 9
 2 8, 1 12, 9
 2 8, 1 12, 9
 2 8, 1 12, 9

3 1 41 3 1, 9 41,
 25
 3 1, 9 41,
 25
 3 1, 9 41,
 25
4 6 40 4 6 40 4 6, 3 40,
 32
 4 6, 3, 5 40,

 32,
 25
5 7, 6 41,
 25
 5 7, 6 41,
 25
 5 7, 6 41,
 25
 5 7, 6 41,
 25
6 7 10 6 7 10 6 7 10 6 7 10
7 8 11 7 8 11 7 8 11 7 8 11
8 * 0 8 * 0 8 * 0 8 * 0
9 1 14 9 1 14 9 1 14 9 1 14
(f) (g) (h) (i)

Tabla 4.18: Tablas con la ejecución del algoritmo de Prim para el cálculo del mínimo árbol generador.

El menor de los c( j) para los vértices j todavía no en S es c(1) = 9, por lo que el siguiente vértice
que pasa a S es el vértice 1. Sus vecinos son los vértices 2, 3, 7, 8 y 9. Como el 8 ya está en S, no hay que
actualizar su costo. Para el vértice 7, tenemos que c(7) = 11 < w(1, 7) = 30, por lo que tampoco hay que
actualizar su costo. Para los vértices 3 y 9, teníamos c( j) = ∞, con lo que los marcamos con 1 y hacemos
c(3) = w(1, 3) = 41 y c(9) = w(1, 9) = 14. Por último, para el vértice 2, como c(2) = 12 < w(1, 2) = 9,
actualizamos la marca del vértice 2 a 1 y actualizamos su costo a 9. Véase la tabla 4.18c.
De entre todos los costos de los vértices no en S (c(2) = 9, c(3) = 41, c(7) = 11 y c(9) = 14 en la
tabla 4.18c), el menor es 9, por lo que el vértice 2 es el siguiente que pasa a S. Los vecinos del vértice
2 son el 1, el 3 y el 8. Los vértices 1 y 8 ya están en S, y c(3) = 41 < w(2, 3) = 42, con lo que no es
necesario actualizar ningún costo. Véase la tabla 4.18d.
152 Capítulo 4. Grafos con costos

2
1 9
42
12 41
3
14
9 25
30 32
60
8 21 9 4
33
11
25
41

7 25
5 40
10
6

Figura 4.17: Mínimo árbol generador para el grafo de la figura 4.16.

Las tablas 4.18e, 4.18f, 4.18g, 4.18h y 4.18i muestran el resto de los cálculos, que son similares a los
realizados hasta ahora. Siguiendo las marcas de la tabla 4.18i, obtendríamos el mínimo árbol generador
que se muestra en la figura 4.17, formado por las aristas (8, 1), (1, 2), (9, 3), (5, 4), (6, 5), (7, 6), (8, 7) y
(1, 9), cuyo costo es 128.

Nota 4.8. Como sucedía en el algoritmo de Dijkstra, la complejidad del algoritmo de Prim es O(m + n2 ),
donde n es el número de vértices del grafo y m el número de aristas. El término n2 aparece porque
hacemos O(n) veces (vamos incorporando los vértices al conjunto S uno tras otro) el cálculo del mínimo
de un conjunto de O(n) valores (los c( j)). El término m aparece porque recorremos una sola vez las listas
de vecinos, y el número de elementos en el total de esas listas es el doble del número de aristas.
Nota 4.9. Los algoritmos de Dijkstra y Prim son muy parecidos, por lo que hay que tener cuidado cuando
se estén aplicando. Mientras que en el algoritmo de Dijkstra la actualización de un costo c( j) se hace
teniendo en cuenta el costo c(k′ ) del predecesor k′ de j en el camino dirigido más corto desde i hasta
j, en el algoritmo de Prim se actualiza el costo c( j) con el costo w(k′ , j) de la arista que une j con su
predecesor k′ en el árbol.

4.3.2. Algoritmo de Kruskal


Dado un grafo no dirigido G de n vértices y m aristas, un algoritmo alternativo para encontrar un
árbol generador de costo mínimo es el algoritmo de Kruskal. En cada etapa del algoritmo se añade una
arista e a un bosque F de k componentes, de forma que tras la adición de e se tiene un bosque con k − 1
componentes. Inicialmente, se parte de n componentes (los n vértices aislados), y tras la adición de n − 1
aristas se obtiene un árbol generador. La arista e que se añade en cada etapa es la de menor costo de entre
todas las aristas disponibles en esa etapa, de forma que no se formen ciclos al añadirla. Al ser la arista
disponible de menor costo la que se añade, el Teorema 4.4 garantiza que e forma parte de un MST, por
lo que el resultado final del algoritmo será un mínimo árbol generador de G.
Lo primero que hace entonces el algoritmo es ordenar las m aristas de G de menor a mayor, en
función de su costo, e incluirlas en una lista Q. Luego explora las aristas en ese orden creciente, y las va
añadiendo a un bosque F siempre que no se formen ciclos con las aristas previamente añadidas a F.
Resumiendo, el algoritmo quedaría de la siguiente manera. En el algoritmo, los conjuntos Vi son
los vértices de las componentes conexas del bosque F, y cada vez que se añade una arista, dos de las
componentes se transforman en una sola.

Algoritmo de Kruskal para el cálculo de un MST


Entrada. Un grafo no dirigido G, de n vértices y m aristas, y una función w de costos no negativa.
Salida. Un mínimo árbol generador de G.
Grafos y Combinatoria. Javier Tejel 153

1. Definir una lista Q = {e1 , e2 , . . . , em } de forma que w(e1 ) ≤ w(e2 ) ≤ . . . ≤ w(em ).


2. Crear una partición P = V1 ∪V2 ∪ . . . ∪Vn de V , con Vi = {i}. Inicializar F como vacío.
3. Mientras F no contenga n − 1 aristas, hacer lo siguiente.
Tomar la arista e de Q de menor costo y eliminarla de Q.
Si los extremos de e están en dos conjuntos distintos Vi y V j de la partición P, entonces añadir e a
F, y reemplazar en P los conjuntos Vi y V j por el conjunto Vi ∪V j .
4. Devolver T .
Veamos un ejemplo.
Ejemplo 4.10. Hallar mediante el algoritmo de Kruskal el mínimo árbol generador del grafo mostrado
en la figura 4.16.
Solución. El primer paso es ordenar las aristas según su costo, tal y como se muestra en la tabla 4.19.

Arista Costo Arista Costo


(1, 2) 9 (5, 6) 25
(1, 8) 9 (1, 7) 30
(6, 7) 10 (3, 4) 32
(7, 8) 11 (5, 9) 33
(2, 8) 12 (4, 6) 40
(1, 9) 14 (1, 3) 41
(7, 9) 21 (5, 7) 41
(3, 9) 25 (2, 3) 42
(4, 5) 25 (3, 5) 60

Tabla 4.19: Ordenación de las aristas según su costo para el grafo de la figura 4.16.

A continuación, hay que explorar las aristas de menor costo a mayor costo. Para una mejor visuali-
zación del algoritmo, vamos a utilizar una tabla como la mostrada en la tabla 4.20a, donde la primera
columna contiene los vértices y la segunda una marca para cada vértice. El significado de la marca es
especificar a cuál de los conjuntos Vi pertenece cada vértice. Dos vértices en el mismo conjunto Vi (en la
misma componente conexa) tendrán la misma marca.
Inicialmente todos los vértices están en conjuntos distintos, por lo que todos ellos tienen una marca
distinta. Véase la tabla 4.20a. La arista de menor costo es la arista (1, 2) (también se podía haber elegido
la arista (1, 8), que tiene el mismo costo). Se añade esa arista al conjunto F, y a los vértices 1 y 2 se les
pone la misma marca, la marca 1, para indicar que ya pertenecen a la misma componente conexa de F.
Véase la tabla 4.20b. La siguiente arista a explorar es la arista (1, 8). Como los vértices 1 y 8 están en
grupos distintos, se añade la arista (1, 8) a F y se cambia la marca del 8 a 1, para indicar que los vértices
1, 2 y 8 están todos en la misma componente. Véase la tabla 4.20c. La siguiente arista es la arista (6, 7).
Se añade a F y se cambia la marca del 7 a 6, para indicar que ya están los dos vértices en la misma
componente. Véase la tabla 4.20d.
Ahora toca la arista (7, 8), que conecta la componente del vértice 8, formada por los vértices 1, 2 y
8, y la del vértice 7, formada por los vértices 6 y 7. Se añade (7, 8) a F y se cambian las marcas de los
vértices 6 y 7 (que estaban en el mismo grupo) a 1. Véase la tabla 4.20e. La siguiente arista es la (2, 8),
que descartamos, pues los vértices 2 y 8 están ya en la misma componente (tienen la misma marca) y se
crearía un ciclo si la incluyésemos en F. La siguiente arista es la (1, 9), que se añade a F y se cambia
la marca del 9 a 1. Véase la tabla 4.20f. Así se seguirían procesando las aristas (ver las tablas 4.20g y
4.20h), hasta llegar a la arista (5, 6), que es la última que se incorporaría a F (ver la tabla 4.20i).
Las ocho aristas añadidas a F, las aristas (1, 2), (1, 8), (6, 7), (7, 8), (1, 9), (3, 9), (4, 5) y (5, 6), forman
un mínimo árbol generador de costo 128. De hecho, es el mismo árbol generador que el obtenido con el
algoritmo de Prim (ver la figura 4.17), pero podría ser distinto.
154 Capítulo 4. Grafos con costos

N. M. N. M. N. M. N. M. N. M.
1 1 1 1 1 1 1 1 1 1
2 2 2 2, 1 2 2, 1 2 2, 1 2 2, 1
3 3 3 3 3 3 3 3 3 3
4 4 4 4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5 5
6 6 6 6 6 6 6 6 6 6, 1
7 7 7 7 7 7 7 7, 6 7 7, 6, 1
8 8 8 8 8 8, 1 8 8, 1 8 8, 1
9 9 9 9 9 9 9 9 9 9
(a) (b) (c) (d) (e)

N. M. N. M. N. M. N. M.
1 1 1 1 1 1 1 1
2 2, 1 2 2, 1 2 2, 1 2 2, 1
3 3 3 3, 1 3 3, 1 3 3, 1
4 4 4 4 4 4 4 4, 1
5 5 5 5 5 5, 4 5 5, 4, 1
6 6, 1 6 6, 1 6 6, 1 6 6, 1
7 7, 6, 1 7 7, 6, 1 7 7, 6, 1 7 7, 6, 1
8 8, 1 8 8, 1 8 8, 1 8 8, 1
9 9, 1 9 9, 1 9 9, 1 9 9, 1
(f) (g) (h) (i)

Tabla 4.20: Tablas con la ejecución del algoritmo de Kruskal para el cálculo del mínimo árbol generador.

Nota 4.10. La complejidad del algoritmo de Kruskal es O(m log m), puesto que la parte más costosa del
mismo es la ordenación de las aristas según su costo, y ordenar m datos cuesta O(m log m).

Nota 4.11. El algoritmo de Kruskal también se emplea para clasificar los vértices en k < n grupos, donde
se desea que los vértices de cada grupo sean “parecidos” entre sí. Si queremos obtener k grupos, en lugar
de añadir n − 1 aristas a F (que sería el caso k = 1), habría que añadir sólo n − k aristas. Por ejemplo,
si hubiésemos querido clasificar los vértices del ejemplo 4.10 en tres grupos, hubiésemos añadido a F
sólo 6 aristas, las aristas (1, 2), (1, 8), (6, 7), (7, 8), (1, 9) y (3, 9) (véase la taba 4.20g). De acuerdo a las
marcas de esa tabla, el primero de los grupos estaría compuesto por los vértices {1, 2, 3, 6, 7, 8, 9}, el
segundo por el vértice {4} y el tercero por el vértice {5}.

4.4. Ejercicios propuestos


1. Para el grafo de la figura realizar lo siguiente.

1 2 3 4
20 11 15

9 3 20 9
5 19 4
16
6 9
4 10 7 18 8 8
5

8 3 3 17 21
4 13 15

2 11 19
10 11 12 13
Grafos y Combinatoria. Javier Tejel 155

a) Calcular el camino de costo mínimo desde el nodo 1 al 9 usando el método de Dijkstra.


b) Tomando como grafo la versión no dirigida del grafo anterior hallar un MST.

2. Consideremos un grafo dirigido con conjunto de nodos V = {1, 2, 3, 4, 5, 6, 7, 8, 9}. La siguiente


tabla muestra los vecinos “out” de cada nodo y los costos de los correspondientes arcos.

Nodo Vecinos “out” (costo)


1 6(11), 9(10), 3(3)
2 4(8), 8(12), 5(6)
3 9(5), 8(4), 6(10)
4
5 2(6), 4(4), 1(9)
6 8(9), 2(4), 7(6), 5(11)
7 2(8), 5(12), 9(6)
8 4(5)
9 7(10), 8(13)

a) Calcular el árbol de caminos más cortos desde el nodo 1 a todos los demás.
b) Calcular el árbol de caminos más cortos desde cada nodo hasta el nodo 1.

3. La siguiente tabla da el costo o distancia entre los vértices i y j de una red no dirigida de 12
vértices.

1 2 3 4 5 6 7 8 9 10 11 12
1 10 11 21 30 20 11 21 10 20 31 21
2 10 22 10 20 32 22 10 20 32 42 30
3 11 22 11 41 32 22 31 21 32 42 11
4 21 10 11 30 43 33 20 30 43 53 20
5 30 20 41 30 31 21 13 43 11 21 53
6 20 32 32 43 31 12 22 13 23 12 22
7 11 22 22 33 21 12 11 21 12 22 31
8 21 10 31 20 13 22 11 30 20 32 42
9 10 20 21 30 43 13 21 30 33 22 11
10 20 32 32 43 11 23 12 20 33 10 44
11 31 42 42 53 21 12 22 32 22 10 33
12 21 30 11 20 53 22 31 42 11 44 33

a) Hallar el camino de costo mínimo desde el nodo 12 a todos los demás.


b) Hallar un MST.

4. Para el grafo no dirigido de la figura, calcular el camino de costo mínimo desde cada vértice i a
cada vértice j. Usar el método de Kruskal para agrupar los vértices del grafo en tres grupos.

1 5 4 9
8
5 4 11
3 3 6
15 5 10
2
4 4 3
12

10 8
2 5 7 9

5. Consideremos un grafo no dirigido con conjunto de vértices V = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15}. Los vecinos de cada vértice y los costos de las aristas figuran en la siguiente tabla.
156 Capítulo 4. Grafos con costos

Nodo Vecinos (costo)


1 2(1), 6(4)
2 1(1), 7(4), 6(2), 3(6)
3 2(6), 4(4), 8(3)
4 3(4), 5(1), 10(2), 9(6)
5 4(1), 10(1)
6 1(4), 2(2), 7(1), 11(4)
7 2(4), 6(1), 8(1), 12(2)
8 3(3), 7(1), 9(1), 13(3)
9 4(6), 8(1), 10(2), 14(2)
10 4(2), 5(1), 9(2), 15(4)
11 6(4), 12(1)
12 7(2), 11(1), 13(5)
13 8(3), 12(5), 14(1)
14 9(2), 13(1), 15(6)
15 10(4), 14(6)

a) Calcular el árbol de caminos más cortos desde el nodo 1 a todos los demás.
b) Hallar un MST.

6. Consideremos un grafo dirigido con conjunto de nodos V = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}. Los
vecinos “out” de cada nodo y los costos de los correspondientes arcos figuran en la siguiente tabla.

Nodo Vecinos “out” (costo)


1 2(11), 7(10), 6(3)
2 3(8), 7(12)
3 4(5), 8(4)
4 5(2)
5 10(4)
6 1(9), 2(4), 11(11)
7 12(8), 8(12)
8 3(5), 7(6)
9 4(10), 8(13)
10 4(7), 9(11)
11 6(3), 7(11), 12(8)
12 11(9)

a) Calcular el árbol de caminos dirigidos más cortos desde el nodo 1 a todos los demás.
b) Calcular el árbol de caminos dirigidos más cortos desde los diferentes nodos hasta el nodo 1.
c) Calcular el árbol de caminos no dirigidos más cortos desde el nodo 1 a los demás nodos,
suponiendo que el costo de un arco es el mismo, tanto si se visita hacia adelante como si se
visita hacia atrás.

7. Consideremos un grafo dirigido con conjunto de nodos V = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}. Los
vecinos “out” de cada nodo y los costos de los correspondientes arcos figuran en la tabla 4.21.

a) Calcular el árbol de caminos dirigidos más cortos desde el nodo 1 a todos los demás.
b) Calcular el árbol de caminos dirigidos más cortos desde los diferentes nodos hasta el nodo 1.
c) Calcular el árbol de caminos no dirigidos más cortos desde el nodo 1 a los demás nodos,
suponiendo que el costo de un arco es el mismo, tanto si se visita hacia adelante como si se
visita hacia atrás.
Grafos y Combinatoria. Javier Tejel 157

Nodo Vecinos “out” (costo)


1 6(20), 8(10)
2 8(21)
3 9(11)
4 7(12), 6(40)
5 11(12), 9(41)
6 10(13)
7 1(14), 3(30)
8 5(23), 10(42), 11(40)
9 1(31), 4(20)
10 3(24)
11 2(15), 3(33), 10(22)

Tabla 4.21: Datos para el ejercicio 7.

8. Suponer que el grafo del ejercicio 7 es no dirigido y que los costos de las aristas son los dados en
ese ejercicio.

a) Hallar un MST para ese grafo.


b) Usar el método de Kruskal para clasificar el conjunto de vértices en 3 grupos.
c) Usar el método de Kruskal para clasificar los vértices en grupos, de forma que dos vértices que
estén a distancia menor que 20 estén en un mismo grupo.

9. Para el grafo de la figura siguiente, hallar el árbol de caminos más cortos y el árbol de caminos
más largos desde el nodo s a todos los demás. Hallar también el árbol de caminos más cortos y el
árbol de caminos más largos desde todos los nodos hasta el nodo 11.

s 4 1 −2
2

2 −1 1

1
4 2 2
6 2
3 7
5 2 3
−2 1

1 −2 5
8 9 10 11

10. Para el grafo de la figura siguiente, hallar el árbol de caminos más cortos y el árbol de caminos
más largos desde el nodo s a todos los demás.

s 4 1 −1
2

1 −1
1 2 2

−1
4 4
6 3
3 2 7
5 4 3
−2 3 −1

3 −2 3
8 9 10 11

11. Consideremos un proyecto sobre el que se tiene la información que figura en la tabla 4.22.

a) Trazar la red del proyecto.


b) Para cada actividad, calcular la fecha temprana de comienzo t(·), la fecha tardía de comienzo
T (·), y la holgura h(·). Calcular la duración del proyecto y las actividades críticas.
158 Capítulo 4. Grafos con costos

Act. Pred. Duración


A 5
B A 8
C A 6
D B 10
E B,C 11
F B 8
G D, E 9
H B,C 7

Tabla 4.22: Información sobre el proyecto del ejercicio 11.

12. Consideremos un proyecto sobre el que se tiene la siguiente información.

Act. Pred. Duración


G C 25
P R, D 60
F 25
H F 52
E P, H 59
A R, D 24
C B 30
R B 48
B 52
D F 50

a) Trazar la red del proyecto.


b) Para cada actividad, calcular la fecha temprana de comienzo t(·), la fecha tardía de comienzo
T (·), y la holgura h(·). Calcular la duración del proyecto y las actividades críticas.

13. Consideremos un proyecto sobre el que se tiene la siguiente información.

Act. Pred. Duración


A 6
B 4
C 7
D A 8
E A, B 1
F A, B,C 4
G A, B,C 7
H C 3
I D, E, F 10
J H 9
K G, I, J 3
L H 2

a) Trazar la red del proyecto.


b) Para cada actividad, calcular la fecha temprana de comienzo t(·), la fecha tardía de comienzo
T (·), y la holgura h(·). Calcular la duración del proyecto y las actividades críticas.

14. Consideremos un proyecto sobre el que se tiene la siguiente información.


Grafos y Combinatoria. Javier Tejel 159

Act. Pred. Duración


A G 18
B F, J 30
C 19
D C, I 41
E A, G, D 16
F A, D 14
G C, I 21
H E, J 27
I 16
J E, A, F 15
K A 36

a) Trazar la red del proyecto.


b) Para cada actividad, calcular la fecha temprana de comienzo t(·), la fecha tardía de comienzo
T (·), y la holgura h(·). Calcular la duración del proyecto y las actividades críticas.

15. Consideremos un proyecto sobre el que se tiene la siguiente información.

Act. Pred. Duración


A F, I 21
B A, D 36
C B, D, J 29
D G, H 18
E 30
F E 21
G E 16
H F, I, G 22
I E 24
J D 17
K B, J 36

a) Trazar la red del proyecto.


b) Para cada actividad, calcular la fecha temprana de comienzo t(·), la fecha tardía de comienzo
T (·), y la holgura h(·). Calcular la duración del proyecto y las actividades críticas.

16. Dado el siguiente grafo no dirigido con costos no negativos, encontrar el recorrido cerrado más
corto incluyendo a todas las aristas.

1 4 2 3
3 4 4

9 3 9 5
7 6
6 7
5 6 8 3 8
3 3 3 3
4 10 11 12
9 2 2
6 9 3 4 5

4 14 3 15 3 16
13

17. Dado el siguiente grafo no dirigido con costos no negativos, encontrar el recorrido cerrado más
corto incluyendo a todas las aristas.
160 Capítulo 4. Grafos con costos

1 4 2 3
3 4 4

3 9 5
7 6
6 7
5 6 8 3 8
3 3 3 3
4 10 11 12
9 2 12
6 9 3 14 15

4 14 3 15 13 16
13

18. Suponer que el grafo de la figura representa una red de carreteras uniendo trece localidades, donde
los números sobre las aristas representan las distancias entre las localidades.

B
A 11
13
16 10
J K 9 C
14
22 9 24
14 L 15
E
11
10 M 7 21 19
I D
10
8 21 F
15 18
13
H G

Los encargados del mantenimiento de esa red de carreteras residen en A, y desean hallar un iti-
nerario que les permita revisar todas las carreteras recorriendo la mínima distancia. Decir qué
itinerario deben seguir para recorrer esa mínima distancia, sabiendo que el itinerario debe empezar
y terminar en A, y ha de pasar por todas las carreteras al menos una vez.

19. Suponer que el grafo de la figura representa una red de carreteras uniendo diez localidades, donde
los números sobre las aristas representan las distancias entre las localidades.

A 21 B
9
D 10 17
7
E
10 11 11
C
G
16
6 5
14 8
F 12 H
I 9
19
23
J

Los encargados del mantenimiento de esa red de carreteras residen en A, y desean hallar un iti-
nerario que les permita revisar todas las carreteras recorriendo la mínima distancia. Decir qué
itinerario deben seguir para recorrer esa mínima distancia, sabiendo que el itinerario debe empezar
y terminar en A, y ha de pasar por todas las carreteras al menos una vez.
Capítulo 5

Flujo en redes y aplicaciones

En 1956, L.R. Ford and D.R. Fulkerson se plantearon (y resolvieron) el siguiente problema: “Con-
sider a rail network connecting two cities by way of a number of intermediate cities, where each link of
the network has a number assigned to it representing its capacity. Assuming a steady state condition, find
a maximal flow from one given city to the other.”
Éste no es más que un primer ejemplo de una situación bastante común. En redes eléctricas, redes
de carreteras, redes de ordenadores, ..., un material “fluye” a través de la red desde una fuente (u origen)
donde es producido, hasta otro punto donde es consumido, el destino. Se suele asumir que el material se
produce a un ritmo constante en la fuente (tantas unidades por segundo), y es consumido en el destino a
ese mismo ritmo. Cada conexión de la red puede considerarse como un conducto por el que circula ese
material, y el “flujo” en ese conducto es intuitivamente el ritmo al que ese material pasa por él. También
se suele suponer que cada conducto de la red tiene asociado un límite de capacidad, una razón máxima
para la cantidad de material que puede circular por él. Por ejemplo, 20 amperios de corriente eléctrica,
60 coches por minuto, 100000 bits por segundo, ... Los nodos de la red distintos de la fuente y el destino
pueden considerarse como lugares de “paso”, lugares donde se unen varios conductos, por lo que el
material que llega a esos lugares debe salir de allí al mismo ritmo que entra. A esta propiedad se la suele
llamar “ley de conservación del flujo”, también denominada ley de conservación de Kirchoff, que fue el
primero que enunció formalmente esta ley para corrientes eléctricas.
Cualquiera de estas situaciones se puede modelizar como un grafo dirigido G = (V, A) con dos nodos
distinguidos, el nodo s donde se produce cierto material, y el nodo t donde queremos enviar ese material.
Cada uno de los arcos (u, v) del grafo tiene asignada una capacidad c(u, v), que es un número indicando
la cantidad máxima de material que puede pasar por ese arco por unidad de tiempo. Con este modelo, el
objetivo básico es calcular la cantidad máxima de material por unidad de tiempo que puede enviarse de
s a t a través de la red.
Este capítulo va a estar dedicado precisamente a resolver este problema básico, el problema de cal-
cular el máximo flujo que puede circular por la red sin violar la ley de conservación de flujo o las res-
tricciones de capacidad. O como ya hemos comentado anteriormente, el máximo ritmo al que el material
puede ser producido (y por tanto consumido) sin violar las restricciones de capacidad de los conductos o
la ley de conservación del flujo.
Aunque este problema básico parece un problema muy particular, tiene muchas aplicaciones y ex-
tensiones. También veremos en este capítulo algunas de esas extensiones y aplicaciones.

5.1. Problema de máximo flujo en una red


Esta sección va a estar dedicada al problema de calcular el máximo flujo que puede circular por
una red. Para ello, primero formalizaremos el problema y veremos las primeras propiedades. Después
probaremos el conocido Teorema de máximo flujo-mínimo corte y daremos un algoritmo básico para
encontrar el máximo flujo en una red.
Comencemos con la formalización del problema.

161
162 Capítulo 5. Flujo en redes y aplicaciones

8 0 8
1 5 2 1 5 2 2
4 2 4 4 0 2
9 4 9 2 4 2
2 2
0
5 t 5 0 t
s 9
s 90
5 5
5 5
6 6 0 4
3 10 3 2 10
2
8 8 2
3 4 8 3 4 8
0
(a) (b)

Figura 5.1: Una red de flujo y un flujo de valor 6 sobre ella.

Definición 5.1. Una red de flujo es un grafo dirigido simple y conexo G = (V, A), con dos nodos distin-
guidos s y t (la fuente u origen y el destino o final), donde cada arco (i, j) ∈ A tiene asociado un número
no negativo c(i, j) llamado la capacidad de ese arco.

La figura 5.1a ilustra una red de flujo con siete nodos, donde las capacidades de los arcos aparecen
en naranja sobre éllos.
Para referirse a una red de flujo, se suele usar la notación G = (V, A, s,t, c). La capacidad c se puede
mirar como una función de A en R+ ∪ {0}, tal y como hacíamos con la función w cuando trabajábamos
con grafos con pesos, o también se puede mirar como una aplicación de V × V en R+ ∪ {0}, donde
c(i, j) = 0 cuando el arco (i, j) no pertenece a A.
Definimos a continuación los conceptos de flujo y valor de un flujo.

Definición 5.2. Un flujo sobre una red de flujo G = (V, A, s,t, c) es una aplicación f : A → R+ que asigna
a cada arco (i, j) un número f (i, j) cumpliendo las siguientes dos restricciones.

0 ≤ f (i, j) ≤ c(i, j), ∀(i, j) ∈ A (5.1)

∑ f ( j, i) = ∑ f (i, j), ∀i ∈ V \ {s,t} (5.2)


j∈In(i) j∈Out(i)

donde In(i) y Out(i) son los conjuntos de vecinos “in” y “out” de i, respectivamente.

A la restricción (5.1) se la suele denominar restricción de compatibilidad, y nos viene a decir


que lo que circula por un arco no puede ser negativo ni sobrepasar la capacidad máxima del arco. A la
restricción (5.2) se la suele denominar ley de conservación del flujo, es decir, para cualquier nodo de la
red diferente del origen y el final, la cantidad de flujo que llega a ese nodo (el sumatorio de la izquierda en
la ecuación (5.2)) es igual a la cantidad de flujo que sale de él (el sumatorio de la derecha en la ecuación
(5.2)).
La figura 5.1b muestra un flujo sobre la red de flujo ilustrada en la figura 5.1a. Los flujos que circulan
por cada uno de los arcos están marcados en azul. Observar que el flujo asignado a cualquier arco no
sobrepasa la capacidad del arco. Además, excepto para s y t, el flujo que entra en cualquier nodo es el
mismo que el que sale del nodo. Por ejemplo, al nodo 1 llegan cuatro unidades de flujo a través del arco
(s, 1), y salen otras cuatro unidades de flujo, dos por el arco (1, 2) y otras dos por el arco (1, 5).

Definición 5.3. Dado un flujo f sobre una red de flujo G = (V, A, s,t, c), se define el valor del flujo f
(denotado por v( f )) como
v( f ) = ∑ f (s, j) − ∑ f ( j, s)
j∈Out(s) j∈In(s)

es decir, el valor de un flujo f es el flujo neto que sale de s.


Grafos y Combinatoria. Javier Tejel 163

En el ejemplo de la figura 5.1b, el valor del flujo mostrado en ella es f (s, 1) + f (s, 5) + f (s, 3) −
f (2, s) = 4 + 0 + 2 − 0 = 6.
Antes de formular el problema de máximo flujo, vamos a introducir alguna notación adicional co-
múnmente usada en redes.

Definición 5.4. Dada una red de flujo G = (V, A, s,t, c) y dos conjuntos X ⊆ V e Y ⊆ V , (X,Y ) se define
como
(X,Y ) = {(i, j) ∈ A | i ∈ X, j ∈ Y }
es decir, el conjunto de arcos de la red con el extremo inicial (cabeza) en X y el extremo final (cola) en
Y . Similarmente, c(X,Y ) se define como

c(X,Y ) = ∑ c(i, j)
(i, j)∈(X,Y )

es decir, la suma de las capacidades de los arcos que conectan nodos de X con nodos de Y .
Además, dado un flujo f sobre G, se define f (X,Y ) como

f (X,Y ) = ∑ f (i, j)
(i, j)∈(X,Y )

es decir, la suma de los flujos en los arcos que conectan nodos de X con nodos de Y .

Notar que no se ha exigido en la definición 5.4 que los conjuntos X e Y sean disjuntos. Por ello, si
dos nodos i y j pertenecen a la vez a X e Y , entonces (X,Y ) contiene a la vez a los arcos (i, j) y ( j, i) (si
existen en A).
En el ejemplo de la figura 5.1b, si X = {s, 1, 5} e Y = {3, 4}, el conjunto (X,Y ) estaría formado por
los arcos (s, 3) y (5, 4), c(X,Y ) valdría 6 + 5 = 11 (la suma de las capacidades de esos dos arcos), y
f (X,Y ) sería 2 + 2 = 4 (la suma de los flujos que circulan por esos dos arcos).
Por comodidad, cuando alguno de los conjuntos X o Y conste de un sólo nodo i, en lugar de escribir
{i} para representar a X o Y escribiremos directamente i. Por tanto, ({i},Y ) = (i,Y ), c({i},Y ) = c(i,Y )
y f ({i},Y ) = f (i,Y ).
Usando esta notación, la ley de conservación de flujo quedaría

f (i,V ) = f (V, i), ∀i ∈ V \ {s,t}

y el valor del flujo de la forma


f (s,V ) − f (V, s)
De la definición 5.4, si X,Y y Z son tres subconjuntos de V , se puede comprobar fácilmente que

f (X ∪Y, Z) = f (X, Z) + f (Y, Z) − f (X ∩Y, Z)

y que
f (Z, X ∪Y ) = f (Z, X) + f (Z,Y ) − f (Z, X ∩Y )
De forma análoga,
c(X ∪Y, Z) = c(X, Z) + c(Y, Z) − c(X ∩Y, Z)
y
c(Z, X ∪Y ) = c(Z, X) + c(Z,Y ) − c(Z, X ∩Y )
Dado un flujo f , el siguiente lema nos muestra que el flujo neto que llega a t es precisamente el valor
del flujo.

Lema 5.1. Dado un flujo f sobre una red de flujo G = (V, A, s,t, c), se cumple que

f (V,t) − f (t,V ) = f (s,V ) − f (V, s) = v( f )


164 Capítulo 5. Flujo en redes y aplicaciones

Demostración. El flujo total que circula por la red, f (V,V ), puede expresarse de dos formas. La primera
teniendo en cuenta lo que sale de los nodos y la segunda teniendo en cuenta lo que llega a los nodos. Así,

f (V,V ) = f (s,V ) + f (t,V ) + ∑ f (i,V ) = f (V, s) + f (V,t) + ∑ f (V, i)


i̸=s,t i̸=s,t

Por la ley de conservación del flujo, f (i,V ) = f (V, i) para cualquier nodo i distinto de s y t, por lo que

∑ f (i,V ) = ∑ f (V, i)
i̸=s,t i̸=s,t

En consecuencia,
f (s,V ) + f (t,V ) = f (V, s) + f (V,t)
lo que implica que
f (s,V ) − f (V, s) = f (V,t) − f (t,V )
como queríamos demostrar.

En la figura 5.1b, como no hay flujo que llegue a s ni flujo que salga de t, observar que el flujo neto
que sale de s, que es 6, es precisamente el flujo neto que llega a t.
Dada una red de flujo G = (V, A, s,t, c), en el problema de máximo flujo buscamos un flujo f que
maximize v( f ). A un flujo f que maximize v( f ) lo llamaremos flujo maximal. A priori, no es obvio que
el problema de máximo flujo tenga solución. Para poder demostrar que el problema tiene solución y dar
un método para encontrarla, necesitamos introducir nuevos conceptos, como son el concepto de corte y
el concepto de camino de aumento.
Dado un conjunto X de nodos, denotaremos por X al conjunto complementario, es decir, X = V \ X.

Definición 5.5. Dada una red de flujo G = (V, A, s,t, c), un corte separando s de t es un conjunto de
arcos (X, X), donde s ∈ X y t ∈ X. A la cantidad c(X, X) se la denomina la capacidad del corte. Un
corte (X, X) se dice mínimo si c(X, X) ≤ c(Y,Y ) para cualquier otro corte (Y,Y ).

En el ejemplo de la figura 5.1a, si X = {s, 1, 5}, el corte (X, X) estaría formado por los arcos (s, 3),
(1, 2), (5, 2), (5,t) y (5, 4), es decir, todos los arcos que salen de nodos de X y llegan a nodos de X. La
capacidad de dicho corte sería la suma de las capacidades sus arcos, es decir, c(X, X) = 6+5+4+9+5 =
29.
Dado un corte cualquiera (X, X), es fácil ver que cualquier camino dirigido P desde s a t contiene un
arco del corte, puesto que si P es (s = i0 , i1 , . . . , ih = t), en algún momento se ha de pasar en ese camino
de un nodo en X a un nodo en X. Por tanto, si en la red quitamos los arcos de ese corte (X, X), entonces
no podemos enviar flujo desde s a t.
Por otra parte, intuitivamente, parece que no se puede enviar más flujo del que “cabe” por esos arcos
del corte (X, X). El siguiente lema formaliza esta idea, dando una cota superior sobre el valor de un flujo.

Lema 5.2. Sea f un flujo sobre una red de flujo G = (V, A, s,t, c), y sea (X, X) un corte cualquiera.
Entonces,
v( f ) = f (X, X) − f (X, X) ≤ c(X, X) (5.3)

Demostración. Veamos primeramente cuánto vale f (X,V ) − f (V, X). Por definición de v( f ), sabemos
que v( f ) = f (s,V ) − f (V, s), y por la ley de conservación de flujo, tenemos que f (i,V ) − f (V, i) = 0,
para cualquier nodo i distinto de s y t. Por tanto,

f (X,V ) − f (V, X) = f (s,V ) + ∑ f (i,V ) − f (V, s) − ∑ f (V, i) = f (s,V ) − f (V, s) = v( f )


i∈X\{s} i∈X\{s}

Por otra parte, como V = X ∪ X, tenemos las siguientes igualdades:

f (X,V ) = f (X, X) + f (X, X) y f (V, X) = f (X, X) + f (X, X)


Grafos y Combinatoria. Javier Tejel 165

con lo que

f (X,V ) − f (V, X) = f (X, X) + f (X, X) − f (X, X) − f (X, X) = f (X, X) − f (X, X) = v( f )

y se tiene la primera igualdad en la ecuación (5.3).


Además, por la restricción de compatibilidad 5.1, sabemos que 0 ≤ f (i, j) ≤ c(i, j). En particular,
esto implica que f (X, X) ≤ c(X, X) y f (X, X) ≥ 0. En consecuencia, f (X, X) − f (X, X) ≤ c(X, X), y se
tiene la desigualdad de la ecuación (5.3).

El lema anterior nos dice que para cualquier flujo, su valor v( f ) nunca puede exceder la capacidad
de cualquier corte (X, X). En particular, si elegimos un corte (X, X) mínimo, el máximo flujo que pueda
circular por la red nunca podrá exceder la capacidad de ese corte mínimo.
Del Lema 5.2, se deduce fácilmente el siguiente corolario.
Corolario 5.1. Sea f un flujo sobre una red de flujo G = (V, A, s,t, c) y sea (X, X) un corte. Si v( f ) =
c(X, X), entonces f es maximal, (X, X) es mínimo, f (X, X) = c(X, X) y f (X, X) = 0.
Demostración. Veamos primero que f es maximal. Supongamos que f no lo es, con lo que existe otro
flujo f ′ tal que v( f ′ ) > v( f ). En ese caso, v( f ′ ) > v( f ) = c(X, X) lo que contradice el Lema 5.2. Por
tanto, f es maximal.
Veamos ahora que (X, X) es mínimo. Si no lo fuera, existiría otro corte (Y,Y ) tal que c(Y,Y ) <
c(X, X). En ese caso, tendríamos que v( f ) = c(X, X) > c(Y,Y ), contradiciendo de nuevo el Lema 5.2.
Por tanto, (X, X) es mínimo.
Por último, por la ley de compatibilidad se tiene que f (X, X) ≤ c(X, X) y f (X, X) ≥ 0. Al ser v( f ) =
f (X, X) − f (X, X) = c(X, X), necesariamente f (X, X) = c(X, X) y f (X, X) = 0.

En lo que sigue veremos que, en efecto, existen flujos f satisfaciendo que v( f ) = c(X, X) para algún
corte (X, X), con lo que f será maximal y (X, X) mínimo. Para ello, necesitamos introducir los conceptos
de arco saturado, arco nulo y camino de aumento, y dar una caracterización de un flujo maximal en
función de la existencia de caminos de aumento.
Definición 5.6. Dado un flujo f sobre una red de flujo G = (V, A, s,t, c), un arco (i, j) se dice saturado
si f (i, j) = c(i, j), y se dice nulo si f (i, j) = 0.
Definición 5.7. Sea f un flujo definido sobre una red de flujo G = (V, A, s,t, c). Un camino de aumento
desde s hasta un nodo k para el flujo f es un camino no dirigido desde s hasta k, tal que los arcos hacia
adelante en el camino son no saturados ( f (i, j) < c(i, j) para cualquier arco (i, j) hacia adelante) y los
arcos hacia atrás son no nulos ( f (i, j) > 0 para cualquier arco (i, j) hacia atrás).

0 8 0 8 0 8
1 5 2 2 1 5 2 2 1 5 2 2
4 4 0 2 4 4 0 2 4 4 0 2
9 2 4 2 9 2 4 2 9 2 4 2
2 2 2
0 0 0
5 0 t 5 5 t 5 0 t
s 90
s 95
s 92
5 5
5 5
5 5
6 0 4 6 0 4 6 0 4
3 2 10 3 2 10 3 0 10
2 2 4
8 2 8 2 8 4
3 4 8 3 4 8 3 4 8
0 0 0

(a) (b) (c)

Figura 5.2: Caminos de aumento de s a t para un flujo f .

Los caminos de aumento desde s hasta t se pueden usar para incrementar el valor de un flujo. Por
ejemplo, para el flujo de la figura 5.2a cuyo valor es 6, existen diferentes caminos de aumento de s a t que
166 Capítulo 5. Flujo en redes y aplicaciones

permiten incrementar el valor del flujo. Una posibilidad sería el camino s → 5 → t, pues los dos arcos del
camino, los arcos (s, 5) y (5,t), no están saturados. Usando ese camino, se podría construir otro flujo f ′
con valor 11, enviando 5 unidades de flujo por ambos arcos, tal y como se ilustra en la figura 5.2b. Otro
posible camino de aumento de s a t para el flujo de la figura 5.2a sería el camino s → 3 → 4 ← 5 → t,
que usa hacia adelante los arcos no saturados (s, 3), (3, 4) y (5,t), y hacia atrás el arco no nulo (5, 4). A
partir del flujo de la figura 5.2a, se podría construir otro flujo f ′ con valor 8 (mayor que 6) usando ese
camino, enviando 2 unidades de flujo adicionales por los arcos (s, 3), (3, 4) y (5,t), y disminuyendo en 2
unidades el flujo del arco (5, 4), tal y como se ilustra en la figura 5.2c.
La existencia o no de caminos de aumento caracteriza precisamente la maximalidad o no de un flujo.

Teorema 5.1 (Teorema de los caminos de aumento). Un flujo f sobre una red de flujo G = (V, A, s,t, c)
es maximal, si y sólo si, no existen caminos de aumento desde s hasta t para f .

Demostración. ⇒) Veamos primero que si f es maximal, entonces no existen caminos de aumento de s


a t. Supongamos por el contrario que existe un camino de aumento P desde s hasta t para f . Se puede
construir entonces un flujo f ′ tal que v( f ′ ) > v( f ), lo que sería una contradicción.
Sea
ε1 = mı́n{c(i, j) − f (i, j)}
donde el mínimo se toma para todos los arcos (i, j) hacia adelante de P, y sea

ε2 = mı́n{ f (i, j)}

donde el mínimo se toma para todos los arcos (i, j) hacia atrás de P.
Tomando ε = mı́n{ε1 , ε2 }, definimos f ′ sobre los arcos de G como sigue:

 f (i, j) + ε si (i, j) es un arco hacia adelante en P.
f ′ (i, j) = f (i, j) − ε si (i, j) es un arco hacia atrás en P.
f (i, j) en los demás casos.

Veamos que f ′ es un flujo y que v( f ′ ) > v( f ). Claramente f ′ cumple la restricción de compatibilidad.


Como f es un flujo, los arcos (i, j) que no modifican su flujo en f ′ satisfacen la ley de compatibilidad.
Además, cuando se incrementa el flujo para un arco (i, j) hacia adelante, el nuevo flujo f ′ (i, j) nunca
superará su capacidad c(i, j) por la elección de ε1 . Igualmente, cuando se decrece el flujo para un arco
(i, j) hacia atrás, el nuevo flujo f ′ (i, j) nunca será negativo por la elección de ε2 . Por tanto, f ′ cumple la
restricción de compatibilidad.
En cuanto a la ley de conservación de flujo, evidentemente f ′ cumple esa ley para los nodos i que no
están en P, puesto que f es un flujo y el flujo en f ′ de cualquier arco incidente a i coincide con el de f .
Si i ̸= s,t está en P, tenemos las siguientes cuatro posibilidades
+ε +ε +ε −ε −ε +ε −ε −ε
(1) −→ i −→ (2) −→ i ←− (3) ←− i −→ (4) ←− i ←−

en función de si los arcos incidentes a i en el camino P son hacia adelante o hacia atrás.
En el primer caso, el nuevo flujo que entra a i se incrementa en ε y el que sale de i también se
incrementa en ε, por lo que el nuevo flujo f ′ cumple la ley de conservación en este nodo i. En el caso
cuarto, lo que entra a i disminuye en ε y lo que sale también, con lo que se sigue manteniendo la ley de
conservación. En el caso dos, se modifica el flujo que entra a i en dos arcos, en uno aumenta en ε y en
otro disminuye en esa misma cantidad, por lo que no cambia el total de lo que entra y sale de i. Y lo
mismo sucede en el caso tercero, lo que sale de i aumenta en ε por un lado y disminuye en ε por otro.
En consecuencia, f ′ satisface también la ley de conservación y es un flujo.
Por último, se cumple que v( f ′ ) = v( f ) + ε. Si el arco inicial del camino P es hacia adelante, s →,
lo que sale de s se incrementa en ε y lo que entra a s no cambia. Por tanto, v( f ′ ) = f ′ (s,V ) − f ′ (V, s) =
f (s,V ) − f (V, s) + ε = v( f ) + ε. Si el arco inicial es hacia atrás, s ←, lo que entra en s disminuye en
ε, y lo que sale no cambia, con lo que el flujo neto en f ′ que sale de s, v( f ′ ) = f ′ (s,V ) − f ′ (V, s) =
Grafos y Combinatoria. Javier Tejel 167

f (s,V ) − ( f (V, s) − ε) = v( f ) + ε, aumenta en ε. Esto contradice que f es maximal, con lo que no


pueden existir caminos de aumento de s a t.
⇐) Probemos ahora que si no hay caminos de aumento de s a t, entonces f es maximal. Sea X el
conjunto de nodos i para los que hay un camino de aumento desde s hasta i, donde consideramos que s
pertenece a X. Como por hipótesis no hay camino de aumento de s a t, necesariamente t ∈ X, donde X
es el conjunto de nodos j para los que no hay camino de aumento de s a j. Por tanto, (X, X) define un
corte. Notar que un arco (i, j) de (X, X) tiene que estar saturado pues, en otro caso, habría un camino de
aumento de s a j, lo que contradiría la definición de X. Por el mismo motivo, necesariamente un arco
( j, i), con j ∈ X e i ∈ X, tiene que ser nulo. En consecuencia, f (X, X) = c(X, X) y f (X, X) = 0. Por el
Lema 5.2, v( f ) = f (X, X) − f (X, X) ≤ c(X, X), con lo que necesariamente v( f ) = c(X, X). Aplicando el
Corolario 5.1, f debe ser maximal y (X, X) un corte mínimo.

El siguiente corolario, que se deduce de forma inmediata de los argumentos del Teorema 5.1, da un
caracterización alternativa de un flujo maximal.

Corolario 5.2. Un flujo f sobre una red de flujo G = (V, A, s,t, c) es maximal, si y sólo si, el conjunto X
de nodos accesibles desde s mediante caminos de aumento (con respecto a f ) no es todo V . En ese caso,
v( f ) = c(X, X) y (X, X) es mínimo.

5.1.1. Algoritmo de Ford y Fulkerson


El Teorema 5.1 da una propiedad fundamental que debe cumplir un flujo maximal, la no existencia de
caminos de aumento de s a t, pero el teorema no garantiza que tal flujo exista (de momento). Sin embargo,
el teorema sí da una idea de cómo demostrar que tal flujo existe. Partiendo de un flujo f cualquiera,
usualmente el flujo nulo donde todos los valores f (i, j) son cero, se buscan caminos de aumento de s a t
y se van construyendo nuevos flujos tal y como se describe en el Teorema 5.1, incrementado el valor del
flujo en cada paso. Cuando ya no se encuentren caminos de aumento desde s hasta t, entonces el último
flujo obtenido será maximal y los nodos accesibles desde s mediante caminos de aumento en ese flujo
definirán un corte mínimo.
Esta idea, propuesta por Ford y Fulkerson, podría resumirse de la siguiente manera. Hay que resaltar
que el flujo inicial con el que comenzar el algoritmo podría ser cualquiera, y no necesariamente el flujo
nulo.

Algoritmo de Ford-Fulkerson
Entrada. Una red de flujo G = (V, A, s,t, c).
Salida. Un flujo maximal.

1. Hacer l = 0 y comenzar con el flujo nulo f0 (o cualquier otro flujo), definido como f0 (i, j) = 0
para todos los arcos (i, j) de G.
2. Mientras exista un camino de aumento de s a t para fl , hacer lo siguiente.
Usando ese camino de aumento, definir un nuevo flujo fl+1 de acuerdo al Teorema 5.1 tal que
v( fl+1 ) > v( fl ). Hacer l = l + 1.
3. Si ya no existe camino de aumento de s a t para fl , devolver fl como flujo maximal.

Lo único que faltaría por ver para demostrar la existencia de un flujo maximal es que el número de
iteraciones del algoritmo es finito, es decir, que este proceso de ir incrementado el valor del flujo termina.
Y eso va a depender de cómo se elijan los caminos de aumento.
Buscando caminos de aumento a “ojo” (cosa que sólo se puede hacer cuando la red es pequeña)
veamos cómo funcionaría el algoritmo de Ford y Fulkerson. A partir del flujo mostrado en la figura 5.2a,
ya habíamos visto que el camino s → 5 → t era un camino de aumento de s a t (los arcos (s, 5) y (5,t) no
están saturados), que permite aumentar el valor del flujo en 5 unidades (el mínimo de c(s, 5) − f (s, 5) =
5 − 0 = 5 y c(5,t) − f (5,t) = 9 − 0 = 9), como se muestra en la figura 5.3a. Para este nuevo flujo, el
168 Capítulo 5. Flujo en redes y aplicaciones

0 8 0 8 0 8
1 5 2 2 1 5 2 2 1 5 2 2
4 4 0 2 4 4 0 2 6 4 0 2
9 2 4 2 9 2 4 2 9 4 4 2
2 2 2
0 0 0
5 5 t 5 5 t 5 5 t
s 95
s 95
s 97
5 5
5 5
5 5
6 0 4 6 0 8 6 0 8
3 2 10 3 2 10 3 2 10
2 6 6
8 2 8 6 8 6
3 4 8 3 4 8 3 4 8
0 0 0

(a) (b) (c)

0 8 0 8
1 5 4 2 1 5 4 2
X
8 4 0 2 8 4 0 2
9 4 4 2 9 4 4 2
2 2
2 2
5 5 t 5 5 t
s 99
s 99
5 5
5 5
6 0 8 6 0 8
3 2 10 3 2 10
6 6
8 6 8 6 X
3 4 8 3 4 8
0 0

(d) (e)

Figura 5.3: Cálculo de un flujo maximal a través de caminos de aumento.

camino s → 3 → 4 → t es otro camino de aumento de s a t (los arcos del camino no están saturados), que
permite incrementar el valor del flujo en 4 unidades (el mínimo de c(s, 3) − f (s, 3) = 6 − 2 = 4, c(3, 4) −
f (3, 4) = 8 − 2 = 6 y c(4,t) − f (4,t) = 10 − 4 = 6) como se describe en el Teorema 5.1, añadiendo esas
cuatro unidades de flujo en los arcos (s, 3), (3, 4) y (4,t), que son los arcos hacia adelante del camino de
aumento (ver la figura 5.3b).
Para este nuevo flujo, los arcos (s, 5) y (s, 3) están saturados, por lo que si hay caminos de aumento
de s a t, éstos deben usar el arco (s, 1). Usando ese arco, el camino s → 1 → 5 → t es otro camino de
aumento de s a t que permite incrementar en 2 unidades el valor del flujo (ver la figura 5.3c), y para el
nuevo flujo el camino s → 1 → 2 → 5 → t permite incrementar el valor del flujo en otras 2 unidades (ver
la figura 5.3d).
Si tratamos de buscar caminos de aumento para el flujo de la figura 5.3d, nos encontramos que desde
s sólo podemos usar el arco (s, 1), que es el único no saturado partiendo de s, y desde el nodo 1 sólo
podemos usar el arco (1, 2), que es el único no saturado desde el 1. Para el nodo 2, no podemos seguir
hacia adelante, pues los arcos (2, 5) y (2,t) ya están saturados y el arco (2, s) formaría un ciclo, ni
hacia atrás, pues el único arco con flujo que llega a 2 es el arco (1, 2), que ya está usado. Por tanto,
no existen caminos de aumento de s a t y los únicos nodos accesibles desde s mediante caminos de
aumento son el 1 y el 2. Definiendo X = {s, 1, 2} y X = {3, 4, 5}, la capacidad del corte (X, X) es 19
(c(s, 5) + c(s, 3) + c(1, 5) + c(2, 5) + c(2,t) = 5 + 6 + 4 + 2 + 2 = 19) y el valor del flujo de la figura 5.3d
es también 19 ( f (s, 1) + f (s, 5) + f (s, 3) − f (2, s) = 8 + 5 + 6 − 0 = 19), con lo que ese flujo es maximal
y (X, X) es un corte mínimo. Véase la figura 5.3e, donde se han señalado en rojo los arcos del corte
(X, X). Notar que en todos los caminos de aumento que hemos utilizado, todos los arcos usados eran
hacia adelante, aunque no suele ser lo habitual y normalmente hay que utilizar arcos hacia atrás.
Evidentemente, lo usual no es buscar caminos de aumento a “ojo” en el paso 2 del algoritmo, si
no hacerlo de una manera sistemática. Ford y Fulkerson propusieron un primer método para calcular
caminos de aumento basado en una búsqueda y etiquetación de nodos similar a la que se realiza en
el método BFS. Sin embargo, mostraron ejemplos con capacidades irracionales en los que ese método
Grafos y Combinatoria. Javier Tejel 169

propuesto no terminaba nunca. A pesar de ello, si las capacidades son número enteros, demostraron que
el proceso de incrementar el flujo a través de caminos de aumento de s a t termina en un número finito
de pasos proporcionando un flujo maximal, independientemente de cómo se busquen esos caminos de
aumento. Además, todos los flujos fl (i, j) obtenidos en el proceso son enteros. Este resultado se conoce
como el Teorema de integralidad, que pasamos a enunciar y demostrar.

Teorema 5.2 (Teorema de integralidad). Sea G = (V, A, s,t, c) una red de flujo con todas las capa-
cidades c(i, j) números enteros no negativos. Entonces el algoritmo de Ford-Fulkerson termina en un
número finito de pasos proporcionando un flujo maximal, donde todos los valores fl (i, j) calculados en
el algoritmo son enteros no negativos.

Demostración. Veamos primero por inducción que todos los fl (i, j) del proceso son enteros no negativos.
Si l = 0, la base de la inducción, está claro que todos los f0 (i, j) son enteros no negativos, pues están
definidos como cero. Supongamos que todos los valores fl (i, j) son valores enteros no negativos para un
cierto l. Veamos que todos los valores fl+1 (i, j) son también enteros no negativos. Si existe camino de
aumento de s a t para fl , como las capacidades son enteros no negativos y los valores fl (i, j) son enteros
no negativos, entonces los valores ε1 , ε2 y ε del Teorema 5.1 son enteros no negativos. Por tanto, como
por el Teorema 5.1 tenemos que fl+1 (i, j) es fl (i, j) + ε, o fl (i, j) − ε, o fl (i, j), necesariamente todos los
valores fl+1 (i, j) son enteros no negativos.
Como el valor del flujo se incrementa en un entero en cada iteración (al menos en una unidad),
y como por el Lema 5.2 la capacidad de un corte (minimal) es una cota superior para el valor de un
flujo, entonces en un número finito de pasos se ha de obtener un flujo f para el que v( f ) no se pueda
incrementar, con lo que no existirá un camino de aumento de s a t para f . Por tanto, por el Teorema 5.1,
ese flujo ha de ser maximal y tendrá todos sus valores f (i, j) enteros no negativos.

5.1.2. Algoritmo de Edmonds-Karp


Edmonds y Karp propusieron la siguiente variante del algoritmo de Ford y Fulkerson, que da una
forma sistemática de buscar caminos de aumento de s a t con unas propiedades interesantes. La idea de
su algoritmo se basa en utilizar el método BFS “out + in” con comienzo en s para encontrar caminos de
aumento de s a t, con lo que dichos caminos de aumento serán de longitud mínima (en el número de
arcos). Lo que hay que tener en cuenta a la hora de aplicar el método BFS “out + in” para un determinado
flujo es que un arco hacia adelante se puede usar siempre que no esté saturado, y un arco hacia atrás se
puede usar siempre que no sea nulo. En general, al aplicar BFS “out + in” sobre un flujo, cuando se está
explorando un nodo i, podemos llegar a uno de sus vecinos “out” j siempre que j no esté marcado y el
arco (i, j) no esté saturado, y podemos llegar a uno de sus vecinos “in” j siempre que j no esté marcado
y el arco ( j, i) sea no nulo.
Recordar que la aplicación del método BFS sobre un grafo siempre da el conjunto de nodos que son
accesibles desde la raíz, y en caso de que un nodo sea accesible, da la manera más corta de llegar a él
(en el número de arcos). Por tanto, si al aplicar BFS “out + in” sobre un flujo f el nodo t no es accesible
desde s, es porque no existe camino de aumento de s a t para ese flujo f . El algoritmo de Edmonds y
Karp es el siguiente.

Algoritmo de Edmonds-Karp

Entrada. Una red de flujo G = (V, A, s,t, c).


Salida. Un flujo maximal y un mínimo corte.

1. Hacer l = 0 y comenzar con el flujo nulo f0 (o cualquier otro flujo), definido como f0 (i, j) = 0
para todos los arcos (i, j) de G.
2. Aplicar BFS “out + in” para encontrar un camino de aumento de s a t en fl .
170 Capítulo 5. Flujo en redes y aplicaciones

3. Si existe ese camino, hacer lo siguiente.


Usando ese camino de aumento, definir un nuevo flujo fl+1 de acuerdo al Teorema 5.1 tal que
v( fl+1 ) > v( fl ). Hacer l = l + 1 y volver al paso 2
4. Si ya no existe camino de aumento de s a t para fl , devolver fl como flujo maximal y (X, X) como
corte mínimo, donde X es el conjunto de nodos accesibles desde s mediante caminos de aumento,
que se habrá obtenido con la aplicación del BFS “out + in” sobre fl .

Edmonds y Karp demostraron que, independientemente de los valores de las capacidades (no tienen
por qué ser números enteros), el número de iteraciones del algoritmo es a lo más n · m, donde n es el
número de nodos de la red y m el número de arcos. Por tanto, el algoritmo garantiza la existencia de un
flujo maximal.
Antes de probar que el número de iteraciones del algoritmo está acotado por n · m, veamos cómo se
aplicaría en un ejemplo.

Ejemplo 5.1. Aplicar el algoritmo de Edmonds-Karp a la red de flujo mostrada en la figura 5.4a, para
obtener un flujo maximal y un mínimo corte.

1 10 0 7 1 10 10 7 1 10 10 7
10 0 10 10 0 10 10 0 10
5 0 5 10 5 10
0 0 10 0 10 0
2 10 0 2 10 0 2 10 5
10 8 50 t 10 8 50 t 10 8 55 t
4 4 4
s 10 0 6 50 s 10 0 6 50 s 10 5 6 5
0
10 0 60 0 10 0 60 0 10 0 60 0
0 10 5 0 10 5 0 10 5
0 0 0
10 5 10 5 10 5
3 10 60 0 10 3 10 60 0 10 3 10 60 0 10
0 0 0 0 0 0
5 5 5 5 5 5
9 9 9
(a) Flujo f0 (b) Flujo f1 (c) Flujo f2

1 10 10 7 1 10 10 7 1 10 10 7
10 0 10 10 0 10 10 0 10
5 10 5 10 5 10
10 0 10 0 10 0
2 10 5 2 10 5 2 10 5
10 8 55 t 10 8 55 t 10 8 55 t
s 10 5
4 5 s 10 5
4 5 s 10 5
4 5
10 65 6 5 0 10 66 6 5 0 10 66 6 5 0
5 5 6 5 6 5
5 10 6 10 10 10
0 1 5
10 5 10 5 10 5
3 10 60 0 10 3 10 60 1 10 3 10 64 5 10
0 0 0 0 4 0
5 5 5 5 5 5
9 9 9
(d) Flujo f3 (e) Flujo f4 (f) Flujo f5

1 10 8 7
1 10 8 7
2 10 X 10
5
2 10
10
10 10 2
5 10 10 7
10 2
10 7 10 2 8 55 t
X
10 2 8 55 t s 10 7
4 5
s 10 7
4 5 66 6 5 2
6 5 10 4
10 4 66 2 10 10 5
10 5 5
10 5 10 5
10 5
3 10 66 7 10
3 10 10 6 2
6 66 7 5 5
5 2
5 9
9
(g) Flujo f6 (h) Mínimo corte

Figura 5.4: Caminos de aumento para un flujo f .

Solución. Para los diferentes flujos que se vayan obteniendo, hay que aplicar BFS “out + in” para en-
contrar caminos de aumento de s a t, teniendo en cuenta que un arco hacia adelante se puede emplear si
Grafos y Combinatoria. Javier Tejel 171

no está saturado y un arco hacia atrás si es no nulo. Si en la aplicación del BFS “out + in” se llega a t,
entonces paramos, pues ya habremos encontrado un camino de aumento de s a t.
Partiendo del flujo nulo f0 (ver la figura 5.4a), la tabla 5.1a muestra la aplicación del BFS “out +
in” sobre ese flujo. Partiendo de s, se puede llegar a los nodos 1, 2 y 3 (los arcos (s, 1), (s, 2) y (s, 3)
no están saturados). Desde 1, el siguiente nodo de la lista, se puede llegar a los nodos 7 y 4. Desde el
2 al 8, y desde el 3 al 5. Ahora toca el nodo 7, desde el que podemos llegar ya al nodo t, con lo que
paramos. Siguiendo las marcas, a t llegamos desde el nodo 7, al 7 desde el 1 y al 1 desde el s. Por tanto,
el camino de aumento de s a t obtenido es el camino s → 1 → 7 → t, que permite incrementar el valor
del flujo en 10 unidades aplicando el Teorema 5.1. Como todos los arcos son hacia adelante, el mínimo
de c(s, 1) − f0 (s, 1) = 10 − 0 = 10, c(1, 7) − f0 (1, 7) = 10 − 0 = 10 y c(7,t) − f0 (7,t) = 10 − 0 = 10 es
10, flujo que se añade al existente sobre los arcos (s, 1), (1, 7) y (7,t). Véase la figura 5.4b.
Para este nuevo flujo f1 mostrado en la figura 5.4b, aplicamos de nuevo BFS “out + in”, como se
muestra en la tabla 5.1b. Desde s, sólo podemos llegar ahora a los nodos 2 y 3, pues el arco (s, 1) ya
está saturado. Desde el 2, el siguiente en la lista, podemos llegar al 8, y desde el 3, el siguiente en la
lista, podemos llegar al 4 y al 5. Desde el 8 ya podemos llegar a t, con lo que hemos encontrado un
nuevo camino de aumento de s a t. Dicho camino es s → 2 → 8 → t, que permite incrementar el valor
del flujo en 5 unidades (el mínimo de c(s, 2) − f1 (s, 2) = 10 − 0 = 10, c(2, 8) − f1 (2, 8) = 10 − 0 = 10
y c(8,t) − f1 (8,t) = 5 − 0 = 5), añadiendo dicho flujo en los arcos (s, 2), (2, 8) y (8,t). Véase la figura
5.4c.

l=0 l=1 l=2 l=3 l=4 l=5 l=6


N M L N M L N M L N M L N M L N M L N M L
s * s s * s s * s s * s s * s s * s s * s
1 s 1 1 2 1 −7 2 1 −7 2 1 −7 2 1 −7 2 1 −7 2
2 s 2 2 s 3 2 s 3 2 s 3 2 s 3 2 s 8 2 s 8
3 s 3 3 s 8 3 s 8 3 s 8 3 s 8 3 −4 7 3 −4 7
4 1 7 4 3 4 4 3 4 4 3 4 4 3 4 4 1 1 4 1 1
5 3 4 5 3 5 5 3 5 5 3 5 5 3 5 5 3 4 5 3 4
6 8 6 t 6 4 7 6 4 7 6 5 7 6 5 3 6 3
7 1 5 7 7 8 6 7 8 6 7 8 6 7 8 5 7 8 5
8 2 t 8 2 8 2 1 8 2 1 8 2 1 8 2 6 8 2
9 9 9 t 9 6 9 9 6 9 9 6 9 9
10 10 10 10 t 10 t 10 9 10 10
t 7 t 8 t 6 t 9 t 9 t 10 t t
(a) (b) (c) (d) (e) (f) (g)

Tabla 5.1: Aplicaciones sucesivas de BFS “out + in” para la red de flujo de la figura 5.4a.

Aplicando de nuevo BFS “out + in” (ver la tabla 5.1c) sobre el nuevo flujo f2 mostrado en la figura
5.4c, obtenemos el camino de aumento s → 3 → 4 → 6 → t, que permite incrementar el valor del flujo en 5
unidades (el menor de c(s, 3)− f2 (s, 3) = 10−0 = 10, c(3, 4)− f2 (3, 4) = 10−0 = 10, c(4, 6)− f2 (4, 6) =
6 − 0 = 6 y c(6,t) − f2 (6,t) = 5 − 0 = 5). Notar que el nodo 1 ha quedado marcado con −7, pues al
explorar el nodo 7, el nodo 1 no estaba marcado y por el arco (1, 7) circulaba flujo, por lo que, si lo
hubiésemos necesitado, se podría haber utilizado ese arco hacia atrás.
Reiterando el proceso, en la siguiente aplicación de BFS “out + in” (ver la tabla 5.1d con l = 3)
sobre el flujo f3 de la figura 5.4d, hubiésemos encontrado el camino de aumento s → 3 → 4 → 6 →
9 → t, con lo que el valor del flujo se incrementa en una unidad (ese valor proviene del arco (4, 6), pues
c(4, 6) − f3 (4, 6) = 6 − 5 = 1). Véase la figura 5.4e. El siguiente camino de aumento de s a t (ver la tabla
5.1e y la figura 5.4f) que se obtiene es s → 3 → 5 → 6 → 9 → t, que permite incrementar el valor del
flujo en 4 unidades.
Vamos a detenernos ahora en la aplicación de BFS “out + in” (tabla 5.1f) sobre el flujo f5 de la figura
172 Capítulo 5. Flujo en redes y aplicaciones

5.4f. De s sólo podemos ir al nodo 2, del 2 al 8, y del 8 al 7. Del nodo 7 no podemos ir hacia adelante
(el arco (7,t) está saturado), pero sí podemos ir hacia atrás, pues el nodo 1 no está marcado y circula
flujo por el arco (1, 7). Luego el nodo 1 queda marcado con −7. Del nodo 1 se puede llegar al 4, y del
4 se puede llegar al 3 hacia atrás, pues vuelve a suceder que el nodo 3 no estaba marcado y circula flujo
por el arco (3, 4). El nodo 3 queda marcado con −4. Al finalizar BFS, el nuevo camino de aumento que
obtenemos de s a t es el camino s → 2 → 8 → 7 ← 1 → 4 ← 3 → 5 → 6 → 9 → 10 → t, que usa dos
arcos hacia atrás, los arcos (1, 7) y (3, 4). Mirando los arcos hacia adelante, el nuevo flujo ε1 que se
podría enviar sería 2, que proviene de c(5, 6) − f5 (5, 6) = 6 − 4 = 2, y mirando los arcos hacia atrás, el
nuevo flujo ε2 que se podría enviar sería 6, el mínimo de f5 (1, 7) y f5 (3, 4). Como el mínimo entre 2
y 6 es dos, a través de este camino de aumento podemos incrementar en dos unidades el valor del flujo
(véase la figura 5.4g). Los flujos de los arcos hacia adelante del camino se incrementan en dos unidades
y los flujos de los arcos hacia atrás del camino se disminuyen en dos unidades.
Al aplicar de nuevo BFS “out + in” (ver la tabla 5.1g) sobre el flujo f6 de la figura 5.4g, obtenemos
que podemos llegar mediante caminos de aumento a los nodos 1, 2, 3, 4, 5, 7 y 8, usando arcos hacia
adelante o hacia atrás, pero no podemos llegar a los nodos 6, 9, 10 y t. Definiendo X = {s, 1, 2, 3, 4, 5, 7, 8}
y X = {6, 9, 10,t} (ver la figura 5.4h), el corte (X, X) es mínimo (en rojo en la figura 5.4h), con capacidad
27 (c(4, 6) + c(5, 6) + c(7,t) + c(8,t) = 6 + 6 + 10 + 5 = 27). Dicha capacidad coincide con el valor del
flujo f6 , que es maximal y vale también 27 (se puede obtener sumando todos los flujos que salen de s,
es decir, f (s, 1) + f (s, 2) + f (s, 3) = 10 + 7 + 10 = 27, o sumando todos los flujos incrementados por los
diferentes caminos de aumento de s a t, es decir, 10 + 5 + 5 + 1 + 4 + 2 = 27).

Aunque hemos ilustrado el ejemplo anterior usando figuras, y colocando los flujos sobre los arcos,
suele ser recomendable utilizar una tabla con los flujos en lugar de las figuras, y utilizar la información de
la tabla para realizar los cálculos. En cuanto la red es un poco grande y tiene muchos arcos, se producen
muchos cortes entre los arcos al dibujarlos, con lo que los números que se van colocando sobre los arcos
llevan a confusión, pues no se sabe al final qué flujo es el de cada arco o qué capacidad es la de cada
arco. La tabla 5.2 muestra cómo irían variando los flujos sobre los arcos conforme vamos encontrando
caminos de aumento de s a t.

c f1 f2 f3 f4 f5 f6
(s, 1) 10 10 10 10 10 10 10
(s, 2) 10 0 5 5 5 5 7
(s, 3) 10 0 0 5 6 10 10
(1, 7) 10 10 10 10 10 10 8
(1, 4) 10 0 0 0 0 0 2
(2, 8) 10 0 5 5 5 5 7
(3, 4) 10 0 0 5 6 6 4
(3, 5) 10 0 0 0 0 4 6
(4, 6) 6 0 0 5 6 6 6
(5, 6) 6 0 0 0 0 4 6
(6,t) 5 0 0 5 5 5 5
(6, 9) 10 0 0 0 1 5 7
(7,t) 10 10 10 10 10 10 10
(8, 7) 5 0 0 0 0 0 2
(8,t) 5 0 5 5 5 5 5
(9, 10) 5 0 0 0 0 0 2
(9,t) 5 0 0 0 1 5 5
(10,t) 5 0 0 0 0 0 2

Tabla 5.2: Flujos obtenidos a través de los caminos de aumento en el ejemplo 5.1.

Los caminos de aumento de s a t que hemos ido obteniendo en el ejemplo han sido los siguientes.
Grafos y Combinatoria. Javier Tejel 173

1. s → 1 → 7 → t
2. s → 2 → 8 → t
3. s → 3 → 4 → 6 → t
4. s → 3 → 4 → 6 → 9 → t
5. s → 3 → 5 → 6 → 9 → t
6. s → 2 → 8 → 7 ← 1 → 4 ← 3 → 5 → 6 → 9 → 10 → t
Observar que la longitud de dichos caminos nunca decrece: o se mantiene o se incrementa. Esta es
la propiedad fundamental del algoritmo de Edmonds-Karp: los caminos de aumento de s a t que se van
obteniendo en las sucesivas aplicaciones del BFS “out + in” van incrementando siempre su longitud (o se
mantienen). Esto permite demostrar que el número de iteraciones del algoritmo es a lo más n · m. Vamos
ya con la demostración de este resultado.
Teorema 5.3. Sea G = (V, A, s,t, c) una red de flujo con n nodos y m arcos. El número de iteraciones que
realiza el algoritmo de Edmonds-Karp es siempre menor que n · m.
Demostración. Sean fl y fl+1 dos flujos consecutivos obtenidos por el algoritmo. Sean dl (i) y dl+1 (i) las
longitudes de un camino de aumento de longitud mínima desde s hasta i cuando se consideran fl y fl+1 ,
respectivamente (o el valor ∞ si no existe ese camino). Notar que dichos caminos los da la aplicación de
BFS “out + in” sobre fl y sobre fl+1 .
Sea P′ = (s = i0 ↔ i1 ↔ . . . ↔ ih−1 ↔ ih ) un camino de aumento en fl+1 , que comienza en s y
termina en un nodo ih . Vamos a probar que dl (ih ) ≤ dl (ih−1 ) + 1. Distinguimos dos casos en función de
si el último arco de P′ es un arco hacia adelante o un arco hacia atrás.
Supongamos primero que el último arco de ese camino P′ es hacia adelante, es decir, tenemos ih−1 →
ih . Por tanto, el arco (ih−1 , ih ) no puede estar saturado en fl+1 , con lo que fl+1 (ih−1 , ih ) < c(ih−1 , ih ).
Tenemos dos casos según el valor del flujo fl (ih−1 , ih ) que circula por el arco (ih−1 , ih ) en el flujo fl .
Si fuese fl (ih−1 , ih ) = c(ih−1 , ih ), como fl+1 (ih−1 , ih ) < c(ih−1 , ih ), entonces la única posibilidad es que
el arco (ih−1 , ih ) se haya usado como arco hacia atrás en el camino de aumento de s a t que permitió
obtener fl+1 desde fl , con lo que dl (ih−1 ) = dl (ih ) + 1. En particular, esa igualdad implica que dl (ih ) <
dl (ih−1 ) + 1. Por el contrario, si fl (ih−1 , ih ) < c(ih−1 , ih ), entonces necesariamente dl (ih ) ≤ dl (ih−1 ) + 1,
y tendremos igualdad sólo si hay un camino de aumento en fl desde s a ih , de longitud mínima, que llega
a ih de la forma ih−1 → ih , la misma que en P′ .
Supongamos ahora que el último arco de P′ es hacia atrás, es decir, tenemos ih−1 ← ih , con lo que
fl+1 (ih , ih−1 ) > 0. Estudiemos otra vez dos casos según el valor de fl (ih , ih−1 ). Si fl (ih , ih−1 ) = 0, nece-
sariamente (ih , ih−1 ) se ha usado como arco hacia adelante en el camino de aumento de s a t que permite
obtener fl+1 desde fl , y por tanto dl (ih−1 ) = dl (ih ) + 1. En particular, dl (ih ) < dl (ih−1 ) + 1. Por el con-
trario, si fl (ih , ih−1 ) > 0, entonces necesariamente dl (ih ) ≤ dl (ih−1 ) + 1, y tendremos igualdad sólo si
hay un camino de aumento en fl desde s a ih , de longitud mínima, que termina como en P′ , de la forma
ih−1 ← ih .
Por lo tanto, en cualquier caso, dl (ih ) ≤ dl (ih−1 ) + 1, como queríamos probar. Esta desigualdad es
válida para cualquier ih para el que haya camino de aumento en fl+1 . Además, si hay igualdad, entonces
hay un camino (en fl ) de longitud mínima que llega a ih desde ih−1 exactamente como se hacía en P′ .
Veamos a continuación la relación entre los caminos de aumento de s a t en fl y los de fl+1 .
Supongamos que dl+1 (t) = k y que P′ = (s = i0 ↔ i1 . . . ↔ ik = t) es un camino de aumento de s a t
de longitud mínima en fl+1 . La existencia de P′ garantiza que todos los nodos de P′ son accesibles desde
s mediante caminos de aumento, con lo que usando la desigualdad previa dl (ih ) ≤ dl (ih−1 ) + 1, tenemos
que 1 ≥ dl (ih ) − dl (ih−1 ), y que
dl+1 (t) = k = 1 + 1 + 1 + . . . + 1 ≥ dl (i1 ) − dl (i0 ) + dl (i2 ) − dl (i1 ) + . . . + dl (ik ) − dl (ik−1 ) = dl (t) − dl (s)
Por tanto, siempre se cumple que dl (t) ≤ dl+1 (t) = k, pues dl (s) = 0. En particular, esto implica que
conforme se van calculando flujos fl en el algoritmo, las longitudes de los caminos de aumento más
cortos de s a t nunca decrecen.
174 Capítulo 5. Flujo en redes y aplicaciones

Veamos ahora qué sucede si hay igualdad, es decir, si dl+1 (t) = dl (t) = k. Sea F el conjunto de arcos
que aparecen en algún camino de aumento (de s a t) en fl de longitud k, y sea F ′ el conjunto de arcos en
caminos de aumento (de s a t) de longitud k en fl+1 . Vamos a demostrar que F ′ ⊂ F.
Sea P′ un camino de aumento de s a t en fl+1 de longitud minima k. Ya que dl+1 (t) = dl (t), necesa-
riamente dl (ih ) = dl (ih−1 ) + 1 para cualquier ih de P′ . Si ih es cualquier nodo de P′ distinto de s, como
dl (ih ) − dl (ih−1 ) = 1, tiene que ser que la conexión usada en P′ para pasar de ih−1 a ih puede usarse para
pasar de ih−1 a ih en un camino de aumento de longitud mínima en fl . Como esto es cierto para todo
ih ̸= s, ese camino P′ también es un camino de aumento para fl . Además, esto es válido para cualquier
P′ de longitud mínima, por lo que F ′ ⊆ F.
Por otra parte, si un arco (i, j) se usa en un camino de aumento mínimo de s a t en fl como arco
hacia adelante (luego dl ( j) = dl (i) + 1), no puede suceder que aparezca como un arco hacia atrás en otro
camino de aumento mínimo de s a t en fl (pues entonces dl ( j) = dl (i) + 1), y viceversa. Pero como al
pasar de fl a fl+1 hemos usado un camino de aumento P de s a t, mínimo en fl , o bien hemos saturado
un arco (i, j) de ese camino, o bien hemos puesto a 0 el flujo de un arco (i, j) de P. En cualquiera de los
dos casos, ya no podremos usar ese arco (i, j) en un camino de aumento mínimo de s a t en fl+1 , puesto
que como dl (ih ) − dl (ih−1 ) = 1, los caminos de aumento mínimos que llegan a j en fl y fl+1 han de
hacerlo en la misma dirección. Por tanto, ese arco no puede pertenecer a F ′ , por lo que F ′ está contenido
estrictamente en F.
De lo anterior deducimos que, dado k, la igualdad dl (t) = dl+1 (t) = k podrá verificarse como máximo
m − k veces, pues en cada iteración se va perdiendo al menos un arco como candidato a pertenecer a un
camino de aumento mínimo de s a t. Por otra parte, k es el número de arcos de un camino de aumento
(simple) de s a t, y por tanto 1 ≤ k ≤ n − 1. En consecuencia, como mucho haremos m · n iteraciones.

Nota 5.1. Como la complejidad del algoritmo BFS “out + in” es O(n + m), la complejidad del algoritmo
de Edmonds-Karp es O((n + m)nm). En la práctica, el número de iteraciones que necesita el algoritmo
para encontrar un flujo maximal suele ser muy pequeño, con lo que el algoritmo es bastante eficiente.

5.1.3. Teorema de máximo flujo-mínimo corte


La combinación de los Teoremas 5.1 y 5.3, junto con el Corolario 5.2, dan la demostración del
siguiente teorema, conocido como el Teorema de máximo flujo-mínimo corte.

Teorema 5.4 (Teorema de máximo flujo-mínimo corte). Sea G = (V, A, s,t, c) una red de flujo. El valor
máximo de v( f ), tomado entre todos los posibles flujos f , es igual al mínimo de c(X, X), tomado entre
todos los cortes (X, X).

Demostración. Por el Corolario 5.2, basta ver que el conjunto de nodos accesibles desde s mediante
caminos de aumento no es todo V .
Por definición, cuando se aplica el método BFS “out + in” siempre se obtiene el conjunto de nodos
que son accesibles desde la raíz. Por tanto, cuando el algoritmo de Edmonds-Karp termina (en un número
finito de pasos), es porque t no es accesible desde s, con lo que no existen caminos de aumento de s a t
en el último flujo f calculado y el conjunto de nodos accesibles desde s mediante caminos de aumento
no es todo V para el flujo f . En ese caso, por el Corolario 5.2, f es maximal y v( f ) = c(X, X), donde
(X, X) es un corte mínimo y X es el conjunto de nodos accesibles desde s mediante caminos de aumento
para el flujo f . Dicho conjunto lo proporciona la última aplicación del BFS “out + in” en el algoritmo, la
aplicación del BFS “out + in” sobre f .

Resaltar por último que, dado un corte (X, X) mínimo, como s está en X y t en X, los arcos que
llegan a s y los arcos que salen de t nunca pueden estar en ese corte. Y eso sucede para cualquier corte
mínimo. Por tanto, independientemente de la capacidad que se les asigne a esos arcos, el valor de un flujo
maximal no cambia, incluso aunque se les asigne capacidad cero. Pero asignar capacidad cero equivale
a inutilizar esos arcos, a impedir que circule flujo por ellos. Por ello, en la práctica, se suelen omitir los
arcos que salen de t y los que llegan a s, a la hora de calcular un flujo maximal.
Grafos y Combinatoria. Javier Tejel 175

Nota 5.2. Además del algoritmo de Edmonds y Karp, que es uno de los más conocidos para calcular
un flujo maximal, existen otros algoritmos para calcular flujos maximales. Algunos de ellos incluso más
eficientes desde el punto de vista computacional que el algoritmo basado en BFS “out + in”. A modo de
ejemplo, hacemos referencia a dos de esos algoritmos, el de Dinic, basado en la construcción de flujos
“bloqueadores”, y el de Goldberg y Tarjan, basado en el manejo de “preflujos”.

5.2. Variantes y extensiones del problema de máximo flujo


En la sección 5.1 hemos resuelto el problema de máximo flujo para un tipo de red particular. En esta
sección, veremos cómo aplicar los resultados de esa sección a algunas otras redes más generales.

5.2.1. Arcos sin capacidad superior


En algunas situaciones prácticas, aparecen arcos sin límite de capacidad superior en una red. En esos
casos, lo usual es asignar a esos arcos una capacidad infinita, es decir, si el arco (i, j) no tiene límite de
capacidad, entonces hacemos c(i, j) = ∞.
Una vez hecha esa definición, si aplicamos directamente el algoritmo de Edmonds-Karp sobre la
nueva red, nos encontramos con algunas dificultades. Por ejemplo, si por un arco circula un flujo ∞, ¿está
o no saturado ese arco? Si a un nodo i entra un flujo ∞, y sale de i un flujo de 5 unidades por un arco y
un flujo infinito por otro, ¿se conserva el flujo en ese nodo?
Esta situación se resuelve de la siguiente manera. Cuando aparecen capacidades ∞ en una red de
flujo G = (V, A, s,t, c), lo primero que hemos de hacer es determinar si hay un camino dirigido de s a t
formado por arcos con capacidad infinita. Para determinar dicho camino (si existe), basta con aplicar el
método BFS “out” sobre la red, considerando sólo los arcos con capacidad infinita. En el caso de que sí
exista ese camino de s a t, entonces podemos enviar por ese camino una cantidad de flujo arbitraria, con
lo que no va a existir un flujo máximo, pues el flujo en la red puede hacerse todo lo grande que queramos
usando ese camino.
Supongamos por el contrario que no existe ese camino de s a t. Sea X el conjunto de nodos (incluido
s) tales que, para cualquier i ∈ X, existe un camino dirigido de s a i usando arcos con capacidad infinita.
Como t no puede estar en X, si consideramos el corte (X, X), entonces se tiene que la capacidad c(i, j) de
cualquier arco (i, j) ∈ (X, X) es finita. Esto es así, puesto que si la capacidad c(i, j) fuese infinita, como
existe un camino dirigido de s a i usando arcos con capacidad infinita, también existiría un camino diri-
gido de s a j usando arcos con capacidad infinita, lo que es una contradicción pues estamos suponiendo
que j no está en X. Por tanto, necesariamente c(X, X̄) es finito. Esto implica que va a existir un flujo
maximal con valor del flujo finito, y podemos por consiguiente usar el algoritmo de Edmonds-Karp para
calcularlo.

Ejemplo 5.2. Para la red mostrada en la figura 5.5a, calcular un flujo maximal, si existe.

Solución. Como algunos de los arcos tiene capacidad ∞, aplicamos BFS “out” sobre la red, comenzando
en s y considerando sólo los arcos con capacidad ∞. La figura 5.5b muestra el árbol BFS “out” obtenido
tras su aplicación (en rojo en la figura). Como no hay camino dirigido de s a t usando arcos con capacidad
infinita, podemos aplicar el algoritmo de Edmonds-Karp para calcular un flujo maximal. La aplicación
de dicho algoritmo nos da que el flujo máximo es 24 y un mínimo corte (X, X) está definido por los
conjuntos X = {s, 1, 2, 3} y X = {4, 5,t}. La capacidad de dicho corte es c(s, 5) + c(1, 5) + c(2,t) +
c(2, 5) + c(3, 4) + c(3, 5) = 5 + 4 + 2 + 2 + 8 + 3 = 24. La figura 5.5c ilustra el flujo maximal obtenido y
el mínimo corte, donde las aristas del corte se muestran en rojo.

Notar que en el ejemplo anterior, el conjunto X del corte obtenido (figura 5.5c) coincide con los
nodos accesibles desde s mediante arcos con capacidad infinita (figura 5.5b), pero esto no suele ser lo
habitual.
176 Capítulo 5. Flujo en redes y aplicaciones

8 0 8
1 ∞ 2 1 ∞ 2 X 1 ∞ 4 2
8 4 0 2
∞ 4 2 ∞ ∞ 2
4 4
4 2 2
2
5 t t s 55 t
s s 9 9
9 5
5 ∞
5 ∞ ∞
∞ 3 5 13
∞ ∞ 3 ∞
3 ∞ ∞ 11 X
8 8 8
3 4 8 3 4 3 4 8
0

(a) (b) (c)

Figura 5.5: Máximo flujo sobre una red de flujo con algunas capacidades infinitas.

5.2.2. Varios orígenes y destinos


En la práctica, es muy frecuente que el material que deseamos transportar por una red pueda ser
“producido” en muchos “orígenes” y pueda ser “consumido” en varios “destinos”, es decir, en lugar de
tener un único origen s se tienen s1 , s2 , . . . , sh orígenes, y en lugar de tener un único destino t se tienen
t1 ,t2 , . . . ,tk destinos. Además, muchas veces sucede que cada nodo origen si tiene un límite superior pi
sobre la cantidad de material que puede producir, y cada nodo destino t j tiene un límite superior q j sobre
la cantidad de material que puede consumir.
Cuando esto sucede, la solución es muy sencilla. Basta añadir un nodo origen ficticio s y conectar
s con cada uno de los orígenes si mediante un arco (s, si ), y añadir un nodo destino ficticio t y conectar
cada uno de los destinos t j con t mediante un arco (t j ,t). Para cada si , la capacidad que se asigna al arco
(s, si ) es pi , lo que se puede producir como mucho en si , y para cada t j , la capacidad que se asigna al arco
(t j ,t) es qi , lo que se puede consumir como mucho en t j . Claramente, por construcción, un flujo maximal
en este grafo ampliado resuelve el problema de máximo flujo de la red inicial.

Ejemplo 5.3. Supongamos que en la red de la figura 5.6 se produce un cierto material en los nodos 4
y 9. El ritmo máximo de producción en el nodo 9 es de 40 unidades y en el nodo 4 de 50 unidades. El
material producido sólo puede consumirse en los nodos 1 y 2, a un ritmo de 40 unidades como máximo
en cada uno de esos dos nodos. Con las restricciones de capacidad sobre los arcos mostradas en la figura,
¿cuánto material puede circular como máximo por la red desde los orígenes a los destinos?

9
2
1
42
41 3
12
14 25
9 32
30
60 45

8 21 9 4
33 25
11
11 41

7 5
10 25 40
6

Figura 5.6: Red de flujo del ejemplo 5.3.

Solución. Como hay dos nodos de producción y dos nodos de consumo, creamos una nueva red con un
origen ficticio s conectado a los nodos 4 y 9, y con un destino ficticio t conectado a los nodos 1 y 2.
Grafos y Combinatoria. Javier Tejel 177

Las capacidades de los arcos (s, 4) y (s, 9) son 50 y 40, que es lo que se produce como mucho en 4 y
9, respectivamente, y la capacidad de los dos arcos (1,t) y (2,t) es 40, que es lo que se puede consumir
como máximo en los nodos 1 y 2. La nueva red se muestra en la figura 5.7a.

40 40 40

2 2
t 1 9 t 1 9 9
40 30 40 38
42 7 41 42
41 3 3
11
12 12 14

9
14 25
32
X 9
14 25
32
30 30 45
60 45 60 45

8 21 9 4 8 21 9 4
11 11 25
33 25 11 33
11 45
11 41 50 11 41 50
s 5 2540 s
7 5 40 7 25
10 25 40 10 40
6 6 X
(a) (b)

Figura 5.7: Máximo flujo para la red del ejemplo 5.3, cuando hay varios orígenes y destinos.

Al resolver el problema de máximo flujo sobre la nueva red, obtenemos que el flujo máximo que
puede circular es 70 y el mínimo corte (X, X) esta definido por X = {s, 4, 5, 6, 7, 9} y X = {1, 2, 3, 8,t}.
Las aristas del corte son (4, 3), (7, 8) y (9, 1), y la capacidad del corte es c(4, 3) + c(7, 8) + c(9, 1) =
45 + 11 + 14 = 70. En consecuencia, a pesar de que se produce suficiente material en los nodos 4 y 9 (90
unidades en total) para satisfacer la demanda de material en los nodos 1 y 2, que es de 80 unidades, no
es posible satisfacer toda la demanda por las restricciones de capacidad de la red.

Aunque en el ejemplo anterior no ha sucedido, hay ocasiones en las que alguna de las aristas ficticias
pertenece al corte. Si eso sucede, lo que indica es no puede circular más material por la red por las
restricciones de producción de alguno de los nodos o por las restricciones de consumo de alguno de los
nodos. Por ejemplo, supongamos que en el ejercicio anterior hubiese aparecido en el corte el arco (s, 9).
Eso significa que si en el nodo 9 se produjesen más unidades, entonces se incrementaría la capacidad del
corte al incrementar c(s, 9), con lo se podría enviar más material por la red.

5.2.3. Capacidades en los nodos


Hay situaciones prácticas en las que también hay límites sobre lo que puede circular por cada nodo.
En estos casos, si todo lo que entra al nodo i (y por consiguiente también lo que sale) tiene un límite li ,
lo que se hace es descomponer el nodo i en dos nodos ficticios, el nodo de entrada i− y el de salida i+ .
Los arcos que llegan a i en la red original serán los arcos de entrada a i− en la nueva red, y los arcos que
salen de i en la red original serán los arcos que salen de i+ en la nueva red. Además, se añade el arco
(i− , i+ ) con capacidad li , que es el que va a controlar que por el nodo i no circule más material del que
debe.
Por construcción de la nueva red, es claro que resolviendo el problema de máximo flujo sobre la
nueva red se resuelve el problema de máximo flujo sobre la red original.
Veamos un ejemplo.

Ejemplo 5.4. Supongamos que en la red de la figura 5.8 el máximo de unidades de flujo que puede
circular por los nodos 2, 5 y 3 es 5, 8 y 5, respectivamente. Calcular el máximo flujo que puede circular
por la red.
178 Capítulo 5. Flujo en redes y aplicaciones

1 5 2
4 2
9 4 2
5 t
s 9
5 5
6 3 10
8
3 4

Figura 5.8: Red de flujo del ejemplo 5.4.

Solución. Como hay restricciones de capacidad sobre los nodos 2, 3 y 5, duplicamos esos nodos tal y
como se muestra en la figura 5.9a. Los arcos que llegaban a los nodos 2, 3, y 5 ahora llegan a los nodos
2− , 3− y 5− , respectivamente, y los arcos que salían de los nodos 2, 3, y 5, ahora salen de los nodos
2+ , 3+ y 5+ , respectivamente. Las capacidades de los arcos (2− , 2+ ), (3− , 3+ ) y (5− , 5+ ) son 5, 5 y 8,
respectivamente, que son las restricciones de capacidad de los nodos 2, 3 y 5.

1 2− 2+
1 2− 2+
52
5
5
X 52
5 4 2
4 2 9 3 2
9 4 2
4 2
5− 5+ t
5 5− 5+ t s 55
s 9
88 9 8
8 5
5 6 5
6 5 3 10
3 10
5 8
55 85 X
3− 4
3 − 4 3+
3+
(a) (b)

Figura 5.9: Máximo flujo para la red del ejemplo 5.4, cuando hay restricciones de capacidad sobre los
nodos 2, 3 y 5.

Al resolver el problema de máximo flujo sobre la nueva red, obtenemos que el máximo flujo que
puede circular es 15, y el mínimo corte (X, X) está definido por los conjuntos X = {s, 1, 2− , 2+ , 3− , 5− }
y X = {3+ , 4, 5+ ,t}. La capacidad del corte es c(2+ ,t) + c(3− , 3+ ) + c(5− , 5+ ) = 2 + 5 + 8 = 15. El
hecho de que aparezcan los arcos (3− , 3+ ) y (5− , 5+ ) en el corte implica que son las restricciones de
capacidad de los nodos 3 y 5 las que impiden que puedan circular más unidades por la red original.

5.2.4. Redes no dirigidas y redes mixtas


En algunas aplicaciones la red sobre la que se desea calcular el máximo flujo es no dirigida. Pensemos
por ejemplo que las aristas son cables de transmisión eléctrica, en los que la transmisión de electricidad
puede realizarse en los dos sentidos. También podemos tener redes mixtas, en las que algunas conexiones
son dirigidas y otras pueden usarse en dos sentidos opuestos, como por ejemplo puede suceder en una red
de ferrocarriles, en las que puede haber una sola vía por la que los trenes pueden circular en un sentido o
en el otro.
Para estos casos, la modificación que se hace de la red de flujo es la siguiente. Cada arista no dirigida
(i, j), con capacidad c(i, j), se sustituye por dos arcos dirigidos distintos, los arcos (i, j) y ( j, i), ambos
con capacidad c(i, j). Las únicas excepciones son las aristas no dirigidas en la que uno de los extremos
es s o t. Una arista no dirigida (s, i), con capacidad c(s, i), se sustituye por un arco dirigido (s, i) con
capacidad c(s, i), y una arista no dirigida (i,t), con capacidad c(i,t), se sustituye por un arco dirigido
(i,t) con capacidad c(i,t). Recordar que por los arcos que salen de t o los arcos que llegan a s nunca
Grafos y Combinatoria. Javier Tejel 179

circula flujo en un flujo maximal, por lo que no necesitamos incluir en la nueva red arcos que salgan de
t o que lleguen a s.
Sobre la nueva red obtenida, se resuelve el problema de máximo flujo. Al resolver el problema sobre
la nueva red, es posible que obtengamos un flujo f (i, j) positivo en el arco dirigido (i, j) y un flujo f ( j, i)
también positivo en el arco opuesto ( j, i). Esto puede ser físicamente imposible sobre la red inicial
(imaginemos trenes en dirección contraria por la misma vía), pero tiene fácil solución. Si, por ejemplo,
f ( j, i) es el menor de f (i, j) y f ( j, i), restamos a ambos flujos la cantidad f ( j, i). Lo que obtenemos
sigue siendo un flujo, con el mismo valor, donde ya no circula flujo por el arco ( j, i).

Ejemplo 5.5. Calcular el máximo flujo que puede circular por la red no dirigida de la figura 5.10.

5
1 5 2 1 2
5
4 2 2
9 4 9 4 4 4 4

t 5 5 t
5 s
s 9 9
5 5
6 3 3
6 3 5 10
10 5
8 8
3 4 3 4
8
(a) (b)

Figura 5.10: Red de flujo del ejemplo 5.5.

Solución. Las aristas (s, i) incidentes a s con capacidad c(s, i) se sustituyen por arcos dirigidos (s, i) con
capacidad c(s, i). Las aristas (i,t) incidentes a t con capacidad c(i,t) se sustituyen por arcos dirigidos
(i,t) con capacidad c(i,t). El resto de aristas (i, j), con capacidad c(i, j), se sustituyen por dos arcos
dirigidos, los arcos (i, j) y ( j, i), con la misma capacidad c(i, j). La nueva red así obtenida se muestra en
la figura 5.10b.
5 5
1 2 1 5 5 2
5
9 2 9 4 2
X 9 4
4
4 4 4
2
X 9 4
3
4 2
3
55 5 t t
s 55
9 9 s 9 9
5 5
6 3 3 9 0 3 9
5 10 6 3
6 5 6 10
3
86 X 8 6 X
3 4 3 4
8
(a) (b)

Figura 5.11: Flujo maximal sobre la red dirigida y sobre la red original.

Al resolver el problema de máximo flujo sobre la nueva red, obtenemos el flujo maximal mostrado en
la figura 5.11a. El valor del flujo es 20 y el corte (X, X) viene definido por X = {s} y X = {1, 2, 3, 4, 5,t}.
Los arcos del corte son (s, 1), (s, 3) y (s, 5), y su capacidad es c(s, 1) + c(s, 3) + (s, 5) = 9 + 5 + 6 = 20.
La figura 5.11b muestra el flujo maximal sobre la red no dirigida original, y la dirección en la que se
debería enviar el flujo por las aristas no dirigidas para maximizar el flujo.

Si al resolver el problema de máximo flujo sobre la red dirigida de la figura 5.10b, hubiésemos
obtenido que f (2, 5) = 4 y f (5, 2) = 1, entonces construiríamos un nuevo flujo restando 1 unidad de flujo
180 Capítulo 5. Flujo en redes y aplicaciones

(el mínimo entre f (2, 5) = 4 y f (5, 2) = 1) a los dos flujos, obteniendo un nuevo flujo donde f (2, 5) = 3
y f (5, 2) = 0.

5.2.5. Restricciones inferiores sobre la capacidad


Además de un límite superior sobre la capacidad de un arco (i, j), hay ocasiones en las hay también
un límite inferior l(i, j) sobre la capacidad de ese arco. Ese límite inferior l(i, j) marca el flujo que, por
las circunstancias que sean, debe circular como mínimo por el arco (i, j).
En estas condiciones, una red de flujo G = (V, A, s,t, c, l) va a ser ahora un grafo dirigido G = (V, A)
simple y conexo, con dos nodos distinguidos s y t, donde cada arco (i, j) ∈ A tiene asociadas dos canti-
dades, la capacidad superior c(i, j) y la capacidad inferior l(i, j), satisfaciendo que l(i, j) ≤ c(i, j).
La nueva ley de compatibilidad de flujo es en este caso

l(i, j) ≤ f (i, j) ≤ c(i, j), ∀(i, j) ∈ A (5.4)

Los razonamientos hechos en la sección 5.1 para demostrar que existía un flujo maximal y encon-
trarlo sirven también en esta nueva situación, en la que además de capacidades superiores hay también
capacidades inferiores. Sin entrar en los detalles y las demostraciones, damos cuáles serían los principa-
les resultados y el proceso para encontrar un flujo maximal.
De una manera similar a como se definieron c(X, X) y f (X,Y ) para dos conjuntos X e Y de nodos, la
cantidad l(X,Y ) se define como
l(X,Y ) = ∑ l(i, j)
(i, j)∈(X,Y )

es decir, la suma de las capacidades inferiores de los arcos que conectan nodos de X con nodos de Y .
Dado un corte (X, X), decimos que es mínimo si c(X, X) − l(X, X) ≤ c(Y,Y ) − l(Y,Y ), para cualquier
otro corte (Y,Y ).
Los resultados equivalentes al Lema 5.2 y al Corolario 5.1 serían los siguientes.

Lema 5.3. Sea f un flujo sobre una red de flujo G = (V, A, s,t, c, l), y sea (X, X) un corte cualquiera.
Entonces,
v( f ) = f (X, X) − f (X, X) ≤ c(X, X) − l(X, X) (5.5)

Corolario 5.3. Sea f un flujo sobre una red de flujo G = (V, A, s,t, c, l) y sea (X, X) un corte. Si v( f ) =
c(X, X) − l(X, X), entonces f es maximal, (X, X) es mínimo, f (X, X) = c(X, X) y f (X, X) = l(X, X).

Un camino de aumento será ahora un camino no dirigido de s a t, donde el flujo f (i, j) en los arcos
hacia adelante i → j es menor que la capacidad superior c(i, j) (y la holgura de ese arco es c(i, j) −
f (i, j)), y el flujo f (i, j) en los arcos hacia atrás j ← i es mayor que la capacidad inferior l(i, j) (y la
holgura de ese arco es f (i, j) − l(i, j)).
El Teorema 5.1 se sigue cumpliendo con esta nueva definición de camino de aumento.

Teorema 5.5. Un flujo f sobre una red de flujo G = (V, A, s,t, c, l) es maximal, si y sólo si, no existen
caminos de aumento desde s hasta t para f .

Si existe un camino de aumento para f , se puede construir un nuevo flujo f ′ a partir del flujo f como
sigue. Si ε es el mínimo de las holguras de los arcos del camino de aumento, el nuevo flujo f ′ (i, j) será
f ′ (i, j) = f (i, j) + ε, si el arco (i, j) es hacia adelante, y f ′ (i, j) = f (i, j) − ε, si el arco (i, j) es hacia
atrás. El flujo en el resto de los arcos no cambia. El valor del nuevo flujo f ′ se incrementa en ε.
Por tanto, también se puede utilizar el método de Ford-Fulkerson o el de Edmonds-Karp para obtener
un flujo maximal a partir de un flujo inicial f0 . Se tiene entonces el siguiente Teorema de máximo flujo-
mínimo corte.

Teorema 5.6. Sea G = (V, A, s,t, c, l) una red de flujo. El valor máximo de v( f ), tomado entre todos los
posibles flujos f , es igual al mínimo de c(X, X) − l(X, X), tomado entre todos los cortes (X, X).
Grafos y Combinatoria. Javier Tejel 181

Nota 5.3. Para este caso de capacidades inferiores, también tiene sentido el problema de calcular un flujo
mínimo. Su cálculo se hace de forma similar a como se calcula el máximo flujo.
Lo primero es observar que para cualquier flujo f y corte (X, X) se tiene que

v( f ) = f (X, X) − f (X, X) ≥ l(X, X) − c(X, X)

Lo segundo es observar que el valor de un flujo se puede disminuir utilizando caminos de dismi-
nución. Un camino de disminución es un camino no dirigido de s a t tal que un arco (i, j) se puede
utilizar hacia adelante si f (i, j) > l(i, j), y se puede utilizar hacia atrás si c(i, j) > f (i, j). Tomando ε
como el mínimo de las holguras f (i, j) − l(i, j) para los arcos hacia adelante y c(i, j) − f (i, j) en los arcos
hacia atrás, se puede construir un nuevo flujo f ′ decreciendo en ε el flujo en los arcos hacia adelante y
aumentándolo en ε en los arcos hacia atrás, de tal forma que el valor del flujo f ′ disminuye en ε,
Usando BFS se puede demostrar que, dado un flujo inicial f0 sobre la red, el proceso de disminuir el
flujo mediante caminos de disminución termina. Se tiene entonces el resultado equivalente al Teorema de
máximo flujo-mínimo corte, que establece que el valor mínimo de v( f ) tomado entre todos los posibles
flujos f es igual al máximo de l(X, X) − c(X, X), tomado entre todos los cortes (X, X).

Flujo compatible
El algoritmo de Edmonds-Karp (o el de Ford-Fulkerson) se puede aplicar sin problemas para calcular
el máximo flujo cuando hay capacidades inferiores, siempre y cuando exista un flujo inicial f0 sobre el
que aplicarlo. Cuando las capacidades inferiores eran cero, podíamos tomar el flujo nulo como el flujo
inicial sobre el que realizar los cálculos. Sin embargo, cuando las capacidades inferiores no son cero, no
es obvio que exista un flujo inicial f0 que satisfaga la nueva ley de compatibilidad l(i, j) ≤ f (i, j) ≤ c(i, j).
A un flujo que satisfaga dicha ley lo llamaremos flujo compatible.
Se tiene entonces un problema nuevo. Dada una red de flujo G = (V, A, s,t, c, l), decidir si existe o
no un flujo f0 compatible con la red, y en caso de que exista cómo calcularlo. Si existe dicho flujo y lo
hemos calculado, a partir de ese flujo ya se podrá aplicar el algoritmo de Edmonds-Karp para calcular un
flujo maximal sobre una red con capacidades superiores e inferiores.
Sin entrar en muchos detalles ni demostraciones, en lo que sigue veremos cómo se suele resolver este
nuevo problema de encontrar un flujo compatible.
Supongamos que G = (V, A, c, l) es una red simple y conexa, sin nodos distinguidos, y con capaci-
dades inferiores l(i, j) y superiores c(i, j) sobre los arcos (i, j). Llamaremos circulación sobre G, a una
aplicación f de V ×V en R verificando la ley de conservación de flujo en todos los nodos, es decir,

f (i,V ) = f (V, i) ∀i ∈ V

Notar que una circulación f cualquiera no tiene por qué satisfacer la ley de compatibilidad de un
flujo, es decir, no tiene por qué satisfacer que l(i, j) ≤ f (i, j) ≤ c(i, j) para todos los flujos f (i, j) sobre
los arcos. Si una circulación satisface la ley de compatibilidad, entonces diremos que es compatible con
la red.
Tomemos una red de flujo G = (V, A, s,t, c, l). Si añadimos el arco (t, s), con capacidad inferior
l(t, s) = −∞ y capacidad superior c(t, s) = ∞, podemos definir una nueva red G′ = (V, A, c, l) sin nodos
distinguidos. Observar que un flujo f sobre G se puede transformar en una circulación f ′ sobre G′ sin
más que asignar al arco (t, s) de G′ un flujo f ′ (t, s) = v( f ), y al resto de los arcos (i, j) el flujo que tenían
en G, es decir, f ′ (i, j) = f (i, j). Recíprocamente, si encontramos una circulación compatible f ′ en G′ , y
por el arco (t, s) circula un flujo f ′ (t, s) = v, haciendo f (i, j) = f ′ (i, j) para todos los arcos (i, j) de G,
obtenemos un flujo f compatible en G tal que v( f ) = v. Por tanto, para hallar un flujo compatible en G
(o demostrar que no existe) nos basta con hallar una circulación compatible en G′ (o demostrar que no
existe).
Veamos pues como calcular una circulación compatible para una red G = (V, A, c, l) con restriccio-
nes de capacidad inferiores y superiores, pero sin nodos distinguidos. Dada una circulación f sobre G,
182 Capítulo 5. Flujo en redes y aplicaciones

llamaremos desviación de un arco (i, j) a la cantidad



 f (i, j) − c(i, j) si f (i, j) > c(i, j)
D f (i, j) = l(i, j) − f (i, j) si f (i, j) < l(i, j)
0 en los demás casos.

y llamaremos desviación total a la cantidad


D f (V,V ) = ∑ D f (i, j)
(i, j)∈A

De forma similar al Lema 5.2, ahora se tiene el siguiente resultado.


Lema 5.4. Sea f una circulación sobre la red G = (V, A, c, l) y X ⊆ V cualquier subconjunto de nodos.
Entonces 0 = f (X, X) − f (X, X). Además, si f es compatible se cumple que
0 = f (X, X) − f (X, X) ≤ c(X, X) − l(X, X)
En la sección 5.1, podíamos aumentar el valor de un flujo si existía un camino de aumento de s
a t. En circulaciones, se puede disminuir la desviación total si existen caminos de aumento en arcos
con desviación positiva. Sea f una circulación sobre una red G = (V, A, c, l) y sea (i, j) un arco con
desviación positiva, es decir, o bien f (i, j) − c(i, j) > 0 ó bien l(i, j) − f (i, j) > 0. Supongamos primero
que f (i, j) > c(i, j). En este caso, llamaremos camino de aumento para f a un camino no dirigido P
desde j a i tal que en los arcos il−1 → il hacia adelante de P se tiene que f (il−1 , il ) > l(il−1 , il ) y en los
arcos hacia atrás il−1 ← il de P se tiene que f (il , il−1 ) < c(il , il−1 ). Supongamos ahora que f (i, j) < l(i, j).
Llamaremos camino de aumento para f a un camino no dirigido P desde j a i tal que en los arcos hacia
adelante il−1 → il se tiene que f (il−1 , il ) < c(il−1 , il ) y en los arcos hacia atrás il−1 ← il se tiene que
f (il , il−1 ) > l(il , il−1 ).
Con estas definiciones, se puede demostrar el siguiente resultado, similar al Teorema 5.1.
Teorema 5.7. Sea f una circulación sobre una red G = (V, A, c, l) y sea (i, j) un arco con desviación
positiva. Si existe un camino de aumento de j a i para f , entonces existe una circulación f ′ tal que
D f ′ (V,V ) < D f (V,V ).
Como sucedía en el cálculo del máximo flujo, este teorema permite ir construyendo circulaciones
con menor desviación. Si comenzamos con la circulación nula f0 , podemos ir obteniendo circulaciones
f0 , f1 , . . . , fk cada vez con menor desviación, siempre que existan caminos de aumento. Si los caminos
de aumento se buscan usando el método BFS, se puede demostrar que este proceso de ir disminuyendo
la desviación total siempre termina, y lo hace de una de estas dos maneras: o encuentra una circulación
compatible, o encuentra un conjunto de nodos X tal que c(X, X)− l(X, X) < 0. Si sucede esto último, este
conjunto X explica por qué no existe una circulación compatible, puesto que por el Lema 5.4, si existe
una circulación f compatible se tiene que verificar que 0 ≤ c(X, X) − l(X, X) para cualquier conjunto X
de nodos.
El siguiente teorema, similar al Teorema de máximo flujo-mínimo corte, suele conocerse con el
nombre de Teorema de la circulación compatible.
Teorema 5.8 (Teorema de la circulación compatible). Sea G = (V, A, c, l) una red con capacidades
inferiores l(i, j) y superiores c(i, j), tal que l(i, j) ≤ c(i, j). G tiene una circulación compatible con esas
capacidades, si y sólo si, ∀X ⊆ V se cumple que
c(X, X) − l(X, X) ≥ 0

5.3. Aplicaciones a conectividad en grafos


El Teorema de máximo flujo-mínimo corte permite dar demostraciones sencillas de varios resultados
clásicos en grafos. En particular, en esta sección vamos a ver algunas aplicaciones de dicho teorema sobre
la conectividad en grafos (Teoremas de Menger), sobre el cálculo de emparejamientos en grafos bipartitos
(Teorema de Köning-Egerváry) y sobre el cálculo de sistemas de representantes distintos (Teorema de
Hall).
Grafos y Combinatoria. Javier Tejel 183

5.3.1. Teoremas de Menger para arcos


La primera de las aplicaciones del Teorema de máximo flujo-mínimo corte está relacionada con el
siguiente ejemplo. Supongamos que nos dan el grafo dirigido de la figura 5.12a y nos preguntamos
cuántos arcos hay que eliminar del grafo para desconectar s de t, es decir, para que no haya caminos
dirigidos de s a t. Es fácil ver que si eliminamos tres arcos, por ejemplo los arcos (3,t), (5,t) y (6,t), que
son los tres arcos que llegan a t, desconectamos s de t. Pero, ¿podríamos desconectar s y t eliminando
sólo dos arcos? La respuesta sería no. Una forma de verlo es a través de la figura 5.12b. En dicha figura
se muestran tres caminos dirigidos de s a t, que son disjuntos en arcos. Por tanto, para desconectar s de t
hay que eliminar al menos un arco de cada uno de esos caminos.

2 2
1 3 1 3

s t s t

4 6 4 6
5 5
(a) (b)

Figura 5.12: Hay que eliminar tres arcos para separar s de t.

Esto es precisamente lo que establece el Teorema de Menger para arcos en grafos dirigidos, que
el máximo número de caminos dirigidos disjuntos en arcos entre dos nodos s y t de un grafo dirigido
coincide con el número mínimo de arcos que hay que eliminar para desconectar s y t.

Teorema 5.9 (Teorema de Menger para arcos). Sea G = (V, A) un grafo dirigido y sean s y t dos nodos
cualesquiera. El máximo número de caminos dirigidos disjuntos en arcos que pueden construirse desde
s a t es igual al número mínimo de arcos tales que al eliminarlos no hay caminos dirigidos de s a t.

Demostración. Sea kc el número máximo de caminos dirigidos desde s a t que no comparten ningún
arco. Por tanto, no puede haber kc + 1 caminos dirigidos de s a t disjuntos. Sea F una familia de kc
caminos dirigidos disjuntos en arcos desde s hasta t.
Sea ke el número mínimo de arcos que hay que eliminar para que no haya caminos dirigidos de s a t
en G. Por tanto, para cualquier conjunto de arcos E ′ tal que |E| < ke , sí hay camino dirigido de s a t en
G′ = (V, A − E ′ ). Hay que demostrar que kc = ke .
Si eliminamos un arco de cada uno de los kc caminos disjuntos de la familia F , ya no habrá caminos
dirigidos de s a t usando arcos de esa familia. Pero quizá haya que eliminar algún otro arco para que no
haya caminos dirigidos de s a t en G. Por tanto, tenemos una primera desigualdad, que ke ≥ kc .
Definamos ahora una red de flujo H = (V, A, s,t, c), asignando capacidad 1 a todos los arcos de A,
excepto a los arcos que salen de t o llegan a s. A esos arcos les asignamos capacidad 0 o directamente
podemos asumir que no existen en H, pues por el Teorema 5.4 o el Corolario 5.1, a la hora de calcular
un máximo flujo de s a t por esos arcos no va a circular flujo.
Sea k el valor de un flujo maximal f en H. Como todas las capacidades son enteras, por el Teorema
de integralidad (Teorema 5.2) todos los flujos f (i, j) son números enteros no negativos. Por tanto, al ser
c(i, j) = 1 para cualquier arco (i, j), se tiene que f (i, j) = 0 ó f (i, j) = 1. Sea (X, X) un corte mínimo.
Por el Teorema de máximo flujo-mínimo corte, sabemos que c(X, X) = k. Al ser todas las capacidades 1,
el corte (X, X) ha de contener exactamente k arcos. Si eliminamos esos arcos en H (o en G), ya no habrá
caminos dirigidos de s a t en H (ni en G), pues por la definición de corte, ya no hay conexiones entre
nodos de X y nodos de X. Pero podría suceder que, eliminando menos de k arcos, ya no haya caminos
dirigidos de s a t en G. En consecuencia, tenemos una segunda desigualdad, que k ≥ ke ≥ kc .
184 Capítulo 5. Flujo en redes y aplicaciones

Veamos ahora que kc ≥ k, con lo que tendremos que k = ke = kc . Para ello, definamos el grafo dirigido
G1 , formado por los arcos de H (que también son G) por los que circula flujo 1. Por la ley de conservación
de flujo, el flujo l que llegue a un nodo i (excepto para s y t) de H ha de salir de él. Al ser f (i, j) cero o
uno para cualquier arco (i, j), necesariamente tienen que existir l arcos con flujo 1 en H que llegan a i, y
otros l arcos con flujo 1 que salen de i. Por tanto, en G1 , ese nodo i tiene exactamente l arcos que llegan
a él y otros l que salen de él. Además, el hecho de que el valor del flujo sea k implica que en H hay k
arcos con flujo 1 que salen de s, y otros k arcos con flujo 1 que llegan a t. Por tanto, en G1 , también habrá
k arcos que salen de s y otros k arcos que llegan a t.
Coloreando los arcos de G1 , vamos a probar que G1 contiene k caminos disjuntos de s a t. Elijamos
el color 1 y coloreemos con ese color uno de los arcos que sale de s, el arco (s, i1 ). A continuación,
coloreamos con el color 1 uno de los arcos que salen de i1 , el arco (i1 , i2 ). Vamos repitiendo el coloreado,
y cada vez que llegamos a un nuevo nodo ih coloreamos con el color 1 uno de los arcos que salen de ih , el
arco (ih , ih+1 ). Este proceso de colorear con el color 1 termina cuando coloramos con 1 un arco que llega
a t. De esa forma, habremos definido un primer camino dirigido de s a t, donde todos los arcos tienen
color 1.
En este punto hay que resaltar varias observaciones. La primera es que este proceso de coloreado
debe terminar dando un camino, pues por construcción no repetimos arcos ya que cada vez que entramos
a un nodo salimos por un arco que no está colorado. La segunda es que como el número de arcos que
entran y salen a un nodo cualquiera de G1 es el mismo, siempre que llegamos a un nodo podemos salir
de él. La tercera es que este primer camino sólo utiliza uno de los k arcos que salen de s y uno de los k
arcos que llegan a t.
Elijamos un arco (s, j1 ) todavía no colorado, y lo coloreamos con el color 2. Repitiendo el mismo
proceso de antes, podremos construir un segundo camino dirigido de s a t con todos sus arcos de color
2, pues cada vez que llegamos a un nodo podemos salir de él por un arco que no está coloreado ni con 1
ni con 2. Y así vamos iterando el proceso hasta conseguir k caminos dirigidos disjuntos en arcos de s a t.
Ese número de caminos disjuntos en arcos es k, pues el número de arcos que salen de s (o llegan a t) es k
y cada vez que construimos un camino con un color sólo usamos uno de arcos que salen de s (llegan a t).
Por lo tanto, como G1 contiene k caminos disjuntos en arcos de s a t, nuestro grafo original G también
los va a contener. Ya que G podría tener más caminos disjuntos en arcos de s a t, tenemos la desigualdad
que nos faltaba, que kc ≥ k. En definitiva, k = ke = kc como queríamos demostrar.

El teorema nos dice que, reformulando el problema en términos de una red de flujo, tal y como
se describe en la demostración del teorema, y encontrando el máximo flujo sobre esa red, podremos
encontrar el número de caminos dirigidos disjuntos en arcos desde s hasta t en el grafo dirigido, y el
número mínimo de arcos que hay que eliminar para que no haya caminos dirigidos de s a t. Si k es el
máximo flujo y (X, X) es un mínimo corte, los k arcos del corte son los arcos que hay que eliminar para
que no haya caminos dirigidos de s a t, y los arcos por los que circula flujo nos permiten encontrar los k
caminos disjuntos en arcos, mediante el proceso del coloreado.
Veamos un ejemplo.

Ejemplo 5.6. Para el grafo dirigido de la figura 5.13a, calcular cuántos arcos hay que eliminar para que
no haya caminos dirigidos desde s hasta t y dar un conjunto con el mayor número posible de caminos
dirigidos de s a t que sean disjuntos en arcos.

Solución. A partir del grafo dirigido, lo primero que hay que hacer es construir una red de flujo, donde
la capacidad de cualquier arco sea 1 (en naranja en la figura 5.13b). Una vez construida, calculamos el
máximo flujo, tal y como se muestra en la figura 5.13b. Ese flujo maximal f se ha obtenido usando los
caminos de aumento s → 1 → 2 → 3 → 4 → t, s → 5 → 6 → 7 → 8 → t y s → 6 → 3 → t. El corte (X, X)
que se obtiene está definido por los conjuntos X = {s, 1, 2, 5, 6} y X = {3, 4, 7, 8,t}. Los arcos del corte
son los arcos (2, 3), (6, 3) y (6, 7) (en rojo en la figura 5.13b), por lo que la capacidad del corte es 3.
Por tanto, si eliminamos del grafo de partida los tres arcos del corte (X, X), obtenemos un grafo
dirigido en el que no hay caminos dirigidos de s a t (ver la figura 5.13c). Un conjunto de tres caminos
Grafos y Combinatoria. Javier Tejel 185

1
3 2 11 3
2 11 11
1 X 1 1 4
4 11 1
1 1 1
1 1
1
s s t
t 11
1 1 1
1 1 1 1
1 8
5 8 5 11 11 11 X
6 6 7
7 1
(a) (b)

2 3 2 3
1 4 1 4

s t s t

5 8 5 8
6 7 6 7
(c) (d)

Figura 5.13: Grafo dirigido del ejemplo 5.6. Hay que eliminar tres arcos para que no haya caminos
dirigidos de s a t.

dirigidos de s a t disjuntos en arcos se muestra en la figura 5.13d, que se ha obtenido a partir de los arcos
con flujo 1 del flujo maximal f . La forma de obtenerlos es partir de s usando un arco no coloreado y cada
vez que llegamos a un nodo salimos de él por cualquier arco no coloreado todavía. Observar que los tres
caminos obtenidos en la figura no tienen por qué coincidir con los tres caminos de aumento usados para
encontrar un máximo flujo, aunque en este ejemplo nos habrían servido esos tres caminos de aumento
como caminos dirigidos de s a t disjuntos en arcos. De hecho, los caminos de aumento podrían contener
arcos hacia atrás, con lo que no serían caminos dirigidos de s a t.
Notar por último que usando otros caminos de aumento podríamos haber obtenido un flujo maximal
distinto y un mínimo corte distinto, pero el valor del flujo seguiría siendo 3, el número de arcos a eliminar
para que no haya caminos dirigidos de s a t seguiría siendo también 3, y el número máximo de caminos
dirigidos de s a t disjuntos en arcos sería otra vez 3, caminos que podrían ser distintos de los obtenidos
en la figura 5.13d.

Si el grafo de partida es no dirigido en lugar de dirigido, se tiene el Teorema 5.10, que es totalmente
análogo al Teorema 5.9. Este teorema nos dice que el número máximo de caminos disjuntos en aristas
que conectan dos vértices arbitrarios s y t es igual al número mínimo de aristas que hay que eliminar del
grafo para que no haya caminos conectando s y t. La demostración de este teorema, que omitimos, es
totalmente análoga a la demostración del Teorema 5.9, tomado la versión dirigida del grafo de partida a
la hora de calcular un flujo maximal.

Teorema 5.10 (Teorema de Menger para aristas). Sea G = (V, E) un grafo no dirigido y sean s y
t dos vértices cualesquiera. El máximo número de caminos disjuntos en aristas que pueden construirse
conectando s y t es igual al número mínimo de aristas tales que al eliminarlas no hay caminos conectando
s y t.
186 Capítulo 5. Flujo en redes y aplicaciones

En la práctica, para calcular las aristas que desconectan s de t y los caminos disjuntos en aristas entre
s y t, lo que se hace es tomar la versión dirigida G′ de G (cada arista (i, j) se sustituye por los arcos (i, j)
y ( j, i)) y calcular un máximo flujo en G′ asumiendo que todos los arcos tienen capacidad uno. Como
siempre, podemos eliminar los arcos que llegan a s y los que salen de t. Los arcos del corte obtenido
en G′ definen las aristas que hay que eliminar en G para desconectar s y t, y los arcos con flujo 1 en G′
definen las aristas de G que hay que usar para encontrar mediante el proceso del coloreado los caminos
disjuntos en aristas que conectan s y t. Hay que resaltar que si al calcular un máximo flujo, obtenemos
que f (i, j) = f ( j, i) = 1, podemos construir otro flujo maximal haciendo f (i, j) = f ( j, i) = 0.

2 3
2 3
1 4 1 4

s t s t

8
5 8 5
6 7 6 7

(a) (b)

2 3
2 3
1 1
1 4 1 4
1 1
1 1
X 1
1
s 1 t s t
1 1
1 1 1

5
8 X
1 5 8
6 7 6 7

(c) (d)

2 3
1 4

s t

5 8
6 7

(e)

Figura 5.14: Grafo no dirigido del ejemplo 5.7. Hay que eliminar cuatro aristas para desconectar s y t.

Veamos un ejemplo.
Ejemplo 5.7. Para el grafo no dirigido de la figura 5.14a, calcular cuántas aristas hay que eliminar para
que no haya caminos entre s y t, y dar un conjunto con el mayor número posible de caminos de s a t que
sean disjuntos en aristas.
Grafos y Combinatoria. Javier Tejel 187

Solución. A partir del grafo no dirigido G de la figura 5.14a, construimos su versión dirigida G′ , trans-
formando cada arista (i, j) en dos arcos, los arcos (i, j) y ( j, i) (ver la figura 5.14b). Notar que no se
han añadido los arcos que llegan a s ni los que salen de t. Asumiendo que todos los arcos de G′ tienen
capacidad 1, hay que calcular un flujo maximal sobre G′ . Una posibilidad es utilizar los caminos de au-
mento s → 2 → 3 → t, s → 1 → 6 → 7 → t, s → 6 → 3 → 4 → t y s → 5 → 3 → 8 → t, que dan el flujo
maximal mostrado en la figura 5.14c, cuyo valor es 4. El corte (X, X) que se obtiene está definido por
los conjuntos X = {s} y X = {1, 2, 3, 4, 5, 6, 7, 8,t}. Los arcos del corte son los arcos (s, 1), (s, 2), (s, 5) y
(s, 6) (en rojo en la figura), por lo que la capacidad del corte es 4.
Por tanto, si eliminamos del grafo de partida las cuatro aristas (s, 1), (s, 2), (s, 5) y (s, 6), que son las
correspondientes a los arcos (s, 1), (s, 2), (s, 5) y (s, 6) de G′ , obtenemos un grafo no dirigido en el que
no hay caminos de s a t (ver la figura 5.14d). Un conjunto de cuatro caminos de s a t disjuntos en aristas
se muestra en la figura 5.14e, que se ha obtenido considerando las aristas (i, j) de G tales que por el arco
(i, j) de G′ o por el arco ( j, i) circula flujo. Observar que los cuatro caminos obtenidos no tienen por
qué coincidir con los cuatro caminos de aumento usados para encontrar un máximo flujo. Como en el
ejemplo anterior, la forma de construir los caminos es partir de una arista que salga de s y cada vez que
se llega a un vértice salir de él por una arista no coloreada todavía.
Como ya hemos comentado en el ejemplo anterior, hay que resaltar que los caminos entre s y t
disjuntos en aristas no tienen por qué ser únicos, ni tampoco tiene por qué ser único el conjunto de
aristas que desconectan s de t al eliminarlas. En este ejemplo, podíamos haber eliminado las cuatro
aristas incidentes a t para desconectar s y t.

5.3.2. Teoremas de Menger para nodos


En la sección anterior hemos visto los Teoremas de Menger para arcos (aristas), que caracterizan
los conjuntos de arcos (aristas) que hay que eliminar para que no haya caminos entre s y t disjuntos en
arcos (aristas). En esta sección, vamos a ver los resultados equivalentes para nodos, también probados
por Menger, caracterizando los conjuntos de nodos (vértices) que hay que eliminar para que no haya
caminos de s a t disjuntos en nodos (vértices).
Supongamos que nos dan el grafo dirigido de la figura 5.15a y nos preguntamos cuántos nodos hay
que eliminar del grafo para desconectar s de t, es decir, para que no haya caminos dirigidos de s a t.
Es fácil ver que si eliminamos los nodos 2 y 5, desconectamos s de t. Pero, ¿podríamos desconectar s
y t eliminando sólo un nodo? La respuesta sería no. Una forma de verlo es a través de la figura 5.15b.
En dicha figura se muestran dos caminos dirigidos de s a t, que son disjuntos en nodos. Por tanto, para
desconectar s de t hay que eliminar al menos un nodo de cada uno de los caminos.

2 2
1 3 1 3

s t s t

4 6 4 6
5 5
(a) (b)

Figura 5.15: Hay que eliminar dos nodos para desconectar s de t.

Esto es precisamente lo que establece el Teorema de Menger para nodos en grafos dirigidos, que el
número máximo de caminos dirigidos de s a t disjuntos en nodos es el mínimo número de nodos que hay
que eliminar para que no haya caminos dirigidos de s a t.
188 Capítulo 5. Flujo en redes y aplicaciones

Teorema 5.11. Sea G = (V, A) un grafo dirigido y sean s y t dos nodos cualesquiera tales el arco (s,t)
no está en A. El máximo número de caminos dirigidos que pueden construirse desde s hasta t, disjuntos
en nodos salvo por sus extremos s y t, es igual al número mínimo de nodos tales que al eliminarlos no
hay caminos dirigidos de s a t.

Demostración. El esquema de demostración es muy similar al realizado en el Teorema 5.9.


Sea kc el número máximo de caminos dirigidos desde s hasta t tales que no comparten ningún nodo
(salvo los extremos s y t). Por tanto, no puede haber kc + 1 caminos de ese tipo. A lo largo de la demostra-
ción, cuando hablemos de caminos dirigidos de s a t disjuntos en nodos, entenderemos que son disjuntos
en nodos salvo por los extremos s y t. Sea F una familia de kc caminos dirigidos de s a t disjuntos en
nodos.
Sea ke el número mínimo de nodos que hay que eliminar para que no haya caminos dirigidos de s
a t. Por tanto, para cualquier conjunto de nodos V ′ tal que |V ′ | < ke , sí hay camino dirigido de s a t en
G′ = G −V ′ (el grafo dirigido obtenido al eliminar los nodos de V ′ y todos los arcos incidentes a ellos).
Si eliminamos un nodo de cada uno de los kc caminos disjuntos de la familia F , ya no habrá caminos
dirigidos de s a t usando arcos de esa familia. Pero quizá haya que eliminar algún otro nodo para que no
haya caminos dirigidos de s a t en G. Por tanto, tenemos la primera desigualdad, que ke ≥ kc .
Definamos ahora una red de flujo H = (V, A, s,t, c), asignando capacidad 1 a todos los nodos de V ,
excepto s y t, y capacidad ∞ a todos los arcos de A, excepto a los arcos que salen de t o llegan a s. A
esos arcos les asignamos capacidad 0 o directamente podemos asumir que no existen en H, pues por el
Teorema 5.4 o el Corolario 5.1, a la hora de calcular un máximo flujo de s a t por esos arcos no va a
circular flujo. Como los nodos tienen capacidad 1 (salvo s y t), lo primero que hay que hacer es definir
una nueva red de flujo H ′ , sustituyendo cada nodo i por dos nodos i− e i+ , tal y como se describió en la
sección 5.2.3: los arcos que llegan a un nodo i de H son los arcos que llegan a i− en H ′ , los arcos que
salen de i en H son los arcos que salen de i+ en H ′ y se añade el arco (i− , i+ ) con capacidad 1.
Calculemos un flujo maximal f en H ′ . Sea dO (s) el número de vecinos “out” de s en H ′ (y H y
G). Cualquier camino de aumento en H ′ ha de pasar por algún vecino “out” i− de s, con lo que ha de
pasar por el arco (i− , i+ ), que tiene capacidad 1. Esto implica que el valor k de un flujo maximal está
acotado superiormente por dO (s), es decir, k ≤ dO (s). Por tanto, el flujo máximo es finito, con lo que
por el Teorema de integralidad todos los flujos que circulan por la red son 0 ó 1, pues las capacidades
que no son infinito valen 1. Sea (X, X) un corte mínimo, con lo que c(X, X) = k. El conjunto X, además
del nodo s, puede contener para algunos nodos i1 , . . . , ik1 de G sus correspondientes nodos i− +
h y ih , y
para otros nodos j1 , . . . , jk2 de G sólo el correspondiente nodo negativo jh− . Igualmente, el conjunto X
contendrá, además de t, los nodos jh+ y los dos nodos lh− y lh+ correspondientes a los restantes nodos
l1 , . . . , lk3 de G. Como la capacidad del corte es k y las capacidades que no son infinito corresponden a

arcos del tipo ( j− , j+ ), necesariamente k2 = k y no puede haber conexiones del tipo (i+ +
h , lh′ ), con ih en
− ′
X y lh′ en X. Al no existir ese tipo de conexiones en H , tampoco puede haber arcos en G entre los nodos
en {s, i1 , . . . , ik1 } y los nodos en {l1 , . . . , lk3 ,t}. Al eliminar los k arcos ( j1− , j1+ ), . . . , ( jk− , jk+ ) en H ′ (lo que
equivale a eliminar los nodos j1 , . . . , jk en G), ya no hay caminos dirigidos de s a t en H ′ , lo que implica
que al eliminar los nodos j1 , . . . , jk en G, ya no puede haber caminos dirigidos de s a t en G. Pero podría
suceder que, eliminando menos de k nodos, ya no haya caminos dirigidos de s a t en G. En consecuencia,
tenemos una segunda desigualdad, que k ≥ ke ≥ kc .
Veamos por último que kc ≥ k, con lo que tendremos que k = ke = kc . Para ello, definamos el grafo
dirigido G1 , formado por los arcos (i, j) de G, tales que por sus correspondientes arcos (i+ , j− ) en H ′
circula flujo. Al ser 1 la capacidad de un arco del tipo (i+ , i− ) en H ′ , el flujo que llega a i− es 0 o 1. Si ese
flujo es cero, al nodo i de G1 no va a llegar (ni salir) ningún arco, y si ese flujo es 1, al nodo i de G1 llegará
sólo un arco y saldrá también sólo un arco. Además, como el valor del flujo es k, hay k arcos que salen
de s con flujo, lo que implica que hay k arcos que salen de s en G1 , y hay k arcos con flujo que llegan a
t, lo que implica que hay k arcos que llegan a t en G1 . Notar que para cualquier nodo de G1 (salvo s y t)
sólo entra un arco y sólo sale un arco. Como en el Teorema 5.9, podemos encontrar k caminos dirigidos
de s a t coloreando arcos en G1 . Coloreamos con 1 un arco (s, i) que salga de s. Al único arco que sale
de i, el arco (i, j) lo coloreamos también con 1. Y vamos colorando arcos con el color 1 hasta llegar a t,
Grafos y Combinatoria. Javier Tejel 189

con lo que obtenemos un primer camino dirigido de s a t, donde todos los arcos tienen color 1. Notar que
un nodo i que aparezca en ese camino, ya no puede volver a aparecer en ningún otro camino dirigido de
s a t, pues sólo hay una arco que entra en i y un arco que sale de i. Como salen k arcos de s, reiterando
el proceso podremos encontrar k caminos dirigidos de s a t que, por construcción, son disjuntos. Por lo
tanto, como G1 contiene k caminos disjuntos en nodos de s a t, nuestro grafo original G también los va
a contener. Ya que G podría tener más caminos disjuntos en nodos de s a t, tenemos la desigualdad que
nos faltaba, que kc ≥ k.

La demostración del teorema nos dice cómo encontrar un conjunto minimal de k nodos de forma que
al eliminarlos s y t quedan desconectados, y también nos dice cómo encontrar k caminos dirigidos de s
a t disjuntos en nodos. Se define una red de flujo con capacidades 1 en los nodos e infinito en los arcos
(salvo para los arcos que salen de t y los que llegan a s) y se calcula un flujo maximal. Si k es el valor
del flujo y (X, X) un corte mínimo, los k arcos del corte, que serán del tipo (i− , i+ ), definen los k nodos
que habría que eliminar como mínimo para desconectar s de t, y los arcos del tipo (i+ , j− ) por los que
circula flujo permiten encontrar los k caminos dirigidos de s a t disjuntos en nodos, mediante el proceso
del coloreado, tomando sus correspondientes arcos (i, j) en G.

2−1 1 2+ 1 3− 1 1 3+
X
2 3 X 1− 1+ 1 1 4− 4+
11 11
1 4 1 1

s t
s t
1 1
11 +
5− 1 1 5+ 1 11 1 11 8− 8

1
5 8 6 6 +
7 − 7 +

6 7
(a) (b)

2 3 2 3
1 4 1 4

s t s t

5 8 5 8
6 7 6 7
(c) (d)

Figura 5.16: Grafo dirigido del ejemplo 5.8. Hay que eliminar dos nodos para que no haya caminos
dirigidos de s a t.

Veamos un ejemplo.
Ejemplo 5.8. Para el grafo dirigido de la figura 5.16a, calcular cuántos nodos hay que eliminar para que
no haya caminos dirigidos desde s hasta t y dar un conjunto con el mayor número posible de caminos
dirigidos de s a t que sean disjuntos en nodos.
Solución. A partir del grafo dirigido G de la figura, lo primero que hay que hacer es construir una red
de flujo, donde la capacidad de cualquier nodo (salvo s y t) sea 1 y la capacidad de cualquier arco sea
infinito. Como la capacidad sobre los nodos es 1, cada nodo i se desdobla en dos nodos i− e i+ , los arcos
190 Capítulo 5. Flujo en redes y aplicaciones

que llegan a i serán los arcos que lleguen a i− , los arcos que salgan de i serán los arcos que salgan de
i+ , y se añade el arco (i− , i+ ) con capacidad 1. Véase la figura 5.16b, donde aparecen en naranja las
capacidades que no son ∞.
Una vez construida, calculamos el máximo flujo, tal y como se muestra en la figura 5.16b. Ese
flujo maximal f se puede obtener, por ejemplo, usando los dos caminos de aumento que son evi-
dentes, los caminos s → 1− → 1+ → 2− → 2+ → 3− → 3+ → 4− → 4+ → t y s → 5− → 5+ →
6− → 6+ → 7− → 7+ → 8− → 8+ → t. Tras añadir esos dos caminos de aumento, haciendo BFS
“out + in” se obtiene el corte (X, X), definido por los conjuntos X = {s, 1− , 1+ , 2− , 5− , 5+ , 6− } y X =
{2+ , 3− , 3+ , 4− , 4+ , 6+ , 7− , 7+ , 8− , 8+ ,t}. Los arcos del corte son los arcos (2− , 2− ) y (6− , 6+ ) (en rojo
en la figura 5.16b), por lo que la capacidad del corte es 2 y el flujo máximo también 2.
Por tanto, si eliminamos del grafo de partida los nodos 2 y 6, que son los correspondientes a los arcos
(2− , 2− ) y (6− , 6+ ) del corte, obtenemos un grafo dirigido en el que no hay caminos dirigidos de s a t
(ver la figura 5.16c). Un conjunto de dos caminos dirigidos de s a t en G, disjuntos en nodos, se muestra
en la figura 5.16d. Los arcos (i, j) de G que se han considerado para construir estos caminos son aquellos
tales que por sus arcos homólogos (i+ , j− ) en H ′ circula flujo 1. Notar que por construcción, al nodo i−
sólo puede entrar flujo por un arco y del nodo i+ sólo puede salir flujo por un arco, lo que implica que
a la hora de construir los caminos en dirigidos de s a t en G sólo tenemos un arco que entre y un arco
que salga del nodo i (en el caso de que entre flujo a i− ). La forma de obtener los caminos es partir de s
usando un arco no coloreado y cada vez que llegamos a un nodo salimos de él por el arco que sale de
él. En el ejemplo, los caminos obtenidos se corresponden con los caminos de aumento utilizados para
calcular el máximo flujo, pero no tendría por qué, ya que los caminos de aumento podrían contener arcos
hacia atrás.
Resaltar por último que usando otros caminos de aumento podríamos haber obtenido un flujo maxi-
mal distinto y un mínimo corte distinto, pero el valor del flujo seguiría siendo 2, el número de nodos a
eliminar para que no haya caminos dirigidos de s a t seguiría siendo también 2, y el número máximo de
caminos dirigidos de s a t disjuntos en nodos sería otra vez 2, caminos que podrían ser distintos de los
obtenidos en la figura 5.16d.

Si el grafo de partida es no dirigido en lugar de dirigido, se tiene el Teorema 5.12, que es totalmente
análogo al Teorema 5.11. Este teorema nos dice que el número máximo de caminos disjuntos en vértices
que conectan dos vértices arbitrarios s y t es igual al número mínimo de vértices que hay que eliminar
del grafo para que no haya caminos conectando s y t. La demostración de este teorema, que omitimos, es
totalmente análoga a la demostración del Teorema 5.11, tomado la versión dirigida del grafo de partida
a la hora de calcular un flujo maximal.

Teorema 5.12 (Teorema de Menger para vértices). Sea G = (V, E) un grafo no dirigido y sean s y t dos
vértices cualesquiera tales que la arista (s,t) no pertenece a E. El máximo número de caminos disjuntos
en vértices (salvo s y t) que pueden construirse conectando s y t es igual al número mínimo de vértices
tales que al eliminarlos no hay caminos conectando s y t.

En la práctica, para calcular los vértices que desconectan s de t y los caminos disjuntos en vértices
entre s y t, lo que se hace es tomar la versión dirigida G′ de G (cada arista (i, j) se sustituye por los arcos
(i, j) y ( j, i)) y calcular un máximo flujo en la red de flujo H ′ que se construye a partir de G′ , asumiendo
que todos los nodos de G′ (salvo s y t) tienen capacidad 1 y todos los arcos (salvo los que salen de t
y los que llegan a s, que se pueden eliminar) tienen capacidad infinita. Los arcos del corte obtenido en
H ′ definen los vértices que hay que eliminar en G para desconectar s y t, y los arcos con flujo 1 en H ′
definen las aristas de G que hay que usar para encontrar los caminos disjuntos en vértices que conectan
s y t.
Veamos un ejemplo.

Ejemplo 5.9. Para el grafo no dirigido de la figura 5.17a, calcular cuántos vértices hay que eliminar para
que no haya caminos entre s y t, y dar un conjunto con el mayor número posible de caminos de s a t que
sean disjuntos en vértices.
Grafos y Combinatoria. Javier Tejel 191

2−1 1 2+ 1 3− 3+
11
2 3 1 − 1 + 1 1 4− 4+
1 4 11 11
1 1

s t
s t
1 1
11
5− 1 1 11 11 8+
5+ 1 1 1 8−
8 6−
5 6+ 7− 7+
6 7

(a) (b)

2−1 1 2+ 1 3− 3+
11
1 − 1 + 1 1 4− 4+
11 11
1 1

s t

1 1
11
5− 1 1 11 11 8+
5+ 1 1 1 8−
6− 6+ 7− 7+

(c)

1
3−
X
X 2−1 1 2+ 11 3+
1− 1+ 1 4− 4+
11 11
1 1
1
s t

1 1
1 1 11 +
5− 1 1 5+ 1 11 11 8
8−
6− 6 +
7 − 7+
1

(d)

Figura 5.17: Grafo no dirigido del ejemplo 5.9 y máximo flujo obtenido en la red de flujo H ′ .

Solución. A partir del grafo no dirigido G de la figura 5.17a, construimos su versión dirigida G′ , trans-
formando cada arista (i, j) en dos arcos, los arcos (i, j) y ( j, i). Además, como hay que considerar que
cada nodo de G′ tiene capacidad 1, cada nodo i de G′ se desdobla en dos nodos i− y i+ en la nueva red de
flujo H ′ , tal y como se muestra en la figura 5.17b. Los arcos que llegan a i llegarán ahora a i− , los arcos
que salen de i saldrán ahora de i+ , y se añade el arco (i− , i+ ) con capacidad 1. La capacidad del resto de
arcos será infinito. Notar que, como siempre, no hace falta añadir los arcos que llegan a s ni los que salen
de t.
Para la red de flujo H ′ así construida, hay que calcular un flujo maximal. Para ello, podemos empezar
usando los dos caminos de aumento evidentes que ya hemos usado en el ejemplo anterior, los caminos
s → 1− → 1+ → 2− → 2+ → 3− → 3+ → 4− → 4+ → t y s → 5− → 5+ → 6− → 6+ → 7− → 7+ →
8− → 8+ → t, que dan un valor del flujo de 2. Haciendo BFS “out + in” con ese flujo, obtenemos el
árbol BFS “out + in” que se muestra en la figura 5.17c. El árbol permite obtener un nuevo camino de
aumento, el camino s → 2− ← 1+ → 3− ← 2+ → 7− ← 6+ → 8− ← 7+ → t, que permite incrementar
192 Capítulo 5. Flujo en redes y aplicaciones

el flujo en una unidad, hasta 3. Aplicando de nuevo BFS “out + in”, ya no se encuentran más cami-
nos de aumento, con lo que el flujo máximo es 3. La figura 5.17d muestra el flujo maximal obtenido,
con valor 3, y el corte (X, X) obtenido, definido por los conjuntos X = {s, 1− , 1+ , 2− , 3− , 5− , 5+ , 6− } y
X = {2+ , 3+ , 4− , 4+ , 6+ , 7− , 7+ , 8− , 8+ ,t}. Los arcos del corte (en rojo en la figura 5.17d) son los arcos
(2− , 2+ ), (3− , 3+ ) y (6− , 6+ ), por lo que la capacidad del corte es 3.

2 3 2 3
1 4 1 4

s t s t

5 8 5 8
6 7 6 7

(a) (b)

Figura 5.18: Hay que eliminar tres vértices para desconectar s y t en el grafo no dirigido del ejemplo 5.9.

Por tanto, si eliminamos del grafo de partida los tres vértices 2, 3 y 6, que son los correspondientes a
los arcos (2− , 2+ ), (3− , 3+ ) y (6− , 6+ ) de H ′ , obtenemos un grafo no dirigido en el que no hay caminos
de s a t (ver la figura 5.18a). Un conjunto de tres caminos de s a t disjuntos en vértices se muestra en
la figura 5.18b, que se han obtenido considerando las aristas (i, j) de G tales que por el arco (i+ , j− ) de
H ′ o por el arco ( j+ , i− ) circula flujo. Como en el ejemplo anterior, la forma de construir los caminos es
partir de una arista que salga de s y cada vez que se llega a un vértice salir de él por la correspondiente
arista, que no estará coloreada.
Como ya hemos comentado en el ejemplo anterior, hay que resaltar que los caminos entre s y t
disjuntos en vértices no tienen por qué ser únicos, ni tampoco tiene por qué ser único el conjunto de
vértices que desconectan s de t al eliminarlas. En este ejemplo, podíamos haber eliminado los vértices 3,
6 y 7 para desconectar s y t.

5.3.3. Teorema de Hall


En esta sección vamos a ver otra aplicación del Teorema de máximo flujo-mínimo corte. A través de
dicho teorema se puede calcular el máximo emparejamiento en un grafo (dirigido) bipartito. Este es un
caso particular de un resultado más general, el Teorema de Hall, que caracteriza cuándo existe lo que se
conoce como un sistema de representantes distintos.
Comenzamos ilustrando el problema con un ejemplo. Supongamos que en un curso se han matricu-
lado m estudiantes, E = {e1 , e2 , . . . , em }, y que se han organizado n actividades extraescolares. Suponga-
mos también que a cada una de las actividades extraescolares se han apuntado algunos de los alumnos,
es decir, tenemos una familia F = {S1 , S2 , . . . , Sn } de n subconjuntos de E , donde cada Si contiene a los
estudiantes apuntados a la actividad i. Para cada actividad extraescolar se desea elegir a un representante
(o responsable o delegado, ...) de entre los estudiantes apuntados a esa actividad, con la condición de
que los representantes sean distintos, es decir, que si un estudiante es el representante en una actividad,
entonces ese estudiante ya no es el representante en ninguna otra actividad. El problema que se plantea es
decidir si existe o no un conjunto de n de estudiantes de entre los m, de forma que cada uno de ellos sea el
representante de una de las n actividades extraescolares. Además, en caso de que no exista ese conjunto
de n estudiantes, se desea obtener una elección de representantes distintos para el máximo posible de
actividades, dando un argumento convincente de por qué no se puede mejorar ese resultado, es decir, por
qué no se pueden encontrar representantes distintos para un mayor número de actividades de las que se
han obtenido.
Grafos y Combinatoria. Javier Tejel 193

Formalmente el problema se plantea de la siguiente manera. Sea E = {e1 , e2 , . . . , em } un conjunto


finito de m elementos distintos y sea F = {S1 , S2 , . . . , Sn } una familia de n subconjuntos de E . Notar
que en la familia F puede haber subconjuntos repetidos (a varias actividades se han apuntado exacta-
mente los mismos estudiantes), puede haber subconjuntos vacíos (ningún estudiante se ha apuntado a
esas actividades), o algunos subconjuntos pueden ser E (todos los estudiantes se han apuntado a esas
actividades). Un sistema de representantes distintos para F (SRD para abreviar), es un subconjunto

{ei1 , ei2 , . . . , ein }

de n elementos de E , tal que ei j ∈ S j , para j = 1, . . . , n.


Dados E y F , el primer problema que se plantea es decidir si existe un SRD. Está claro que si algún
Si es vacío o si n > m, entonces no puede existir un SRD. En general, si hay k subconjuntos de F , los
subconjuntos S j1 , S j2 , . . . , S jk , tales que el conjunto Ek definido como
k
Ek =
[
S jl
l=1

consta de menos de k elementos, entonces no podemos encontrar k representantes distintos para esos k
subconjuntos S jl , l = 1, . . . , k, pues no hay suficientes elementos en Ek que sean distintos para representar
a todos los subconjuntos S jl .
El Teorema de Hall establece que esta última condición, necesaria para que pueda existir un SRD, es
también suficiente, es decir, si no existe un SRD para F es porque existe una subfamilia de k subcon-
juntos de F cuya unión contiene menos de k elementos. La demostración de este teorema da también un
método para encontrar un SRD cuando existe, o para encontrar un conjunto de representantes distintos
lo más grande posible cuando no existe un SRD.

Teorema 5.13 (Teorema de Hall). Sea E = {e1 , e2 , . . . , em } una familia de m elementos distintos, y sea
F = {S1 , S2 , . . . , Sn } una familia de n subconjuntos de E . La familia F admite un SRD, si y sólo si, para
k = 1, . . . , n cada subfamilia de F formada por k subconjuntos contiene al menos k elementos de E .

Demostración. La condición es claramente necesaria. Como ya hemos comentado anteriormente, si hay


una subfamilia de F formada por k subconjuntos que contiene menos de k elementos de E , entonces no
puede existir un SRD. Veamos que la condición es también suficiente, es decir, que si no existe un SRD,
es porque hay una subfamilia de F formada por k subconjuntos que contiene menos de k elementos de
E.
Construyamos el siguiente grafo dirigido G = (V, A). El conjunto de n + m + 2 nodos de G estará
formado por V = {s, S1 , S2 , . . . , Sn , e1 , e2 , . . . , em ,t}, es decir, cada subconjunto Si es un nodo del grafo,
cada elemento e j es un nodo del grafo, y se añaden dos nodos adicionales a los que llamamos s y t. El
conjunto de arcos de G se define de la siguiente forma. Cada nodo Si está conectado a s mediante el arco
(s, Si ), cada nodo e j se conecta a t mediante el arco (e j ,t), y existe un arco (Si , e j ) entre el nodo Si y el
nodo e j si el elemento e j de E está contenido en el subconjunto Si de F . Véase la figura 5.19a.
A partir de este grafo, construimos una red de flujo H con s y t como origen y destino (ver la figura
5.19a), asignando capacidad 1 a todos los arcos que salen de s y a todos los arcos que llegan a t, y
asignando capacidad ∞ al resto de arcos. Al calcular un flujo maximal f sobre H, como las capacidades
que no son infinito son números enteros (todos 1) y no existe en H un camino dirigido de s a t con
capacidad infinita, por el Teorema de integralidad tendremos que el valor del flujo será un entero v( f ), y
todos los flujos en los arcos serán cero o uno, pues a cada nodo Si a lo más llega una unidad de flujo y de
cada nodo e j a lo más sale una unidad de flujo.
Veamos primero que sucede si v( f ) = n. En ese caso, necesariamente por cada uno de los n arcos
que salen de s circula una unidad de flujo, y un corte mínimo (X, X) de capacidad n nos lo proporciona
el conjunto X = {s}. Además, la unidad de flujo que llega a un nodo Si desde s llegará a un nodo e j por
el arco (Si , e j ). Definamos este e j como el representante de Si . Estos representantes así elegidos para los
diferentes Si tienen que ser todos distintos, pues a cada e j no pueden llegar dos unidades de flujo, ya que
194 Capítulo 5. Flujo en redes y aplicaciones

S1 e1 S1 XF XE e 1
∞ ∞
S2 e2 1 X S2 e2 1
1 1 1 1
1 1
s 1 1 s 1 1
t t
Si ej ej
1 1
Si
1 1
X
Sn em X F Sn XE em

(a) (b)

Figura 5.19: Red de flujo en la demostración del Teorema de Hall.

la capacidad de (e j ,t) es uno. Por tanto, este conjunto de representantes define un SRD. En consecuencia,
para que no exista un SRD se tiene que verificar que v( f ) = n − r, para algún r > 0 entero.
Supongamos ahora que no existe un SRD. En ese caso, se tiene que v( f ) = n − r con r > 0 entero,
por lo que habrá n − r arcos (s, Si ) por los que circula una unidad de flujo. Si por el arco (s, Si ) circula
flujo, ese flujo continuará por un arco (Si , e j ). En ese caso, elegimos e j como representante de Si . De esta
forma, obtenemos representantes distintos para n − r de nuestros subconjuntos Si . Como el valor del flujo
es v( f ) = n − r, existirá un corte (X, X) de capacidad n − r (ver la figura 5.19b). En X, además del nodo s,
habrá una serie de nodos XF que son subconjuntos de F , y otra serie de nodos XE que son elementos de
E . Igualmente, además de t, en X habrá nodos de F , el subconjunto X F , y nodos de E , el subconjunto
XE .
Veamos qué propiedades tiene este corte (X, X). Como la capacidad del corte es c(X, X) = n − r, no
puede haber arcos desde nodos de XF a nodos de X E , ya que ese tipo de arcos tienen capacidad infinita
en H (en particular, esto implica que ninguno de los elementos de X E está contenido en ninguno de los
subconjuntos de XF ). Por tanto, los arcos del corte mínimo tienen que ser los arcos que conectan s con
los nodos en X F y los arcos que conectan los nodos de XE con t. Todos esos arcos tienen capacidad 1,
por lo que
|X F | + |XE | = n − r
Por otra parte, n = |F | = |XF | + |X F |, con lo que

|XE | = |XF | − r

Supongamos que el número de subconjuntos de F en el conjunto XF es k, es decir, k = |XF |. Como


todos los elementos de cada subconjunto de XF tienen que estar en XE (recordar que ya hemos visto que
ninguno de los elementos de X E está contenido en ninguno de los subconjuntos de XF ), el número de
elementos en la unión de todos esos subconjuntos (que estará contenida en XE ) es lo más k − r. Por tanto,
acabamos de encontrar un familia XF de k subconjuntos de F que contiene menos de k elementos de E ,
como queríamos demostrar.

En la práctica, para encontrar un conjunto con el mayor número de representantes distintos, hay
que construir la red de flujo tal y como se describe en la demostración del teorema y calcular un flujo
maximal. El valor del flujo da el máximo número de representantes distintos que se pueden encontrar
y los arcos del tipo (Si , e j ) por los que circula flujo dan el conjunto de representantes distintos. Los
conjuntos XF y XE asociados al corte mínimo (X, X) dan la explicación de porqué no se puede encontrar
un SDR, en caso de que no exista.
Veamos un ejemplo.
Ejemplo 5.10. Supongamos que E = {A, B,C, D, E, F, G, H, I} es un conjunto de m = 9 elementos, y
F consiste en los siguientes n = 9 subconjuntos: S1 = {A, B, D}, S2 = {A,C, E}, S3 = {A,C, I}, S4 =
Grafos y Combinatoria. Javier Tejel 195

∞ ∞
S1 A S1 A
S2 B S2 B
1 1
1 S3 C 1 1 1 S3 C 1 1
1 1 1 1
S4 D S4 D
1 1 1 1
s 1 S5 E 1 s 1 S5 E 1
1 1 t 1 1 t
S6 F S6 F
1 1 1 1
1 1
1 S7 G 1 S7 G
1 1
1 1
S8 H S8 H

S9 S9
I I
(a) (b)

Figura 5.20: Red de flujo del ejemplo 5.10.

{A, G, I}, S5 = {B,C, H}, S6 = {C, E, G}, S7 = {C, F, H}, S8 = {C, G, I} y S9 = {E, G, I}. Si es posible,
queremos encontrar 9 representantes distintos, uno para cada subconjunto.
Solución. Lo primero que hay que hacer es construir la red de flujo según se describe en la demostración
de Teorema 5.13. Dicha red se muestra en la figura 5.20a. El nodo s se conecta a los subconjuntos Si , los
elementos de E se conectan a t, y un subconjunto Si se conecta a un elemento de E si ese elemento está
en Si . Los arcos que salen de s y los que llegan a t tienen capacidad 1, y el resto de arcos tienen capacidad
infinita.
Una vez construida la red, hay que calcular un flujo maximal. La red de flujo de la figura 5.20a es el
típico ejemplo en el que si pretendemos ir colocando los flujos en los arcos de la figura conforme se usan
caminos de aumento, se produce tal mezcla, que no se sabe qué flujo pertenece a cada arco y es muy fácil
confundirse. Por eso, es conveniente construir una tabla con los arcos, donde ir actualizando los flujos en
función de los caminos de aumento que se vayan usando, tal y como se muestra en la tabla 5.3.
Haciendo BFS “out + in”, se obtienen los siguientes caminos de aumento. Los siete primeros ca-
minos son bastante evidentes, mientras que el octavo nos dice que se puede incrementar el número de
representantes reasignando los representantes de S1 y S2 . Por simplicidad, se ha utilizado la numeración
1, 2, . . . para hacer referencia a los subconjuntos S1 , S2 , . . ..

1. s → 1 → A →→ t
2. s → 2 → C →→ t
3. s → 3 → I →→ t
4. s → 4 → G →→ t
5. s → 5 → B →→ t
6. s → 6 → E →→ t
7. s → 7 → F →→ t
8. s → 8 → C ← 2 → A ← 1 → D → t

La tabla 5.3 muestra cómo ha ido cambiando el flujo conforme se han ido añadiendo los diferentes
caminos de aumento (se ha utilizado la numeración 1, 2, . . . en lugar de S1 , S2 , . . .). Hasta el momento, el
valor del flujo obtenido es 8. La figura 5.20b muestra en azul los arcos de tipo (Si , e j ) por los que pasa
flujo, indicándonos que tenemos un conjunto de 8 representantes distintos para 8 de los subconjuntos. El
representante de S1 es D, el representante de S2 es A, y así sucesivamente.
196 Capítulo 5. Flujo en redes y aplicaciones

c f1 f2 f3 f4 f5 f6 f7 f8
(s, 1) 1 1 1 1 1 1 1 1 1
(s, 2) 1 1 1 1 1 1 1 1
(s, 3) 1 1 1 1 1 1 1
(s, 4) 1 1 1 1 1 1
(s, 5) 1 1 1 1 1
(s, 6) 1 1 1 1
(s, 7) 1 1 1
(s, 8) 1 1
(s, 9) 1
(1, A) ∞ 1 1 1 1 1 1 1 0
(1, B) ∞
(1, D) ∞ 1
(2, A) ∞ 1
(2,C) ∞ 1 1 1 1 1 1 0
(2, E) ∞
(3, A) ∞
(3,C) ∞
(3, I) ∞ 1 1 1 1 1 1
(4, A) ∞
(4, G) ∞ 1 1 1 1 1
(4, I) ∞
(5, B) ∞ 1 1 1 1
(5,C) ∞
(5, H) ∞
(6,C) ∞
(6, E) ∞ 1 1 1
(6, G) ∞
(7,C) ∞
(7, F) ∞ 1 1
(7, H) ∞
(8,C) ∞ 1
(8, G) ∞
(8, I) ∞
(9, E) ∞
(9, G) ∞
(9, I) ∞
(A,t) 1 1 1 1 1 1 1 1 1
(B,t) 1 1 1 1 1
(C,t) 1 1 1 1 1 1 1 1
(D,t) 1 1
(E,t) 1 1 1 1
(F,t) 1 1 1
(G,t) 1 1 1 1 1 1
(H,t)
(I,t) 1 1 1 1 1 1 1

Tabla 5.3: Tabla con los diferentes flujos, conforme se añaden caminos de aumento.

Al volver a aplicar BFS “out + in” sobre el flujo de valor 8 para buscar nuevos caminos de aumento,
obtenemos el árbol BFS “out + in” que se muestra en la figura 5.21a. En ese árbol no podemos llegar
Grafos y Combinatoria. Javier Tejel 197

∞ ∞
S1 A S1 A
S2 B S2 B
1 1
1 S3 C 1 1 1 S3 C 1 1
1
S4
1 1
S4
1 X
D D
1 1 1 1
s 1 S5 E 1 s 1 S5 E 1
1 1 t 1 1 t
S6 F S6 F
1 1 1 1
1 1
1 S7 G 1 S7 G
1 X 1
1 1
S8 H S8 H

S9 S9
I I

(a) (b)

Figura 5.21: Mínimo corte para la red de flujo del ejemplo 5.10.

desde s hasta t, con lo que no hay más caminos de aumento. El mínimo corte (X, X) se muestra en la
figura 5.21b, en la que X = {s, S2 , S3 , S4 , S6 , S8 , S9 , A,C, E, G, I} y X = {S1 , S5 , S7 , B, D, F, H,t}.
Como el valor del flujo es sólo 8, no existe un SRD en nuestro ejemplo, es decir, no podemos elegir
9 representantes distintos para nuestros 9 subconjuntos. Lo máximo que podemos conseguir es 8 repre-
sentantes distintos para 8 de los subconjuntos. Como ya hemos comentado antes, una posible asignación
de representantes la dan los arcos de tipo (Si , e j ) por los que pasa flujo (ver la figura 5.20b) en el flujo
maximal calculado. El representante de S1 es D, el representante de S2 es A, y así sucesivamente.
La razón de que no exista un SRD la proporcionan los conjuntos XF y XE asociados al corte
(X, X). El conjunto XF está compuesto por XF = {S2 , S3 , S4 , S6 , S8 , S9 } y el conjunto XE está com-
puesto por XE = {A,C, E, G, I}. Los 6 subconjuntos S2 , S3 , S4 , S6 , S8 y S9 son subconjuntos del conjunto
{A,C, E, G, I}, que sólo contiene 5 elementos. Por tanto, hagamos como hagamos el flujo, uno de los
subconjuntos S2 , S3 , S4 , S6 , S8 y S9 no puede tener representante. En nuestro flujo, el subconjunto S9 se ha
quedado sin representante. Además, esto también implica que uno de los elementos de X E = {B, D, F, H}
no puede ser representante de ningún subconjunto. En nuestro flujo, ha sido el elemento H.

Nota 5.4. A la hora de aplicar el Teorema de Hall para resolver un problema, el enfoque podría variar,
en función de lo que se considere como conjunto E y lo que se considere como familia F . En el primero
de los ejemplos, teníamos m estudiantes, n actividades extraescolares, para cada actividad extraescolar
teníamos el conjunto de estudiantes apuntados, y buscábamos estudiantes distintos que fuesen represen-
tantes de las actividades, de forma que ningún estudiante fuese el representante de varias asignaturas.
En el ejemplo, los estudiantes eran los elementos del conjunto E y las actividades extraescolares eran
la familia F , donde cada actividad es un subconjunto de E (los estudiantes apuntados a la actividad).
El problema se podía haber enfocado de otra manera, aunque el resultado sobre el número máximo de
representantes distintos habría sido el mismo. Las actividades extraescolares podrían haber sido los ele-
mentos de E y los estudiantes la familia F , donde para cada estudiante se habría tenido el conjunto de
actividades extraescolares a las que se ha apuntado. El problema se resolvería de la misma forma, y lo
que se obtendría sería el máximo número de estudiantes que pueden ser representantes de las activida-
des extraescolares, pero con el enfoque dado lo que nos habríamos propuesto es que ninguna actividad
extraescolar puede estar asignada a más de un alumno.

El Teorema de Hall se puede extender de forma inmediata para calcular el emparejamiento de tamaño
máximo en un grafo bipartito. Recordad que un grafo no dirigido G = (V, E) es bipartito si el conjunto
de vértices se puede particionar en dos conjuntos V1 y V2 , de forma que sean disjuntos (V1 ∩V2 = 0),
/ su
198 Capítulo 5. Flujo en redes y aplicaciones

unión es el conjunto de vértices (V1 ∪ V2 = V ), y para cualquier arista del grafo, uno de sus extremos
está en V1 y el otro en V2 . La definición de bipartito para un grafo dirigido es totalmente análoga a la
anterior. Ahora, los arcos tienen uno de sus extremos en uno de los conjuntos y el otro extremo en el otro
conjunto.
Dado un grafo no dirigido G = (V, E), un emparejamiento o matching M es un subconjunto de
aristas de G sin vértices comunes. Por tanto, todos los vértices tienen grado 1 en un emparejamiento. Un
emparejamiento M se dice de tamaño máximo si no se puede añadir ninguna otra arista de G a M, de
forma que el resultado sea otro emparejamiento. Un emparejamiento M de dice perfecto si |M| = ⌊ n2 ⌋,
donde n es el número de vértices del grafo. Si el grafo es dirigido, un emparejamiento está formado por
arcos sin extremos comunes.
En la demostración del Teorema de Hall, observar que teníamos dos tipos de nodos (prescindiendo de
s y t), unos que corresponden a conjuntos de F y otros a elementos de E . Además, todas las conexiones
intermedias van de nodos de F a nodos de E . Por supuesto, toda la argumentación realizada en la
demostración no cambia si llamamos V1 a los nodos de F y V2 a los de E . En ese caso, obtener un
conjunto de representantes distintos de tamaño máximo es lo mismo que obtener un emparejamiento de
tamaño máximo en el grafo bipartito dirigido resultante al eliminar s y t (ver por ejemplo los arcos en
azul de la figura 5.20b).
Ese mismo método permite calcular un emparejamiento de tamaño máximo en un grafo bipartito
no dirigido G = (V1 ∪ V2 , E). Se toma uno de los conjuntos, por ejemplo V1 (usualmente el de menor
cardinalidad, es decir, |V1 | ≤ |V2 |), y se orientan todas las aristas desde los vértices de V1 hasta los vértices
de V2 . De esa forma obtenemos un grafo bipartito dirigido, al que añadimos los nodos ficticios s y t, de
forma que s se conecta a todos los nodos de V1 y todos los nodos de V2 se conectan a t. El método usado
en el Teorema de Hall para calcular un conjunto maximal de representantes distintos permite calcular
un emparejamiento de tamaño máximo en G (los arcos de tipo (Si , e j ) por los que circula flujo definen
las aristas de G que formarán parte del emparejamiento). Además, el método también da información de
porqué no existe un emparejamiento de mayor tamaño.
Para grafos bipartitos, el Teorema de Hall quedaría de la siguiente forma. Antes, introducimos un
poco de notación adicional. Dado un grafo bipartito G = (V1 ∪V2 , E) (puede ser dirigido o no), al conjunto
de vecinos de un vértice v ∈ V1 lo denotaremos por NG (v), es decir, NG (v) = {u ∈ V2 | (v, u) ∈ E}. Si
W1 es un subconjunto de V1 , entonces NG (W1 ) será el conjunto de vecinos de los vértices de W1 , es decir,
[
NG (W1 ) = NG (v)
v∈W1

Teorema 5.14. Dado un grafo bipartito G = (V1 ∪V2 , E), existe un emparejamiento que incluye a todos
los vértices de V1 , si y sólo si, para cada subconjunto W1 ⊆ V1 se tiene que
|W1 | ≤ |NG (W1 )|
Dicho de otra forma, cada vértice de V1 puede emparejarse con un vértice distinto de V2 , si y sólo si,
cada subconjunto W1 de V1 tiene un número suficiente de vecinos en V2 como para poder emparejar sus
elementos.
Una caracterización alternativa (aunque equivalente) sobre el emparejamiento máximo en un grafo
bipartito la da el siguiente teorema, que fue demostrado por Köning y Egerváry. Este teorema, cuya
demostración omitimos, se puede mirar como un caso particular del Teorema de Menger para vértices
(Teorema 5.12).
Teorema 5.15 (Teorema de Köning-Egerváry). Sea G = (V1 ∪V2 , E) un grafo bipartito no dirigido. El
máximo número de aristas de E que podemos hallar con extremos disjuntos es igual al número mínimo
de vértices que hay que eliminar del grafo para hacer desaparecer todas las aristas.

5.4. Ejercicios propuestos


1. Dado el grafo dirigido de la siguiente figura, donde la capacidad de cada arco está indicada en
naranja, calcular el máximo flujo que puede enviarse desde s a t, y dar un mínimo corte.
Grafos y Combinatoria. Javier Tejel 199

1 4 2
3

2 1 2
3
s
1

3 2 t

2. Consideremos la siguiente red de calles, donde los números (en naranja) sobre las calles represen-
tan el máximo flujo de tráfico permitido. Asignar direcciones a las calles todavía no orientadas, de
forma que se pueda maximizar el tráfico desde s a t.

1 30 3
50
25
40 20
15
t
s
30
30
2 50 4

3. Una compañía dispone de dos centros de producción, situados en los nodos 1 y 4 del siguiente
gráfico. La capacidad máxima de producción en cada uno de ellos es de 20 unidades por día de
un cierto material. La compañía debe suministrar el material a dos distribuidores situados en los
nodos 5 y 8, que demandan 15 y 20 unidades diarias de material, respectivamente. La compañía
puede enviar el material por las distintas rutas del gráfico, donde los números en naranja indican la
capacidad máxima de transporte en cada conexión. Determinar si puede satisfacerse la demanda,
y en caso afirmativo indicar cómo debe enviarse la producción.

2 15 5

10 10
5 5
1 6
20 3 5 10 8
10
5
5 10
4 5 7

4. Hay que transportar unidades de un cierto material desde tres almacenes, A1 , A2 y A3 , a cuatro
mercados, M1 , M2 , M3 y M4 . De los almacenes A1 , A2 y A3 pueden salir un máximo de 20, 20 y 100
unidades por día, respectivamente. Los mercados M1 , M2 , M3 y M4 tiene una demanda de 20, 20,
60 y 20 unidades por día, respectivamente. Determinar si pueden satisfacerse las demandas dia-
rias, asumiendo que las capacidades de las distintas rutas desde los almacenes hasta los mercados
figuran en la siguiente tabla.

M1 M2 M3 M4
A1 30 10 0 40
A2 0 0 10 50
A3 20 10 40 5
200 Capítulo 5. Flujo en redes y aplicaciones

5. Sea G = (V, A) un grafo dirigido con el conjunto de nodos V = {1, 2, . . . , 8} y el conjunto de arcos
A = {(1, 2), (1, 3), (1, 5), (1, 6), (2, 3), (2, 4), (2, 5), (2, 6), (3, 5), (3, 6), (4, 5), (4, 7), (5, 7), (5, 8),
(6, 8), (7, 8)}. Hallar el máximo flujo del nodo 1 al nodo 8, suponiendo que por cada uno de los
nodos 2, 3, 4, 5 y 6 pueden circular como máximo 3 unidades de flujo, y por cada arco pueden
circular como máximo 2 unidades de flujo.

6. Una compañía tiene que realizar cuatro proyectos, los proyectos A, B,C y D, en los próximos 6
meses. Cada proyecto tiene fechas de comienzo y finalización variables, y para llevarlos a cabo la
compañía dispone de 4 personas. Para cada trabajo, la siguiente tabla resume la fecha en la que
puede comenzar, la fecha tope de finalización, y las necesidades en el número de personas a lo
largo de su ejecución.

Proyecto Comienzo después de Terminar antes de Personas necesarias


A Mes 1 Mes 4 6
B Mes 1 Mes 6 8
C Mes 2 Mes 5 3
D Mes 1 Mes 6 4

Suponiendo que no más de dos personas pueden trabajar simultáneamente en un proyecto, deter-
minar si existe alguna asignación del personal a los proyectos a los largo de los meses, de forma
que se satisfagan las restricciones de los proyectos.

7. La siguiente tabla especifica la capacidad de los arcos de una red dirigida con nodos V = {s, t, 1,
2, 3, 4, 5, 6}.

Arco (s, 1) (s, 3) (s, 5) (1, 5) (1, 2) (2, 3) (2,t) (3, 4) (3, 6)
Cap. 6 9 4 1 3 1 8 8 1
Arco (4, 5) (4, 2) (4,t) (5, 2) (5, 1) (5, 6) (6, 4) (6,t)
Cap. 1 2 4 2 2 5 1 6

Calcular el máximo flujo que puede enviarse desde s a t y un corte de capacidad mínima.

8. Dado el grafo no dirigido G = (V, E), cuyo conjunto de vértices es V = {1, 2, . . . , 11} y cuyo
conjunto de aristas es E = {(1, 2), (1, 3), (1, 4), (1, 7), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5),
(5, 6), (6, 7), (5, 7), (8, 9), (8, 10), (8, 11), (7, 8), (7, 9), (9, 10), (9, 11), (6, 10), (10, 11), (6, 11)},
calcular lo siguiente.

a) Un conjunto mínimo de aristas que desconecten el vértice 1 del vértice 11.


b) Un conjunto mínimo de vértices que desconecten el vértice 2 del vértice 10.

9. Para las siguientes familias de subconjuntos encontrar un sistema de representantes distintos, o


demostrar que no existe ese sistema.

a) S1 = {a, b, c}, S2 = {a, b}, S3 = { f , a}, S4 = {e, f , g}, S5 = {b, d}, S6 = {c, e}, S7 = {b, c, e}.
b) S1 = {a, b}, S2 = {c}, S3 = {b, c, d, e}, S4 = {c, b}, S5 = { f , d, e, g, h}, S6 = {a, b, c, d, e}, S7 =
{b, c, d}.

10. Una empresa dispone de 10 empleados, los empleados A, B,C, D, E, F, G, H, I y J, y hoy tienen que
hacer 10 trabajos, los trabajos T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 y T10 . Para cada uno de los trabajos, la
siguiente lista da qué empleados pueden realizarlo.

a) T1 → {A, B, D, F, G, I}.
b) T2 → {B,C, D, E}.
Grafos y Combinatoria. Javier Tejel 201

c) T3 → {B,C, D, E, H}.
d) T4 → {B, D, G, I}.
e) T5 → {C, D, E, H, J}.
f) T6 → {B, D, E, H, J}.
g) T7 → {B, D, H, J}.
h) T8 → {C, E, H, J}.
i) T9 → {B,C, H, J}.
j) T10 → {A, B, E, F, G}.

Determinar cómo asignar los trabajos a los empleados, de forma que se realicen el máximo posible
de trabajos. Si no pueden hacerse todos los trabajos, dar una explicación (que entienda nuestro jefe)
de porqué no todos los trabajos pueden realizarse.

11. Repetir el ejercicio 10, suponiendo la siguiente lista sobre qué empleados pueden hacer los traba-
jos.

a) T1 → {A, B, D, E, F, G}.
b) T2 → {B, D, F}.
c) T3 → {A, B, F}.
d) T4 → {A, B, D, F}.
e) T5 → {A,C, G, H, I}.
f) T6 → {C, H, I, J}.
g) T7 → {B, D, E, F, G, H}.
h) T8 → {A, B, D, F}.
i) T9 → {A, G, H, I, J}.
j) T10 → {C, E, F}.

12. Dado el siguiente grafo dirigido, donde los números en naranja sobre los arcos indican la capacidad
de los arcos, calcular el máximo flujo que puede enviarse desde s a t y un corte de capacidad
mínima.
1 3 2
1
1 8
2
6 2 2
s 9 8 4
1 4 t
3
4
1
1
6
5 6 6

13. La siguiente tabla especifica la capacidad de los arcos de una red dirigida con nodos V = {s, t, 1,
2, 3, 4, 5, 6}. Calcular el máximo flujo que puede enviarse desde s a t y un corte de capacidad
mínima.

Arco (s, 2) (s, 4) (s, 6) (1,t) (2, 1) (2, 3) (2, 4) (3, 1) (3,t)
Cap. 2 10 5 2 3 4 3 1 4
Arco (4, 1) (4, 3) (4, 5) (4, 6) (5, 3) (5,t) (6, 3) (6, 5)
Cap. 4 2 2 2 7 12 5 6
202 Capítulo 5. Flujo en redes y aplicaciones

14. La siguiente tabla especifica la capacidad de los arcos de una red dirigida con nodos V = {s, t, 1,
2, 3, 4, 5, 6}. Además, por el nodo 2 puede circular un máximo de 8 unidades de flujo y por el
nodo 3 un máximo de 10 unidades. Calcular el máximo flujo que puede enviarse desde s a t y un
mínimo corte.

Arco (s, 5) (s, 2) (s, 3) (s, 6) (1, 4) (1,t) (2, 1) (2,t) (2, 4) (3, 1) (3,t)
Cap. 24 10 10 24 12 24 10 10 10 10 10
Arco (3, 4) (4, 1) (4,t) (5, 1) (5, 2) (5, 3) (5, 6) (6, 5) (6, 4) (6, 2) (6, 3)
Cap. 10 12 24 12 10 10 12 12 20 10 10

15. La siguiente tabla especifica la capacidad de las aristas de una red no dirigida, cuyos vértices son
V = {s,t, 1, 2, 3, 4, 5, 6}. Calcular el máximo flujo que puede enviarse desde s a t y un corte de
capacidad mínima. Especificar también la dirección en la que hay que enviar el flujo por las aristas
para maximizar el flujo.

Arista (s, 3) (s, 4) (s, 6) (1, 4) (1,t) (2, 1) (2, 3) (2,t)


Cap. 9 6 1 8 2 1 4 2
Arista (3, 1) (3, 5) (3, 6) (4, 2) (4, 5) (5, 2) (5,t) (6, 1)
Cap. 4 6 2 8 1 1 6 3

16. La siguiente tabla especifica la capacidad de las aristas de una red no dirigida, cuyo conjunto de
vértices es V = {s,t, 1, 2, 3, 4, 5, 6}. Calcular el máximo flujo que puede enviarse desde s a t y un
corte de capacidad mínima. Especificar también la dirección en la que hay que enviar el flujo por
las aristas para maximizar el flujo.

Arista (s, 2) (s, 4) (s, 6) (1,t) (2, 1) (2, 3) (2, 4) (3, 1) (3,t)
Cap. 2 10 5 2 3 4 3 1 4
Arista (4, 1) (4, 3) (4, 5) (4, 6) (5, 3) (5,t) (6, 3) (6, 5)
Cap. 4 2 2 2 7 12 5 6

17. Sea G = (V, A) un grafo dirigido, cuyo conjunto de nodos es V = {s, 1, 2, 3, 4, 5, 6, 7, 8, 9,t} y cuyo
conjunto de arcos es A = {(s, 1), (s, 2), (s, 3), (s, 4), (1, 4), (1, 6), (2, 5), (2, 9), (3, 4), (4, 3), (4, 6),
(5, 3), (5, 9), (6, 7), (6,t), (7,t), (8, 7), (9, 8), (8,t), (9,t)}.

a) Determinar un conjunto mínimo de arcos tales que, al quitar esos arcos, no existe en G un
camino dirigido desde el nodo s hasta el nodo t.
b) Determinar un conjunto mínimo de nodos tales que, al quitar esos nodos, no existe en G un
camino dirigido desde el nodo s hasta el nodo t.

18. En un curso hay matriculados 10 alumnos, los alumnos 1, 2, 3, 4, 5, 6, 7, 8, 9 y 10, que pueden ma-
tricularse en 9 asignaturas, las asignaturas A, B,C, D, E, F, G, H e I. La siguiente lista indica las
asignaturas a las que se ha matriculado cada uno de los alumnos.

a) 1 → {A,C, D, G, H}
b) 2 → {A, B, D, E, H}
c) 3 → {C, D, G, H, I}
d) 4 → {A,C, G, H, I}
e) 5 → {A,C, D, G, I}
f) 6 → {B, D, E, F, H}
g) 7 → {A, D, G, H, I}
Grafos y Combinatoria. Javier Tejel 203

h) 8 → {A,C, D, H, I}
i) 9 → {A,C, D, G, H, I}
j) 10 → {A, B,C, E, F}

Queremos elegir un delegado para cada una de esas 9 asignaturas. El delegado tiene que estar ma-
triculado en la asignatura y deseamos que, si es posible, una misma persona no sea la delegada de
más de una asignatura. Determinar si es posible realizar una elección de delegados siguiendo esos
criterios. Además, si necesariamente algún alumno tiene que ser delegado de más de una asignatu-
ra, determinar una asignación de delegados que contenga un máximo de delegados distintos, y dar
una explicación de porqué necesariamente alguno de los alumnos tiene que ser delegado de varias
asignaturas.

También podría gustarte