0% encontró este documento útil (0 votos)
23 vistas316 páginas

Optimización en Redes y Grafos

Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
23 vistas316 páginas

Optimización en Redes y Grafos

Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Optimización en redes

Javier Yáñez Gestoso

Departamento de Estadı́stica e Investigación Operativa


Índice general

1. Introducción 1
1.1. Introducción histórica . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. Optimización combinatoria . . . . . . . . . . . . . . . . . . . . . 6
1.3. Complejidad algorı́tmica . . . . . . . . . . . . . . . . . . . . . . . 7

2. Conceptos básicos 13
2.1. Grafo, digrafo y multigrafo . . . . . . . . . . . . . . . . . . . . . 13
2.2. Subconjuntos de grafos . . . . . . . . . . . . . . . . . . . . . . . . 18
2.3. Conexión de grafos . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3. Representación de grafos 25
3.1. Representación geométrica. Grafo planar . . . . . . . . . . . . . . 25
3.2. Representaciones matriciales de un grafo . . . . . . . . . . . . . . 31
3.2.1. Matriz de incidencia . . . . . . . . . . . . . . . . . . . . . 31
3.2.2. Matriz de adyacencia . . . . . . . . . . . . . . . . . . . . . 33
3.3. Representación vectorial . . . . . . . . . . . . . . . . . . . . . . . 35
3.4. Representación por lista de adyacencia . . . . . . . . . . . . . . . 38

4. Conexión en grafos 41
4.1. Fijando el vértice inicial. Algoritmo de Trémaux-Tarjan . . . . . 42
4.1.1. Conexión fuerte . . . . . . . . . . . . . . . . . . . . . . . . 47
4.1.2. Determinación de cadenas y caminos . . . . . . . . . . . . 48
4.2. Conexión desde cualquier vértice. Algoritmo matricial . . . . . . 48
4.2.1. Algoritmo identificando los caminos entre cualquier par
de vértices (*) . . . . . . . . . . . . . . . . . . . . . . . . 51

3
ORED 4 ÍNDICE GENERAL

5. Árbol 55
5.1. Árbol. Definición y caracterizaciones . . . . . . . . . . . . . . . . 55
5.2. Representación vectorial de un árbol . . . . . . . . . . . . . . . . 59
5.3. Algoritmo Heapsort de ordenación de números . . . . . . . . . . 60
5.3.1. Árbol binario . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.3.2. Estructura de pila . . . . . . . . . . . . . . . . . . . . . . 63
5.3.3. Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.4. Árbol soporte. Estudio algebraico de ciclos y cociclos . . . . . . . 69
5.4.1. Ciclos en un grafo conexo. Número ciclomático . . . . . . 69
5.4.2. Cociclos en un grafo conexo. Número cociclomático (*) . . 74

6. Problema de árbol soporte de mı́nimo peso 81


6.1. Red no dirigida. Planteamiento del problema . . . . . . . . . . . 81
6.2. Algoritmo de Kruskal . . . . . . . . . . . . . . . . . . . . . . . . 83
6.3. Algoritmo de Prim . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.4. El modelo de Programación Matemática (*) . . . . . . . . . . . . 91

7. Problema de la arborescencia de mı́nimo peso 97


7.1. Arborescencia. Conexión casi-fuerte . . . . . . . . . . . . . . . . . 97
7.2. Arborescencia de mı́nimo peso . . . . . . . . . . . . . . . . . . . 100

8. Problema de Camino Mı́nimo. Vértice inicial fijo 107


8.1. Problema de Camino Mı́nimo. Existencia de solución . . . . . . . 108
8.2. Ecuaciones de optimalidad . . . . . . . . . . . . . . . . . . . . . . 110
8.3. Algoritmo para Redes sin circuitos . . . . . . . . . . . . . . . . . 114
8.4. Modelos de programación matemática asociados . . . . . . . . . 117
8.4.1. Modelo de selección de arcos. Unimodularidad . . . . . . 118
8.4.2. Modelo de las ecuaciones de Bellman. Algoritmo de rela-
jación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
8.5. Algoritmo de Dijkstra . . . . . . . . . . . . . . . . . . . . . . . . 134
8.6. Algoritmo de Bellman-Ford . . . . . . . . . . . . . . . . . . . . . 137

9. Problema de Camino Mı́nimo. Extensiones 143


9.1. Camino mı́nimo entre cualquier par de vértices . . . . . . . . . . 143
9.1.1. Algoritmo matricial . . . . . . . . . . . . . . . . . . . . . 144
9.1.2. Algoritmo de Floyd-Warshall . . . . . . . . . . . . . . . . 148
9.2. Redes con tiempo de tránsito (*) . . . . . . . . . . . . . . . . . . 153
ÍNDICE GENERAL ORED 5

9.3. Problema de embotellamiento (*) . . . . . . . . . . . . . . . . . . 156

[Link] en digrafos. 159


10.1. Concepto de flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
10.2. Flujos y ciclos de un digrafo. Estudio algebraico . . . . . . . . . . 162
10.3. Lema de coloración de arcos . . . . . . . . . . . . . . . . . . . . . 169

[Link] de Flujo Máximo. Algoritmo de Ford-Fulkerson 175


11.1. Red de transporte. Flujo compatible . . . . . . . . . . . . . . . . 175
11.1.1. Problema de flujo máximo en grafos no dirigidos . . . . . 180
11.2. Flujo máximo y corte mı́nimo . . . . . . . . . . . . . . . . . . . . 181
11.2.1. Algoritmo asociado al lema de coloración . . . . . . . . . 184
11.3. Convergencia y complejidad del algoritmo de Ford-Fulkerson . . 186
11.4. Algoritmo asociado al grafo incremental (*) . . . . . . . . . . . . 188
11.5. Modelo de programación asociado . . . . . . . . . . . . . . . . . 195

[Link] de Circulación 199


12.1. Planteamiento del problema . . . . . . . . . . . . . . . . . . . . . 199
12.2. Condiciones de optimalidad. Flujo y tensión de un arco . . . . . 204
12.3. Diagrama de especificaciones . . . . . . . . . . . . . . . . . . . . 207
12.4. Esquema del algoritmo de desviaciones . . . . . . . . . . . . . . . 209
12.5. Regla de coloración. Procedimientos asociados. . . . . . . . . . . 210
12.5.1. Modificación del flujo . . . . . . . . . . . . . . . . . . . . 211
12.5.2. Modificación de la tensión . . . . . . . . . . . . . . . . . . 215
12.5.3. Esquema básico del algoritmo de desviaciones . . . . . . . 217
12.6. No existencia de flujo compatible . . . . . . . . . . . . . . . . . . 221
12.7. Algoritmo de desviaciones, pseudo-código (*) . . . . . . . . . . . 224

[Link] de emparejamiento máximo en grafos bipartitos 231


13.1. Problema de emparejamiento máximo . . . . . . . . . . . . . . . 231
13.1.1. Cadena alternante . . . . . . . . . . . . . . . . . . . . . . 233
13.1.2. Árbol alternante . . . . . . . . . . . . . . . . . . . . . . . 237
13.2. Algoritmo de Edmonds . . . . . . . . . . . . . . . . . . . . . . . . 243
13.3. Aspectos combinatorios del Problema (*) . . . . . . . . . . . . . 246
ORED 6 ÍNDICE GENERAL

[Link] de Emparejamiento y Recubrimiento 253


14.1. Problema de emparejamiento máximo en grafos generales . . . . 253
14.1.1. Detección de ciclos impares . . . . . . . . . . . . . . . . . 255
14.1.2. Algoritmo de Edmonds (*) . . . . . . . . . . . . . . . . . 258
14.2. Problema de mı́nimo recubrimiento . . . . . . . . . . . . . . . . . 258
14.3. Problema de emparejamiento de máximo peso (*) . . . . . . . . . 261
14.3.1. Coste reducido de cadena alternante . . . . . . . . . . . . 262
14.3.2. Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . 263

[Link] de rutas en grafos 267


15.1. Cadena y ciclo euleriano . . . . . . . . . . . . . . . . . . . . . . . 267
15.1.1. Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
15.2. Problema del cartero chino . . . . . . . . . . . . . . . . . . . . . 273
15.3. Ciclo hamiltoniano . . . . . . . . . . . . . . . . . . . . . . . . . . 276
15.4. Problema del viajante . . . . . . . . . . . . . . . . . . . . . . . . 278
15.4.1. Algoritmo de la ciudad más cercana . . . . . . . . . . . . 279
15.4.2. Algoritmo de Lin-Kernighan . . . . . . . . . . . . . . . . . 279
15.4.3. Algoritmo de Christofides . . . . . . . . . . . . . . . . . . 283
15.5. Introducción a la complejidad de los problemas . . . . . . . . . . 284
15.5.1. Problemas de decisión. Clase P . . . . . . . . . . . . . . . 285
15.5.2. Algoritmo no determinı́stico. Clase N P . . . . . . . . . . 287
15.5.3. Transformaciones polinomiales. Clase N P-completa . . . 288

[Link] en grafos y digrafos. Problema de coloración 293


16.1. Conjunto independiente. Núcleo de un digrafo . . . . . . . . . . . 293
16.1.1. Función de Grundy (*) . . . . . . . . . . . . . . . . . . . . 296
16.2. Problema de coloración de grafos . . . . . . . . . . . . . . . . . . 298
16.2.1. Función de coloración. Número cromático . . . . . . . . . 298
16.2.2. Algoritmo voraz . . . . . . . . . . . . . . . . . . . . . . . 301
16.2.3. Algoritmo exacto de Brown . . . . . . . . . . . . . . . . . 302

Referencias 305
Índice de algoritmos

4.1. [nvis, p] = ConexT remauxT arjan(h, Γ) . . . . . . . . . . . . . . 43


4.2. [K, P] = ConexM atricial(B) . . . . . . . . . . . . . . . . . . . . . 52

5.1. [a] = HeapSortT estP ila(a, i, lon(a), left, right) . . . . . . . . . . 66


5.2. [a] = HeapSortConstP ila(a, lon(a), left, right) . . . . . . . . . . 66
5.3. [a] = HeapSortAlg(a, lon(a), left, right) . . . . . . . . . . . . . . 66

6.1. [T, p, nro dep] = ArbolSopKruskal(G = (V, E); d) . . . . . . . . . 84


6.2. [T, p] = ArbolSopP rim(G = (V, E); i ∈ V ; d) . . . . . . . . . . . . 89

7.1. [p] = ArborMin(G = (V, U ); r ∈ V ; d) . . . . . . . . . . . . . . . . 104

8.1. [u, p, σ] = CamM inSinCircuitos(B, D) . . . . . . . . . . . . . . . 115


8.2. [u, p] = CamM inRelajacion(D) . . . . . . . . . . . . . . . . . . . 131
8.3. [u, p] = CamM inDijkstra(D) . . . . . . . . . . . . . . . . . . . . 135
8.4. [u, p] = CamM inBellmanF ord(D) . . . . . . . . . . . . . . . . . 139

9.1. [U, P] = CamMinMatricial(D) . . . . . . . . . . . . . . . . . . . . 145


9.2. [U, P] = CamMinFloyd(D) . . . . . . . . . . . . . . . . . . . . . . 151

10.1. [p, A] = LemaColor(G = (V, U ∪ (t, s)); {col(u), u ∈ U }; col(t, s) =


N ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172

11.1. [f ] = FluMaxColor(G = (V, U ∪ (t, s)), {cu u ∈ U } ) . . . . . . . . 187


11.2. [f ] = FluMaxGraIncr(G = (V, U ∪ (t, s)), {cu u ∈ U } ) . . . . . . . 191
11.3. [f ] = FluMaxEtiq(G = (V, U ∪ (t, s)), {cu u ∈ U } ) . . . . . . . . . 193

7
ORED 8 ÍNDICE DE ALGORITMOS

12.1. [tipo] = DesviacionesTipo({U ; l, c, x; d, t} ) . . . . . . . . . . . . 225


12.2. [col] = DesviacionesColor(tipo ) . . . . . . . . . . . . . . . . . . . 225
12.3. [p] = DesviacionesEtiqueta(s ∈ V ; {G = (V, U ); col} ) . . . . . . . 226
12.4. [x] = DesviacionesFlujo(s, t ∈ V ; {(V, U ); l, c, d; p; (x, t)} ) . . . . 227
12.5. [δ, A] = DesviacionesPotencial({(V, U ); l, c, d; p; (x, t)}) . . . . . . 229
12.6. [x, w, t, A] = Desviaciones({G = (V, U ); l, c; d} ) . . . . . . . . . . 230

13.1. [K] = EmpBipEdmonds(G = (V, E), K) . . . . . . . . . . . . . . 251

14.1. [K, nc] = EmpM axContrac(x, y, G = (V, E), K ⊂ E, nc) . . . . . 257


14.2. [K] = EmpM axExpandir(G = (V, E); K ⊂ E, nc) . . . . . . . . . 257

15.1. [σ] = CadEuleriana(G = (V, E); a, b; {w(i) ⊂ E / i ∈ V }) . . . . . 271


15.2. [µ, d] = T SP V oraz(G = (V, E); {D = (di,j ), i, j ∈ V }) . . . . . . 280
15.3. [µ, d] = T SP LK(G = (V, E); {D = (di,j ), i, j ∈ V }) . . . . . . . . 282

16.1. [C, ī, χ̄] = ColorV oraz(i0 , c0 , G = (V, E), {C(j), i < i0 }) . . . . . . 302
16.2. [C, χ̄(G)] = ColorBrown(G = (V, E)) . . . . . . . . . . . . . . . . 304
[]
Capı́tulo 1
Introducción

Se introduce la teorı́a de grafos históricamente a partir del problema de los


puentes de Königsberg.
Los problemas planteados en esta disciplina, a diferencia de otros problemas
matemáticos, son de ı́ndole combinatoria, es decir, son finitos. No obstante la
simplificación teórica que suponen los problemas combinatorios, su tratamien-
to real puede ser muy difı́cil. Es necesario introducir una serie de conceptos
relacionados con la Complejidad algorı́tmica para entender esta dificultad.

1.1. Introducción histórica


Como disciplina matemática, la optimización combinatoria es relativamente
joven; no obstante, muchas lı́neas de investigación han sido desarrolladas in-
dependientemente a partir de determinados problemas planteados: problema de
asignación, camino mı́nimo, problema del viajante, etc. Es a partir de 1950, coin-
cidiendo con los desarrollos de los algoritmos de programación lineal y entera,
cuando se estudian todos estos problemas de una forma unificada y se encajan
dentro de la Investigación operativa. En sentido contrario, el desarrollo de la
programación lineal y entera surgió a partir del planteamiento de problemas de
optimización combinatoria, concretamente, los problemas del transporte y de
transbordo.
Los problemas de optimización combinatoria han sido planteados desde el
principio; por citar dos ejemplos, el problema de camino mı́nimo surge a la hora
de diseñar cualquier tipo de desplazamiento, y, por otra parte, el problema del
ORED 2 Introducción

(a) Ciudad de Königsberg (b) Resaltando el rı́o y (c) El grafo


puentes

Figura 1.2: Problema de los puentes de Königsberg

viajante lo resuelve cualquier profesional (cartero, médico, distribuidor, etc.)


que trata de economizar los movimientos necesarios en su quehacer habitual.
Es por esta razón muy difı́cil bus-
car los orı́genes de dichos problemas,
lo que obliga a reducir este estudio
al de su tratamiento matemático. En
este sentido, se considera pionero el
trabajo de Leornard Euler [15], ver fi-
gura 1.1, al resolver el problema de
los puentes de Königsberg.
Para entender la aportación de
Euler es preciso adelantarse al año
1679, en el que Leibniz, en una carta Figura 1.1: Leonard Euler, 1707-1783
a Huygens, distingue entre el análisis
geométrico de la posición, frente al análisis algebraico de la magnitud.
El problema que abordó Euler era simplemente un pasatiempo que se plan-
teaban en la ciudad de Königsberg, actual Kaliningrado de Lituania, a principios
del siglo XVIII: ¿Es posible recorrer los siete puentes que cruzan el rı́o Pregel
(actualmente, Pregolya) sin repetir ninguno y volviendo al punto de partida?
Siete puentes sobre el rı́o conectaban las cuatro zonas de tierra que separaba
dicho rı́o, ver la figura 1.2.
Fue Euler el que demostró que tal recorrido no existı́a en su artı́culo Solutio
problematis ad geometrian situs pertinentis, publicado en 1736 por la Academia
de San Petersburgo.
Euler comienza el artı́culo distinguiendo la rama de la geometrı́a, casi des-
Introducción histórica ORED 3

conocida e introducida por Leibniz —la geometrı́a de posición— involucrada no


en las magnitudes, sino en la determinación de la posición y sus propiedades.
Todavı́a, sin embargo, no está claro qué tipo de problemas se pueden plantear en
esta nueva disciplina y qué métodos se utilizan para resolverlos. Es en esta lı́nea
en la que aporta el problema de los puentes de Königsberg como un problema
de la geometrı́a de posición.
Matemáticamente, se construye
una estructura, denominada grafo, B
que permite identificar las carac-
terı́sticas fundamentales del proble- C
A
ma: Cada una de las porciones de tie-
rra {A, B, C, D} se asocia a un pun- D
to (nodo o vértice) de forma que los
Figura 1.3: Grafo asociado al problema
puentes son lı́neas (aristas) que unen
de los puentes
dichos puntos. La figura 1.3 muestra
una representación de este grafo.
Un ciclo que recorra todas las aristas de un multigrafo sin repetir ninguna
se denomina un ciclo euleriano. Posteriormente, se demostrará que no existe
solución para el problema de los puentes de Königsberg.
Se ha introducido ası́ lo que luego se formalizará como un grafo. Los grafos
permiten modelizar muchas situaciones y problemas reales, lo que ya supone
una gran ventaja a la hora de resolverlos. Además, las técnicas especı́ficas de
grafos permiten resolver de una forma más eficiente dichos problemas.
En 1759, el propio Euler [16] publicó un artı́culo en la Academia de Ciencias
de Berlı́n relacionado con el problema del recorrido de un caballo por el tablero
de ajedrez. El artı́culo se titulaba Solution d’une question curieuse qui ne paroit
soumise à aucune analyse.
El problema consistı́a en determinar un recorrido de un caballo en el tablero
de ajedrez que pasara por las 64 casillas sin repetir ninguna y volviendo a la
casilla inicial. Este problema fue abordado por Vandermonde [40], que publicó
en 1771 en la Academia de Ciencias de Parı́s el artı́culo titulado Remarques sur
les problèmes des situation.
En 1833, Gauss citaba a Euler y Vandermonde como los únicos geómetras
que habı́an tocado ligeramente la Geometrı́a de posición.
Posteriormente se identificará el recorrido del caballo con las propiedades
ORED 4 Introducción

anteriores como un ciclo hamiltoniano en un grafo, siendo los vértices de este


grafo las 64 casillas del tablero y siendo las aristas los pares de casillas adyacentes
por un movimiento de caballo. En la tabla adjunta se representa una de las
posibles soluciones asociando a cada casilla el orden en que es visitada.

1 52 25 38 3 54 15 40
24 37 2 53 26 39 4 55
51 64 27 12 29 14 41 16
36 23 62 45 60 43 56 5
63 50 11 28 13 30 17 42
22 35 46 61 44 59 6 57
49 10 33 20 47 8 31 18
34 21 48 9 32 19 58 7

El nombre de ciclo hamiltoniano viene del matemático Hamilton (1805-1865),


que introdujo las álgebras no conmutativas, que las ilustró con el icosian calculus
a partir de los vértices, aristas y caras de un icosaedro. La interpretación gráfica
del icosian calculus fue la base de un acertijo denominado el icosian game, que
presentó en Dublı́n en 1857 en una reunión cientı́fica; para más detalles ver el
libro de Biggs et al. [8]. Hay otra versión del juego de Hamilton asociada al pro-
blema de determinar un circuito cerrado por 20 ciudades del mundo (Bruselas,
Canton, Delhi,..,Zanzibar) sin repetir ninguna y visitándolas todas.
En 1856, Kirkman incluye una función objetivo a minimizar en el problema
del ciclo hamiltoniano y plantea ası́ el Problema del viajante; en el citado libro
de Biggs et al. [8] se incluye una interesante discusión entre el irlandés Sir
William Rowan Hamilton y el británico Thomas Penyngton Kirkman, ambos
matemáticos.
Cayley [9] (1821 - 1895) introduce en 1857 el concepto de árbol por analogı́a
con los nudos o nodos (vértices) y las ramas (aristas). Kirchkoff (1824-1887)
estudia los circuitos eléctricos e introduce el número ciclomático y la base de
ciclos. Otros matemáticos ilustres de la época aportaron algunos conceptos y
resultados de esta nueva disciplina.
El término de grafo fue introducido por el quı́mico inglés Brown en 1864 al
proponer la graphic notation en la representación de las moléculas; esta notación,
que mejora la introducida por Kekulé en 1854, es la utilizada actualmente en la
Quimica.
Introducción histórica ORED 5

Otro de los hitos en el desarrollo de la Teorı́a de grafos lo representa la


conjetura de los cuatro colores. Su enunciado original (cualquier mapa puede
ser coloreado con 4 colores sin que dos regiones adyacentes compartan el mismo
color ) se debe a Francis Guthrie [22], que en 1852 observó el resultado pero no
pudo probarlo. Al preguntar a su profesor De Morgan, éste planteó la cuestión a
otros matemáticos, incluidos Hamilton y Cayley; este último publicó un artı́culo
titulado On the colouring of maps en la Royal Geographical Society en 1879.
En 1879, Kempe anunció que ya tenı́a una prueba de la conjetura de los cua-
tro colores, pero Heawood, en 1890, demostró que era errónea y que con 5 colores
sı́ se podı́a demostrar. Habrá que esperar, sin embargo, a Appel y Haken [5],
que en 1976 demuestren el teorema de los cuatro colores, pero la demostración
está basada en complejas pruebas computacionales y es muy difı́cil de verificar.
En 1996, Robertson y otros autores [33] consiguen dar una demostración que sı́
se considera válida.
En 1926, Boruvka plantea el problema del árbol soporte de mı́nimo peso; en el
artı́culo de Nesetril et al. [31] se puede ver la traducción al inglés de este artı́culo.
Nuevos algoritmos para este problema serán propuestos por Kruskal [28] en 1956
y Prim [32] en 1957.
En 1927, Menger [30] demuestra un teorema, que lleva su nombre, y que
será el precursor del resultado que relaciona el flujo máximo y el corte mı́nimo,
demostrado posteriormente por Ford y Fulkerson en 1954.
En los años 30 del siglo XX, Kuratowski [29] introduce el concepto de grafo
planar al estudiar las propiedades de representación de los grafos.
Los rusos Tolstoi [39], en 1930, y Kantorovich [27], en 1939, plantean el
problema del transporte. De forma independiente fue estudiado este problema
por Hitchcock y Koopmans en 1941. El algoritmo del simplex, desarrollado
por Dantzig [11] en 1947, adaptarı́a los métodos de los tres autores anteriores
para resolver una generalización del problema del transporte: el problema de
programación lineal.
Aunque el problema de camino mı́nimo ya fue planteado por Wiener en 1873
y por Lucas en 1882 (aunque su trabajo fue adjudicado a Trémaux), hay que
esperar al trabajo de Shimbel en 1954, posteriormente ampliado por Bellman
en 1958, para obtener algoritmos precisos. Posteriormente, en 1959, Dijkstra
propuso un nuevo algoritmo para este problema. Para más detalles sobre la
historia del desarrollo de los algoritmos de camino mı́nimo, ver Schrijver [34].
ORED 6 Introducción

Durante estos años, y como consecuencia de los últimos desarrollos teóricos,


es analizado de nuevo el problema del viajante por la RAND Corporation y por
autores como Dantzig, Fulkerson y Johnson.
Es en 1958, cuando Berge [7] estructura y unifica todos los problemas de
grafos analizados hasta el momento en lo que se conocerá como Teorı́a de grafos.
El uso de los ordenadores en los años 60 provocó una gran cantidad de
aplicaciones de todas estas técnicas y el consiguiente desarrollo teórico de todas
ellas.
En la actualidad se mantienen dos enfoques al estudiar los grafos: por un
lado se estudian problemas teóricos asociados a las estructuras de grafos, como
pueden ser problemas de existencia y enumeración de determinadas estructuras,
y por otro lado, y éste es el enfoque seguido aquı́, se trata de utilizar los grafos
como una herramienta que facilita la modelización de determinados problemas
de optimización que surgen en determinadas situaciones reales.
Para más detalles sobre el desarrollo histórico de la Teorı́a de grafos, se puede
consultar libro de Biggs et al. [8].

1.2. Optimización combinatoria


El análisis combinatorio es el estudio matemático de la ordenación, agrupa-
miento o selección de objetos discretos, usualmente finitos.

El problema de los puentes de Königsberg es un problema de análisis combi-


natorio, puesto que se trata de encontrar una permutación de 7 elementos —los
puentes— verificando una serie de propiedades.

La Combinatoria analiza problemas de existencia o enumeración. Responde


a las preguntas: ¿existe solución?, ¿cuántas soluciones hay?.

Cuando en un problema de ı́ndole combinatoria uno se plantea cuestiones


del tipo: entre todas las soluciones, ¿cuál es la mejor? se está proponiendo un
problema de optimización combinatoria.

Por ejemplo, si en el problema de los puentes de Königsberg hubiera que


pagar un peaje al atravesar cada puente, ¿cuál serı́a la ruta más económica para
ir desde B hasta D?
Complejidad algorı́tmica ORED 7

Se distinguen los siguientes procedimientos de resolución de problemas de


optimización combinatoria:

Procedimientos enumerativos.
Son muy elementales, pero sólo son válidos en la mayorı́a de problemas
para tamaños pequeños, al crecer exponencialmente el número de posibles
soluciones.

Procedimientos de programación matemática.


Bajo ciertas hipótesis, que se verifican en muchos problemas de gestión
y decisión, los problemas de optimización combinatoria se pueden plan-
tear como problemas de programación entera o binaria. No obstante, en
la mayor parte de las situaciones, y al igual que los procedimientos enu-
merativos, la solución de este tipo de problemas sólo se puede garantizar
para tamaños pequeños. En otros casos, sin embargo, la relajación conti-
nua —que obvia las restricciones de integralidad del modelo— proporciona
directamente la solución. Con esta cuestión está relacionada la unimodu-
laridad de la matriz de restricciones asociada.

Procedimientos especı́ficos.
Las dos alternativas anteriores son superadas con éxito en aquellos proble-
mas de optimización combinatoria con una estructura tan particular, es
el caso de determinados problemas de grafos, que permiten ser abordados
por algoritmos especı́ficos computacionalmente eficientes.

Con el fin de valorar las alternativas anteriores, es preciso introducir una


serie de conceptos sobre complejidad algorı́tmica. En principio se abordará el
problema de clasificar los algoritmos, posteriormente se analizará la clasificación
de los problemas.

1.3. Complejidad algorı́tmica


Desde el punto de vista teórico, un problema de optimización combinatoria
es muy sencillo, puesto que se trata de elegir entre todas las posibles soluciones
—en los problemas reales es siempre un número finito— la que mejor valoración
tenga. Sin embargo, desde el punto de vista práctico, este enfoque enumerativo
puede resultar inviable.
ORED 8 Introducción

Para ilustrar la dificultad real de cálculo en determinados problemas de op-


timización combinatoria, trataremos de resolver el problema de los puentes de
Königsberg mediante un algoritmo enumerativo.
El algoritmo en cuestión identifica todas las posibles permutaciones de puen-
tes y comprueba para cada una de ellas si aporta una solución válida para el
problema: si dos puentes consecutivos comparten una misma zona de tierra para
que se pueda pasar de uno a otro y si la zona de partida es la zona de llegada.
En el problema original hay 7 puentes, por lo que habrı́a que rastrear 7! =
5040 permutaciones. Por muy complicadas que sean las operaciones a reali-
zar para cada permutación, cualquier ordenador darı́a una solución casi ins-
tantáneamente.
Sin embargo, y Euler ya planteaba esta cuestión, si el número de puentes
aumenta, el procedimiento enumerativo se hace inviable. Por ejemplo, con 25
puentes, la situación cambia drásticamente; si se supone que la comprobación
de cada permutación consume 0,00001 segundos de CP U . La comprobación de
todas las permutaciones implicarı́a

25! × 0,00001 seg. = 1,55112 × 1025 × 0,00001 seg. = 4,91857 × 1012 años !!!!...

Esta dificultad, que se traduce en que problemas de tamaño medio o grande


no pueden ser resueltos en tiempo real, se mantiene en algunos problemas para
los que no existen algoritmos eficientes y es un problema que no se resuelve con
el incremento de velocidad de los procesadores.

El estudio formal de este tipo de problemas computacionales se enmarca


dentro de la disciplina de Complejidad Algorı́tmica, de la que se introducen a
continuación algunos conceptos básicos.

Una cuestión previa es la siguiente: ¿Cómo valorar los algoritmos?. En pro-


blemas de optimización de redes y, en general, en problemas de optimización
combinatoria puede haber más de un algoritmo que los resuelva; en tales casos,
¿cuál hay que elegir?

El objetivo es valorar los algoritmos que resuelven un determinado problema.


Se entiende que un algoritmo resuelve un problema cuando es capaz de apor-
tar una solución —o indicar que no existe tal solución— para cualquier ejemplo
de dicho problema.
Complejidad algorı́tmica ORED 9

Un problema puede ser el problema de camino mı́nimo en una red dirigida.


Cada una de las redes que se puedan definir será un ejemplo del citado problema.

Para valorar la resolución de un problema por un algoritmo se pueden consi-


derar varios criterios: la memoria de almacenamiento que requiere el algoritmo
en lenguaje máquina, la sencillez y legibilidad del código asociado al algoritmo,
etc.
No obstante, y considerando que es el recurso crı́tico, el criterio a conside-
rar será siempre el tiempo de CP U que tarda el correspondiente algoritmo en
resolver un ejemplo del problema.

Por otra parte, el tiempo de CP U consumido depende del tamaño del ejem-
plo elegido. Obviamente, tardará más el algoritmo enumerativo del problema
de Königsberg con 7 puentes que con 25. Si se trata de valorar los algoritmos,
habrá que medir el tiempo consumido como función del tamaño del problema
tratado.
En general, la dimensión de un ejemplo mide la memoria de ordenador ne-
cesaria para almacenarlo. Sin embargo, en muchos problemas suele existir un
parámetro que permite caracterizar fácilmente la dimensión de los ejemplos. En
matrices puede ser el número de filas y columnas, en grafos el número de vértices
y arcos, etc.

En los puentes de Königsberg, la dimensión del ejemplo vendrá determinada


por el número de aristas. Si el problema es el de multiplicar matrices cuadradas,
la dimensión del ejemplo vendrá especificada por el número de filas y columnas
de las matrices.

En algunos problemas, el tiempo que necesita un algoritmo para resolverlos


puede depender de la dimension del ejemplo y, además, de los datos que lo
caracterizan.

En el caso del producto de matrices, el tiempo que tarda un ordenador depen-


de sólo de la dimensión de éstas. Mientras que en el problema del ciclo euleriano,
el problema asociado a los puentes de Königsberg, el tiempo de computación de-
pende no sólo del número de aristas sino de la estructura o topologı́a del grafo
subyacente. Es evidente que el algoritmo enumerativo recorrerá las 7! posibles
permutaciones porque no existe solución; si existiera ésta y fuera la primera
ORED 10 Introducción

permutación que analizara el algoritmo, éste ejecutarı́a menos operaciones y


tardarı́a menos tiempo.

Hay que observar que valorar los algoritmos por el tiempo de CP U que
consumen en resolver un proporcionar la solución de un determinado problema
con una dimensión fija puede ser discutible, puesto que puede influir el tipo y
calidad del ordenador utilizado.
Para evitar la dependencia del soporte informático, se cuenta el número de
operaciones elementales que el algoritmo ejecuta: sumas, multiplicaciones, asig-
naciones, comparaciones, etc. y no el tiempo que tarda en ejecutar éstas.
Por lo indicado anteriormente, el número de operaciones elementales se ca-
racteriza en función de la dimensión del ejemplo a resolver.
Fijada la dimensión, y con el fin de evitar la dependencia de los datos del
ejemplo, se considera el peor de los casos posibles. El cálculo del número de
operaciones se basa en una cota superior del número real de operaciones que
realizarı́a el algoritmo con cualquier problema concreto de una dimensión fija.
En el ejemplo de Königsberg serı́a suponer que no existe solución para forzar
la evaluación de todos los posibles recorridos por los puentes.

Siguiendo este criterio conservador, se define la complejidad algorı́tmica:


Sea f (n) el número de operaciones elementales que un algoritmo necesita
para resolver —en el peor de los casos— un ejemplo de dimensión n.
Considerando que esta función puede resultar complicada de evaluar y ex-
presar, hay que pensar, por ejemplo, en un polinomio de grado 3, y con el fin
de valorar el comportamiento del algoritmo cuando el problema concreto es
suficientemente grande, se utiliza sólo el orden asintótico de la función f (n):
Sea g(n) una función verificando

f (n)
lı́m = cte
n→∞ g(n)

de forma que se define la complejidad algorı́tmica por O(g(n)) cuando verifica


la relación anterior.

El tipo de función g(n) determina una clasificación de los algoritmos por su


complejidad. Si la función es del tipo g(n) = n, se dice que el algoritmo tiene
Complejidad algorı́tmica ORED 11

complejidad lineal y se denota por O(n); en este caso, el número de operacio-


nes en el peor de los casos, consiguientemente para todos los ejemplos, crece
linealmente con la dimensión del problema concreto que resuelve.
Si la función es del tipo g(n) = np , para un p > 0 fijo, se dice entonces que
el algoritmo tiene complejidad polinomial.

Cuando la complejidad no sea de tipo polinomial, serı́a el caso del algorit-


mo enumerativo del problema del ciclo euleriano, se dice que tiene complejidad
exponencial. En general, este tipo de algoritmos no son eficientes computacional-
mente ya que para tamaños medios y grandes el tiempo de ejecución es inviable.
No obstante, y considerando la propia definición del criterio, que supone el peor
de los casos, hay algoritmos exponenciales que se pueden comportar bien en la
práctica;
! serı́a el caso del algoritmo del simplex, que es exponencial al haber
n
posibles bases, y sin embargo se comporta realmente como un algorit-
m
mo polinomial, puesto que evalúa entre 23 · m y 3 · m cambios de base, siendo m
el número de restricciones del problema de programación lineal.
Para profundizar más en estos conceptos, es imprescindible el libro de Garey
y Johnson [20].

Observación 1.1. El concepto de complejidad algorı́tmica es un criterio con-


servador, en el sentido de suponer la peor de las situaciones. Hay casos en los
que este criterio puede penalizar un determinado algoritmo; serı́a el caso del al-
goritmo del simplex en programación lineal, que tiene complejidad no polinomial
y, sin embargo, se comporta como un algoritmo polinomial.
Una alternativa consiste en analizar la complejidad real de los algoritmos
evaluando el tiempo medio que tardan en resolver un problema con distintos
ejemplos con diferentes dimensiones. Los ejemplos pueden tener su origen en
bases de datos disponibles para los investigadores o bien pueden ser generados
de forma aleatoria para evitar sesgos en los cálculos.
Al depender este criterio del soporte informático que ejecuta el algoritmo hay
que especificar el ordenador que ha ejecutado el algoritmo, ası́ como cualquier
otra circunstancia que pueda ser relevante.
ORED 12 Introducción
Capı́tulo 2
Conceptos básicos

Se introducen en este capı́tulo los conceptos asociados de grafo, digrafo y


multigrafo. Se representan algebraicamente a partir de las matrices de incidencia
y adyacencia, que permitirán el procesamiento de un grafo en un ordenador.
Una propiedad interesante en un grafo es la conectividad, que permite unir los
vértices a través de las aristas o arcos adyacentes.
Casi todos los conceptos asociados a grafos, ası́ como los resultados teóri-
cos y algoritmos de estos apuntes pueden estudiarse en los libros de Berge [7],
Golumbic [21], Harary [23] y Lawler [25].

2.1. Grafo, digrafo y multigrafo


Ejemplo 2.1. Se quieren analizar las distintas alternativas que existen para ir
desde Madrid hasta Tokio durante un fin de semana. Se dispone de la informa-
ción de vuelos compatibles entre distintos aeropuertos: Madrid (m), Londres (l),
Frankfurt (f ), Parı́s (p), Singapur (s) y Tokio (t).

l f s

m p t

Figura 2.1: Digrafo de aeropuertos del Ejemplo 2.1

La figura 2.1 ilustra el problema planteado al representar los aeropuertos en


ORED 14 Conceptos básicos

el plano y los vuelos directos por flechas que unen el aeropuerto de origen con
el de destino.

Definición 2.1. Un digrafo o grafo dirigido es un par G = (V, U ), donde V


es un conjunto finito cuyos elementos i ∈ V se denominan nodos o vértices, y
U ⊂ V × V es el subconjunto de arcos o pares ordenados de vértices.
Dado un arco u = (i, j) ∈ U , al vértice i ∈ V se le denomina extremo inicial
del arco y a j ∈ V extremo final. Un arco cuyos extremos coinciden se denomina
bucle.

En el ejemplo 2.1, los vértices son los aeropuertos

V = {m, l, p, f, s, t}

y los arcos son los vuelos directos entre aeropuertos

U = {(m, l); (m, p); (m, f ); (l, f ); (p, f ); (p, s); (p, t); (f, p); (f, s); (s, t)}

Los arcos de un digrafo especifican una relación no simétrica entre los vérti-
ces. Se introducen a continuación los siguientes conceptos:

Conjunto de sucesores del vértice i ∈ V

Γ+ (i) = {j ∈ V / (i, j) ∈ U }

Conjunto de predecesores del vértice i ∈ V

Γ− (i) = {j ∈ V / (j, i) ∈ U }

Conjunto de adyacentes del vértice i ∈ V

Γ(i) = Γ+ (i) ∪ Γ− (i)

En el ejemplo 2.1, se tienen los siguientes conjuntos:


Grafo, digrafo y multigrafo ORED 15

Γ+ (f ) = {p, s} Γ− (f ) = {m, l, p} Γ(f ) = {m, l, p, s}

Dos arcos son adyacentes cuando tienen un extremo común.

En el ejemplo 2.1, los arcos (l, f ) y (m, f ) son adyacentes, ası́ como los arcos
(p, s) y (s, t).

En relación con el número de arcos que inciden en un vértice, se introducen


los siguientes conceptos:

Semigrado exterior de un vértice i ∈ V

d+ (i) = card(Γ+ (i))

Semigrado interior de un vértice i ∈ V

d− (i) = card(Γ− (i))

Grado de un vértice i ∈ V

d(i) = d+ (i) + d− (i)

En el ejemplo 2.1:

d+ (f ) = 2 d− (f ) = 3 d(f ) = 5

Dado un vértice x ∈ V , se dice que es un vértice pendiente si verifica d(x) =


1.

Con el fin de distinguir los arcos que inciden en un subconjunto de vértices,


se introducen los siguientes conceptos:

Incidencia exterior de un conjunto A ⊂ V

w+ (A) = {u = (i, j) ∈ U / i ∈ A j 6∈ A}
ORED 16 Conceptos básicos

Incidencia interior de un conjunto A ⊂ V

w− (A) = {u = (i, j) ∈ U / i 6∈ A j ∈ A}

Incidencia de un conjunto A ⊂ V

w(A) = w+ (A) ∪ w− (A)

En el ejemplo 2.1:

w+ ({f, p}) = {(f, s); (p, s); (p, t)} w− ({f, p}) = {(m, f ); (m, p); (l, f )}

w({f, p}) = {(f, s); (p, s); (p, t); (m, f ); (m, p); (l, f )}

Los arcos de un digrafo relacionan de forma asimétrica los extremos del mis-
mo. En algunas situaciones, sin embargo, interesa representar relaciones binarias
simétricas. Para estos casos, se introduce el concepto de grafo.

Ejemplo 2.2. Una comunidad autónoma estudia las comunicaciones de una


comarca formada por cinco pueblos: a, b, c, d y e. La figura 2.2 representa los
pueblos y los tramos de carretera que los unen.

a c

b d

Figura 2.2: Grafo de carreteras del Ejemplo 2.2

Definición 2.2. Un grafo o grafo no dirigido es un par G = (V, E), donde V


es el conjunto de vértices y E ⊂ V × V es el conjunto de aristas, que es un
subconjunto de pares no ordenados de vértices.
Grafo, digrafo y multigrafo ORED 17

Los extremos de las aristas son indistinguibles, es decir, {i, j} = {j, i}.

En el ejemplo 2.2, el conjunto de vértices es

V = {a, b, c, d, e}

y el conjunto de aristas es

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

Para un grafo sólo tiene sentido definir los conjuntos Γ(i) y w(A), ası́ como
la función d(i) para cualquier vértice i ∈ V y subconjunto de vértices A ⊂ V .

En el ejemplo 2.2, se tienen:

Γ({b, c}) = {a, d, e} ⊂ V Γ({d, e}) = {b, c} ⊂ V

w({b, c, d}) = {{a, b}; {a, c}; {b, e}; {d, e}} ⊂ E d(b) = 4 d(a) = 2

Hasta ahora se ha supuesto que existe o no un arco o arista entre cada par de
vértices. En general, sin embargo, puede haber más de un arco o arista uniendo
dos vértices. Se introducen ası́ los siguientes conceptos

Definición 2.3. Un multidigrafo G = (V, U ) (o multigrafo G = (V, E) ) es un


digrafo (grafo) con al menos un arco (arista) repetido.

La multiplicidad de un arco o arista es el número de veces que se repite.


Dado un número entero positivo p, un p-digrafo (p-grafo) es un multidigrafo
(multigrafo) con al menos un arco (arista) con multiplicidad p y ninguno con
multiplicidad mayor.

La figura 2.3 representa un multigrafo con multiplicidad igual a 3.

A continuación, y dependiendo del conjunto de arcos o aristas que relacionan


los vértices, se introducen tres tipos de grafos o digrafos.
ORED 18 Conceptos básicos

Definición 2.4. Un grafo simple es un 1-grafo sin bucles. Análogamente se


define un digrafo simple.

Definición 2.5. Un grafo G = (V, E) es completo cuando verifica

{i, j} ∈ E ∀i, j ∈ V, i 6= j

Definición 2.6. Un digrafo G = (V, U ) es completo cuando verifica

(i, j) 6∈ U ⇒ (j, i) ∈ U

Definición 2.7. Un clan (en inglés clique) es un grafo simple G = (V, E)


verificando
{i, j} ∈ E ∀i 6= j ∈ V

Los grafos de los ejemplos 2.1 y 2.2 son simples, ninguno de ellos es com-
pleto.

La figura 2.4 ilustra algunos de estos tipos de grafos y digrafos.

2.2. Subconjuntos de grafos


A continuación se definen dos tipos de subconjuntos que se pueden definir a
partir de un grafo o digrafo.

Definición 2.8. Dado un digrafo (grafo) G = (V, U ) (G = (V, E)), a partir


de A ⊂ V se define el subgrafo generado por A como el digrafo (grafo) GA =

a b

c d

Figura 2.3: Multigrafo con multiplicidad 3


Subconjuntos de grafos ORED 19

b c
c
b c b
d

a d a a
d e
(a) (b) K4 (c) K5
Digraf o completo

Figura 2.4: Diversos tipos de grafos completos

(A, UA ) (GA = (A, EA )), donde

UA = {u ∈ U / u = (i, j), i, j ∈ A}

EA = {e ∈ E / e = {i, j}, i, j ∈ A}

Un subgrafo se define a partir de un subconjunto de vértices y los arcos o


aristas del grafo original que los unen.

Los subgrafos generados por los conjuntos {m, l, f, p} y {a, b, c} en el digrafo


del ejemplo 2.1 y en el grafo del ejemplo 2.2 se ilustran en la figura 2.5.

l f a c

m p b

Figura 2.5: Subgrafos de los ejemplos 2.1 y 2.2

Definición 2.9. Dado un digrafo (grafo) G = (V, U ) (G = (V, E)), a par-


tir de un subconjunto de arcos W ⊂ U (o de aristas F ⊂ E) se define el
grafo parcial generado por W (F ) como el digrafo (grafo) G(W ) = (V, W ) (G(F ) =
(V, F )).

A partir de un grafo, se define un grafo parcial eliminando un subconjunto


de aristas.

En la figura 2.6 se representan dos grafos parciales definidos a partir del


digrafo del ejemplo 2.1 y del grafo del ejemplo 2.2.
ORED 20 Conceptos básicos

De forma natural, se extiende el concepto de subgrafo parcial generado por


un subconjunto de vértices.

En determinadas situaciones interesa analizar la no existencia de relación


entre dos elementos. Si la relación viene definida por un subconjunto de arcos o
aristas, la no relación se identificará a partir del grafo complementario.

Definición 2.10. Dado un grafo G = (V, E), se define el grafo complementario


como el grafo cuyas aristas son las no incluidas en E, es decir Ḡ = (V, Ē).

{i, j} ∈ Ē ⇐⇒ {i, j} 6∈ E

La figura 2.7 representa el grafo complementario del grafo de carreteras del


ejemplo 2.2.

a c

l f s

b d

m p t e

Figura 2.6: Grafos parciales de los ejemplos 2.1 y 2.2

a c

b d

Figura 2.7: Grafo complementario del grafo de carreteras del Ejemplo 2.2
Conexión de grafos ORED 21

2.3. Conexión de grafos


Una propiedad que interesa estudiar en un grafo es la posibilidad de conectar
los vértices. Los vértices se conectan a partir de sucesiones de arcos o aristas.
Tiene sentido, pues, introducir las siguientes definiciones.

Definición 2.11. En un digrafo G = (V, U ), una cadena de longitud q, q ≥ 1,


es una sucesión de q arcos adyacentes

µ = (u1 , . . . , uq )

verificando:
(
uk tiene un extremo común con uk+1 ∀k = 1, . . . , q − 1

uk tiene un extremo común con uk−1 ∀k = 2, . . . , q

y siendo distintos cualquier par de arcos adyacentes.


Los extremos no ligados del primer arco u1 y del último arco uq , sean res-
pectivamente i ∈ V y j ∈ V , son los extremos de la cadena y se denota ésta por
µ[i, j].
En el caso en que q = 1, los extremos de la cadena son los extremos del arco.

En el digrafo del ejemplo 2.1 se definen las siguientes cadenas:

µ1 [m, p] = {(m, l); (l, f ); (p, f )} µ2 [p, t] = {(p, f ); (f, s); (s, t)}

µ3 [m, t] = {(m, p); (p, f ); (f, s); (p, s); (p, t)}

µ4 [l, t] = {(l, f ); (f, s); (p, s); (p, f ); (f, s); (s, t)}

En una cadena pueden estar orientados en sentido contrario los arcos. Para
el caso en que se exija que los arcos estén orientados en el mismo sentido, se
introduce la siguiente definición.

Definición 2.12. En un digrafo G = (V, U ), un camino es una cadena con


ORED 22 Conceptos básicos

todos los arcos orientados en el mismo sentido; es decir, el extremo final de uk


coincide con el extremo inicial de uk+1 para todo k = 1, . . . , q − 1.

La cadena µ2 [p, t] definida anteriormente es un camino

Una cadena o camino es elemental cuando no repite vértices. Se dice simple


si no repite arcos. Evidentemente, cualquier cadena elemental es simple; la im-
plicación inversa no es cierta.

La cadena µ3 [m, t] definida anteriormente es simple pero no elemental. La


cadena µ4 [l, t] no es simple ni elemental.

Definición 2.13. Un digrafo (grafo) es conexo si ∀i, j ∈ V existe una cadena


µ[i, j].

Hay que observar que las cadenas permiten que los arcos estén orientados
en sentido contrario; en el caso que se exija que los arcos estén orientados en el
mismo sentido de la cadena (camino), el concepto de conexión es más restrictivo,
y se introduce a continuación.

Definición 2.14. Un digrafo es fuertemente conexo si ∀i, j ∈ V existe un ca-


mino µ[i, j].

Un digrafo fuertemente conexo es conexo. La implicación inversa no es cierta.


En un grafo sólo tiene sentido el concepto de conexión.

Definición 2.15. Dado un vértice de un grafo o un digrafo, el subgrafo generado


por todos los vértices conectados a dicho vértice por cadenas se define como una
componente conexa del grafo.

El conjunto de componentes conexas de un grafo define una partición de


vértices en el sentido de pertenecer cada vértice a una única componente conexa.
Si el grafo es conexo, sólo existe una única componente conexa, que es el propio
grafo.

Las componentes conexas del grafo de la figura 2.8 son dos, identificada cada
una de ellas por los conjuntos de vértices {a, b, c, d} y {e, f, g}.

Tiene sentido estudiar cadenas y caminos cuyos extremos coinciden.


Conexión de grafos ORED 23

Definición 2.16. Un ciclo es una cadena simple cuyos extremos coinciden.

Un bucle es un ciclo con una única arista.


A continuación se proponen una serie de propiedades asociadas a los ciclos.

Proposición 2.1. Un grafo conexo con n = |V | > 1 sin vértices pendientes


tiene al menos un ciclo.

Demostración
Sea un vértice x1 ∈ V no pendiente. De x1 salen al menos dos aristas, sea el
grafo parcial G1 definido al eliminar una de estas aristas {x1 , x2 }.
De x2 sale otra arista de G1 , puesto que no hay vértices pendientes. Sea
{x2 , x3 } esta arista. Si x3 = x1 ya se ha encontrado el ciclo y termina la demos-
tración; en caso contrario, se elige otra arista que incida en x3 .
El proceso se repite hasta que la cadena simple de aristas

{{x1 , x2 }; {x2 , x3 }; · · · ; {xk , xk+1 }}

defina un ciclo con algún vértice visitado más de una vez.

A partir de esta proposición, se deduce la siguiente.

Proposición 2.2. Un grafo conexo con n > 1 vértices y sin ciclos tiene al
menos un vértice pendiente.

Definición 2.17. Un circuito es un camino y un ciclo simultáneamente.

c e

a d f

b g

Figura 2.8: Grafo no conexo


ORED 24 Conceptos básicos

El digrafo del ejemplo 2.1 tiene un circuito:

{(p, f ); (f, p)}

Se pueden definir varios ciclos, por ejemplo:

{(m, f ); (p, f ); (m, p)} {(p, f ); (f, s); (p, s)} {(m, f ); (f, s); (p, s); (m, p)}

En un grafo las definiciones son análogas, aunque no tiene sentido la distin-


ción entre cadena y camino y entre ciclo y circuito.

Proposición 2.3. Dado un grafo conexo, una arista e ∈ E pertenece a un ciclo


µ si y sólo si su eliminación no desconecta el grafo.
Capı́tulo 3
Representación de grafos

Una de las ventajas de la Teorı́a de Grafos al modelizar un problema es


la posibilidad de visualizar éste de forma que —en algunos casos sencillos— el
propio grafo identifica la solución.
Evidentemente, si el grafo es muy grande la representación del mismo no
aporta nada. Aún en el caso de grafos pequeños, puede la representación de
un grafo presentar problemas. En este sentido se estudian algunas propiedades
relativas a la representación geométrica de grafos en la sección de grafos planares.
Más importante que la representación geométrica de un grafo es la represen-
tación codificada de un grafo, que permitirá su manipulación en un ordenador.
En este sentido se introducirán dos representaciones matriciales, una vectorial
y una basada en la estructura de lista.

3.1. Representación geométrica. Grafo planar


Con el fin de facilitar la representación geométrica de un grafo, parece natural
exigir que las aristas no se corten salvo que sean adyacentes y lo hagan en el
extremo común.
Un grafo que tenga esta propiedad se dice que es un grafo planar.

Ejemplo 3.1. El clan de dimensión 4, K4 , es un grafo planar si se dibujan


convenientemente las aristas, según se puede observar en la figura 3.1.

Se concluye ası́ que el grafo K4 es planar. También son planares los grafos
K2 y K3 . El grafo K5 , sin embargo, no es planar. Obviamente, cualquier clan
Kn con n ≥ 5 no puede ser planar.
ORED 26 Representación de grafos

b c b c

a d d
(a) (b)

Figura 3.1: Representación no planar (a) y planar (b) del grafo completo K4

Möbius, durante una clase en 1840, presentó el siguiente problema en forma


de cuento: Habı́a un rey que tenı́a 5 hijos; en su testamento dejó escrito que a
su muerte se dividiera el reino en 5 regiones para que fueran asignadas a cada
uno de sus hijos, pero que tenı́an que tener todas ellas frontera con las otras
4 regiones. ¿Podrı́a cumplirse el testamento? . La respuesta a esta cuestión es
negativa, puesto que se tratarı́a de un grafo completo con 5 nodos, un K5 , que
no puede ser planar.
Otro tipo de grafos interesantes al analizar la planaridad son los grafos bi-
partitos completos, que se introducen a partir del siguiente ejemplo.

Ejemplo 3.2. ¿Se puede suministrar agua (A), gas (G) y electricidad (E) a
tres casas (C1 , C2 , C3 ) sin que se crucen las distintas conducciones?. Éste es un
acertijo que aparece en el libro de Dudeney [13].
La respuesta es negativa, se puede comprobar con la figura 3.2: si se intenta
modificar la situación de los distintos nodos, siempre queda la última arista que
corta alguna de las anteriores.

A C1

G C2

E C3

Figura 3.2: Representación no planar del grafo bipatito completo K3,3


Representación geométrica. Grafo planar ORED 27

Definición 3.1. Un grafo G = (V, E) se dice que es bipartito si el conjunto de


vértices V admite una partición

V = V1 ∪ V2 V1 ∩ V2 = ∅

de forma que todas las aristas tienen un extremo en V1 y el otro en V2 .

Definición 3.2. Un grafo bipartito completo es un grafo bipartito G = (V1 ∪


V2 , E) verificando

{v1 , v2 } ∈ E ∀v1 ∈ V1 , ∀v2 ∈ V2

Un grafo bipartito completo y simple verificando |V1 | = n1 y |V2 | = n2 se


denota por Kn1 ,n2 .

El grafo del ejemplo 3.2 es un grafo bipartito, V1 = {A, G, E} y V2 =


{C1 , C2 , C3 }, y completo K3,3 .

Considerando la operación anterior que permitı́a identificar el grafo K4 como


planar, se observa que hay operaciones que permiten construir grafos equivalen-
tes a efectos de la propiedad de planaridad. Tiene sentido introducir la siguiente
definición:

Definición 3.3. Dos grafos G1 y G2 son homeomórficos si uno de ellos se puede


obtener a partir del otro insertando o borrando vértices de grado 2.

El siguiente teorema, debido a Kuratowski [29], permite caracterizar la no


planaridad de un grafo con los grafos K5 y K3,3 identificados anteriormente
como grafos no planares.

Teorema 3.1. Un grafo es no planar ⇐⇒ contiene un grafo parcial homeomórfi-


co a K5 ó K3,3 .

Para ilustrar este teorema, que no se demuestra, se analiza el siguiente ejem-


plo.

Ejemplo 3.3. El grafo de Petersen, ver figura 3.3 es no planar, ya que es


contiene un grafo parcial homeomórfico a K3,3 , donde V1 = {j, a, d} y V2 =
{e, f, b}.
ORED 28 Representación de grafos

e j g b

i h

d c

Figura 3.3: Grafo de Petersen (no planar)

A partir del resultado anterior, se observa que un grafo con muchas aristas
es más difı́cil que sea planar que otro con menos aristas.

Una propiedad que tienen los grafos planares es la que se conoce como el
teorema de Euler:

Vértices + caras = aristas + 2

Para formalizar este resultado, se introduce el concepto de región, que sólo


tiene sentido en grafos planares.

Definición 3.4. Dado un grafo planar, se definen las regiones por las zonas del
plano donde se representa el grafo limitadas por aristas.
Siempre hay una región no acotada exterior al grafo.

Teorema 3.2. Dado un grafo G = (V, E) planar conexo con |V | = n vértices y


|E| = m aristas, si r es el número de regiones determinadas por G, incluida la
no acotada, se verifica la relación

n+r =m+2

Demostración
Se hará por inducción en m:

m=1
Hay dos opciones para un grafo planar conexo con 1 arista:

• Una arista cuyos extremos coinciden e = {1, 1}.


En este caso se verifica la relación al ser n = 1, m = 1 y r = 2
Representación geométrica. Grafo planar ORED 29

• Una arista con extremos distintos e = {1, 2}.


En este caso se verifica también la relación al ser n = 2, m = 1 y
r=1

Cierto el teorema para m = k


Un grafo con k aristas verifica n + r = k + 2.

¿m = k + 1?
Sea G = (V, E) el grafo con n vértices, k + 1 aristas y r regiones.
Hay dos posibilidades:

• G tiene un vértice pendiente: a ∈ V tal que d(a) = 1.


Sea Ga el subgrafo generado por V − {a}. Al ser a un vértice pen-
diente, Ga tiene n − 1 vértices, k aristas y mantiene el número de
regiones r.
Por consiguiente, por la hipótesis de inducción, se verifica

(n − 1) + r = k + 2

que es equivalente a

n + r = (k + 1) + 2

que es lo que se querı́a demostrar.


• G no tiene vértices pendientes:
En este caso, y recordando que cualquier grafo no trivial (n > 1)
sin vértices pendientes contiene al menos un ciclo µ ⊂ E, existe una
arista {a, b} ∈ µ y que, por tanto, cierra una región finita cuyos
bordes son las aristas del ciclo.
Sea Ga,b el grafo parcial obtenido al eliminar la arista {a, b}. Al dis-
minuir en 1 el número de regiones de Ga,b y tener k aristas, por la
hipótesis de inducción, se verifica

n + (r − 1) = k + 2
ORED 30 Representación de grafos

que es equivalente a

n + r = (k + 1) + 2

que es lo que se querı́a demostrar.

A partir de este teorema se deduce un corolario que permite concretar el


resultado citado sobre la no planaridad de grafos con muchas aristas.

Corolario 3.1. Si G = (V, E) es un grafo planar conexo y simple (1-grafo sin


bucles) con |V | = n vértices, |E| = m ≥ 2 aristas y r regiones, se verifica
entonces que
3r ≤ 2m m ≤ 3n − 6

Demostración
Al no tener bucles y ser un 1-grafo, la frontera de cualquier región —incluida
la no acotada— tiene al menos 3 aristas. Se excluyen aquı́ los casos m = 0 y
m = 1.
Si se denomina inc al número de incidencias región-arista, se contabiliza ası́
el número de contactos entre cada arista y la región que ésta delimita.
Por una parte, cada arista aporta 2 incidencias, por lo que

inc = 2 m

Puede darse el caso en que las dos incidencias de una arista se produzcan en la
misma región.
Por otro lado, cada región tiene al menos tres contactos con aristas, inde-
pendientemente del número de regiones. En el caso lı́mite, una región (acotada)
tiene tres incidencias al estar acotada por tres aristas, que es el número mı́nimo
de aristas que pueden cerrar una región, puesto que una región cerrada con dos
aristas serı́a un 2-grafo. Se tiene ası́ que

inc ≥ 3r

En consecuencia,
3r ≤ 2m
Representaciones matriciales de un grafo ORED 31

Por el teorema de Euler, se concluye que

n + r = m + 2 ⇐⇒ r = m − n + 2 ⇐⇒ 3r = 3(m − n + 2)

y, por consiguiente,

3m − 3n + 6 ≤ 2m ⇐⇒ m ≤ 3n − 6

Al aportar una condición necesaria de planaridad, este corolario permite


identificar algunos grafos no planares; es el caso, por ejemplo, del grafo K5 , que
es simple y conexo y no verifica una de las dos condiciones al tener 10 aristas y
5 vértices:
10 > 3 × 5 − 6 = 9

En otros casos, sin embargo, puede no concluirse nada con el corolario; es el


caso del grafo K3,3 , que no es planar verificando las dos condiciones del corolario.

3.2. Representaciones matriciales de un grafo


A continuación se estudian dos representaciones matriciales para grafos y di-
grafos. Posteriormente se introducirá una representación vectorial que consume
menos memoria pero necesita más tiempo de cálculo. Todas ellas son equiva-
lentes en el sentido de caracterizar perfectamente el correspondiente grafo o
digrafo.
Se trabajará con grafos simples, es decir, sin bucles y no existiendo más
de un arco o arista entre dos vértices. No obstante, es sencillo generalizar las
correspondientes definiciones.

3.2.1. Matriz de incidencia


La matriz de incidencia, de dimensión n × m identifica los vértices (filas) que
son los extremos del arco o arista (columnas).
La definición de la matriz distingue el digrafo del grafo.
ORED 32 Representación de grafos

Digrafo
Definición 3.5. Dado un digrafo G = (V, U ) con n vértices y m arcos, se
define la matriz de incidencia como la matriz A = (aik ) con i ∈ {1, . . . , n} y
k ∈ {1, . . . , m} verificando



 1 uk = (i, ∗) ∈ U
aik = −1 uk = (∗, i) ∈ U


 0 en otro caso
Inversamente, dada la matriz de incidencia A, el número de vértices n es el
número de filas de A y el número de arcos es el número de columnas. El extremo
inicial del arco k-ésimo, con k ∈ {1, . . . , m}, es el ı́ndice de la fila donde en la
columna k-ésima de A hay un 1. El extremo final del arco k-ésimo es el ı́ndice
de fila donde en la columna k-ésima hay un −1.

La matriz de incidencia del digrafo del ejemplo 2.1 del capı́tulo 2 es, consi-
derando la ordenación de vértices (M, L, F, P, S, T ):
 
1 1 1 0 0 0 0 0 0 0
 −1
 
0 0 1 0 0 0 0 0 0
 
 0 −1 0 −1 1 1 −1 0 0 0 
A=
 

 0
 0 −1 0 −1 0 1 1 1 0 

 0 0 0 0 0 −1 0 −1 0 1 
 

0 0 0 0 0 0 0 0 −1 −1

Grafo
Para grafos, no se distingue entre el extremo inicial y el final.

Definición 3.6. Dado un grafo G = (V, E) con n vértices y m aristas, se


define la matriz de incidencia como la matriz A = (aik ) con i ∈ {1, . . . , n} y
k ∈ {1, . . . , m} verificando
(
1 ek = {i, ∗} ∈ E
aik =
0 en otro caso

La matriz de incidencia del grafo del ejemplo 2.2 del capı́tulo 2 es, conside-
rando la ordenación natural de vértices (A, B, C, D, E):
Representaciones matriciales de un grafo ORED 33

 
1 1 0 0 0 0 0
 
 1 0 1 1 1 0 0 
 
A= 0 1 1 0 0 1 0 
 
 
 0 0 0 1 0 1 1 
 
0 0 0 0 1 0 1

Considerando que los elementos de la matriz A toman los valores 0 ó 1, una


variable del tipo IN T EGER ∗ 1 serı́a suficiente para almacenarla. En el caso
en que n = 10000 y m = 30000, se necesitarı́a un total de

10000 · 30000 · 1 bytes = 3 · 108 bytes ' 300000 Kb = 300 M b

3.2.2. Matriz de adyacencia


La matriz de adyacencia, de dimensión n × n, identifica si existe un arco o
arista uniendo el extremo inicial (fila) con el extremo final (columna).

Digrafo
Definición 3.7. Dado un digrafo G = (V, U ) con n vértices y m arcos, se
define la matriz de adyacencia como la matriz B = (bij ) con i, j ∈ {1, . . . , n}
verificando
(
1 (i, j) ∈ U
bij =
0 (i, j) 6∈ U

La caracterización de un digrafo G = (V, U ) a partir de la matriz de adyacen-


cia es muy sencilla también, puesto que la matriz B es cuadrada y tiene tantas
filas y columnas como vértices el digrafo. Cada elemento no nulo de la matriz
bij = 1 identifica un arco del digrafo u = (i, j) ∈ U ; obviamente, el número de
arcos se determina según
n X
X n
m= bij
i=1 j=1
ORED 34 Representación de grafos

La matriz de adyacencia del digrafo del ejemplo 2.1 del capı́tulo 2 es, consi-
derando la ordenación de vértices (m, l, f, p, s, t):
 
0 1 1 1 0 0
 
 0 0 1 0 0 0 
 
 0 0 0 1 1 0 
B=
 


 0 0 1 0 1 1 

0 0 0 0 0 1 
 

0 0 0 0 0 0

De forma análoga al caso de la matriz de incidencia, en el caso de un digrafo


con parámetros n = 10000 y m = 30000, se necesitarı́a un total de

10000 · 10000 · 1 bytes = ·108 bytes ' 100000 Kb = 100 M b

Grafo
En el caso no dirigido, hay dos alternativas: trabajar con la matriz triangular
superior o inferior, considerando las aristas {i, j} ∈ E verificando i ≤ j o i ≥ j
respectivamente; o bien considerar la matriz simetrizada, que asocia a cada
arista {i, j} ∈ E dos elementos no nulos bij = bji = 1.

Considerando la matriz triangular superior, el grafo del ejemplo 2.2 del


capı́tulo 2 es, considerando la ordenación de vértices (a, b, c, d, e):
 
0 1 1 0 0
 

 0 1 1 1 

B= 0 1 0 
 
 

 0 1 

0

Para grafos de grandes dimensiones la representación matricial consume mu-


cha memoria en matrices muy poco densas, puesto que casi todos los elementos
son 0. Para resolver este problema, se presentan dos alternativas: la representa-
ción vectorial y la representación por lista de adyacencia.
Representación vectorial ORED 35

3.3. Representación vectorial


Digrafo
Una alternativa que ahorra memoria consiste en almacenar los digrafos en
dos vectores, uno de dimensión n + 1 y el otro de dimensión m. Este ahorro
se consigue ordenando previamente los arcos, primero por el extremo inicial y
luego por el final; en el caso en que los vértices no estén ordenados de forma
natural, es suficiente con indicar explı́citamente dicho orden.
La determinación de estos vectores se basa en la ordenación de vértices y
arcos según:

G = (V, U ) = ({1, . . . , n}; {u1 = (i1 , j1 ), . . . , um = (im , jm )})

donde

i1 ≤ i2 ≤ · · · ≤ im ik ∈ {1, . . . , n} ∀k ∈ {1, . . . , m}

jk ≤ jk+1 ∀k ∈ {{1, . . . , m} / ik = ik+1 }

La interpretación de los vectores

α : {1, . . . , n + 1} −→ {1, . . . , m + 1}

y
β : {1, . . . , m} −→ {1, . . . , n}

es la siguiente:

1. β(k) es el extremo final del arco k-ésimo, con k ∈ {1, . . . , m}:

β(k) = jk ∈ {1, . . . , n} ∀k ∈ {1, . . . , m}

2. Los arcos que salen del vértice i ∈ {1, . . . , n} son los arcos α(i)-ésimo,
α(i) + 1-ésimo, . . . ,α(i + 1) − 1-ésimo. En el caso en que no salga ningún
arco del vértice i, se verifica que α(i) = α(i + 1).
ORED 36 Representación de grafos

El vector α, se obtiene a partir del siguiente procedimiento:


α(n + 1) = m + 1
do i = n, 1, −1
α(i) = α(i + 1) − d+ (i)
enddo

Inversamente, dados el número de vértices n y los vectores α y β, el conjunto


de vértices es V = {1, 2, . . . , n}, el número de arcos se identifica como m =
α(n + 1) − 1, y los arcos

U = {u1 = (i1 , j1 ), . . . , um = (im , jm )}

del digrafo G = (V = {1, . . . , n}, U ) se determinan por el procedimiento siguien-


te:

1. El extremo final del arco k-ésimo, con k ∈ {1, . . . , m}:

jk = β(k)

2. El extremo inicial del arco k-ésimo, con k ∈ {1, . . . , m}:

ik = máx{i ∈ {1, . . . , n} / α(i) ≤ k}

Considerando un digrafo con 10000 vértices y 30000 arcos, los vectores α y β


podrı́an guardarse en variables del tipo IN T EGER ∗ 2, que puede tomar como
valor máximo 32767. Se necesitarı́an, pues:

(10001 + 30000) ∗ 2 bytes = 80002 bytes ' 80 Kb

La representación vectorial del digrafo del ejemplo 2.1 del capı́tulo 2 se basa
en la ordenación de los vértices (m, l, f, p, s, t) y la correspondiente ordenación
de arcos. El vector β tomarı́a los siguientes valores:
Representación vectorial ORED 37

arco j β(j)
(m, l) 1 l
(m, f ) 2 f
(m, p) 3 p
(l, f ) 4 f
(f, p) 5 p
(f, s) 6 s
(p, f ) 7 f
(p, s) 8 s
(p, t) 9 t
(s, t) 10 t

El vector α se determina por el procedimiento descrito previamente para


obtener:

α(t + 1) = 11
α(t) = 11
α(s) = 10
α(p) = 7
α(f ) = 5
α(l) = 4
α(m) = 1

Grafo
En el caso de grafos, al igual que con la matriz de adyacencia, se puede
considerar un solo sentido de las aristas —matriz triangular— o considerar los
dos sentidos —matriz simétrica— considerando doble número de aristas de las
originales.

En el ejemplo 2.2, considerando sólo un sentido, se tiene la siguiente repre-


sentación del grafo:
ORED 38 Representación de grafos

arista j β(j)
{a, b} 1 b
{a, c} 2 c
{b, c} 3 c
{b, d} 4 d
{b, e} 5 e
{c, d} 6 d
{d, e} 7 e

El vector α serı́a en este grafo:

α(e + 1) = 8
α(e) = 8
α(d) = 7
α(c) = 6
α(b) = 3
α(a) = 1

3.4. Representación por lista de adyacencia


Consistirı́a en guardar para cada vértice una lista de los sucesores —en el
caso de digrafos— o vértices adyacentes —en el caso de grafos.
A diferencia de las matrices y vectores anteriores, que necesitan dimensio-
narse previamente, lo que se consigue con una cota superior de los parámetros m
y n, el almacenamiento dinámico de memoria a partir de la lista de adyacencia
permite reservar exactamente la memoria que necesita cada grafo o digrafo en
cuestión.

Una representación de los ejemplos de referencia serı́a la siguiente:


Para el digrafo:
Representación por lista de adyacencia ORED 39


m → l → f → p

l → f

f → p → s

p → f → s → t

s → t

t

Y para el grafo:


a → b → c

b → a → c → d → e

a → a → b → d

d → b → c → e

e → b → d
ORED 40 Representación de grafos
Capı́tulo 4
Conexión en grafos

En el problema de los puentes de Königsberg se suponı́a que el paseante


podı́a ir desde cualquier punto de la ciudad a cualquier otro. En términos de
grafos, esta condición implica la conexión del grafo.
En este capı́tulo se estudian dos algoritmos de conexión de grafos, que veri-
fican si un grafo dado es conexo y, en caso contrario, identifican los vértices que
no pueden ser unidos mediante cadenas al resto de los vértices. Los subgrafos
inducidos por estos conjuntos de vértices se denominan componentes conexas
del grafo.
El número de conectividad de un grafo es el número de componentes conexas
de un grafo. Obviamente, el número de conectividad de un grafo conexo es 1.
El primer algoritmo que se estudia está basado en una idea de Trémaux (1859
- 1882) y ha sido revisado por Tarjan (1972). Es un algoritmo de complejidad
lineal en el número de aristas del grafo y pertenece a un tipo de algoritmos muy
eficientes en diversos ámbitos de la computación: son los denominados Depth-
first search o DF S por sus iniciales en inglés.
Este tipo de algoritmos es conocido desde el sXIX; en concreto, ver el infor-
me de Lucas [26] sobre el citado trabajo de Trémaux, o el trabajo de Tarry [38].
Estos trabajos fueron actualizados por Hopcroft y Tarjan [24] y el citado de
Tarjan [37]. La aplicación del algoritmo de Trémaux-Tarjan construye una es-
tructura que se verá más adelante: un árbol soporte, que se denominará el árbol
de Trémaux.
Posteriormente se introducirá un algoritmo basado en la matriz de adyacen-
cia y es de complejidad polinomial en el número de vértices del grafo.
ORED 42 Conexión en grafos

4.1. Fijando el vértice inicial. Algoritmo de Trémaux-


Tarjan
La idea básica del algoritmo es la siguiente: avanzar por el grafo alejándose
del vértice inicial escogido y marcando vértices y aristas según se van visitando;
cuando no sea posible avanzar más, se retrocede para, en cuanto sea posible,
volver a avanzar hacia adelante por aristas no visitadas; el algoritmo termina
cuando se llega al vértice inicial sin poder avanzar hacia adelante.
Este esquema de movimiento en profundidad, da prioridad al avance por el
grafo alejándose al máximo del vértice inicial hasta llegar al lı́mite.
El algoritmo vale para grafos y digrafos. En ambos casos, Γ(i) es el conjunto
de vértices adyacentes al vértice i ∈ V por medio de un arco o arista. Para
evitar movimientos repetidos, se identifica el k-ésimo sucesor del vértice i por
Γk (i), con k ∈ {1, . . . , d(i)}, siendo d(i) el grado del vértice i-ésimo.
El movimiento por el grafo debe explorar todas las aristas o arcos sin repetir
ninguno, por esta razón se introducen las siguientes variables de control del
algoritmo:

nvis es el número de vértices visitados.


El grafo será conexo si al terminar el algoritmo nvis = n y no lo será si
nvis < n.

(p(i), i ∈ V )
p(i) ∈ V es el vértice desde el que se visita al vértice i. Si l ∈ V es el
primer vértice visitado, p(l) = l 6= 0.
Inicialmente, p(i) = 0 ∀i ∈ V .

nson(i) es el número de aristas incidentes en i que han sido sondeadas.

El algoritmo 4.1, que se detalla a continuación, termina cuando se llega al


vértice inicial h ∈ V seleccionado inicialmente y se han visitado todos los vértices
adyacentes nson(i) = d(i) ∀i ∈ V .

Se puede comprobar que el algoritmo tiene complejidad O(m).


Fijando el vértice inicial. Algoritmo de Trémaux-Tarjan ORED 43

Algoritmo 4.1: [nvis, p] = ConexT remauxT arjan(h, Γ)


Entrada:
h Vértice inicial
Γ Grafo, Γj (i) es el vértice adyacente j-ésimo del nodo i ∈ {1, 2, . . . , n},
j ∈ {1, 2, . . . , dG (i)}
Salida:
nvis Número de vértices accesibles desde h
p(i) 6= 0 identifica el vértice anterior a i por la cadena que sale de h,
p(i) = 0, si el vértice i no es accesible desde h.
Inicialización:
p(i) = 0; nson(i) = 0 ∀i = 1, . . . , n nson(i) es el nro. de aristas
incidentes en i visitadas.
Vértice inicial h ∈ V : p(h) = h
i=h
nvis = 1
Proceso de actualización:
loop
if nson(i) < d(i) then
Hay aristas no sondeadas saliendo de i. ADELANTE
nson(i) = nson(i) + 1
j = Γnson(i) (i) Se selecciona el nodo adyacente j
if p(j) = 0 then
El nodo j no ha sido visitado y se visita.
p(j) = i
i=j
nvis = nvis + 1
end if
else
Todas las aristas que salen de i han sido sondeadas. ATRÁS
if i = h then
Al ir hacia atrás se ha llegado al vértice inicial.
if nvis = n then
Se han visitado todos los nodos.
return Grafo conexo
else
No se han visitado todos los nodos.
return Grafo no conexo
end if
else
i = p(i) No se ha llegado al vértice inicial. Hacia atrás...
end if
end if
end loop
ORED 44 Conexión en grafos

Ejemplo 4.1. Sea el grafo con 4 vértices y 4 aristas cuya matriz de incidencia
es la matriz:  
1 0 0 0
 
 1 1 1 0 
A=
 0

 1 0 1 

0 0 1 1

y su representación es la de la figura 4.1:

1 2

4 3

Figura 4.1: Grafo asociado al Ejemplo 4.1

Los conjuntos de vértices adyacentes —según la notación del algoritmo de


Trémaux-Tarjan— son:
Γ1 (1) = 2
Γ1 (2) = 1 Γ2 (2) = 3 Γ3 (2) = 4
Γ1 (3) = 2 Γ2 (3) = 4
Γ1 (4) = 2 Γ2 (4) = 3
El desarrollo del algoritmo se controla con los escalares nvis, i y j, y los
vectores nson y p.

1. Inicialización.
Los vectores nson, orden y p se inicializan a 0. Se evalúa el grado de cada
vértice: d(1) = 1, d(2) = 3, d(3) = 2, d(4) = 2.
Se elige como vértice inicial h = 1. Por consiguiente, p(1) = 1, i = 1 y
nvis = 1.

nson() p()
1 0 1
nvis = 1 2 0 0
3 0 0
4 0 0
Fijando el vértice inicial. Algoritmo de Trémaux-Tarjan ORED 45

2. Exploración(1).
Al ser nson(1) = 0 < d(1) = 1, nson(1) = 1 y j = Γ1 (1) = 2. Al ser
p(2) = 0, p(2) = 1, i = 2 y nvis = 2:

nson() p()
1 1 1
nvis = 2 2 0 1
3 0 0
4 0 0

3. Exploración(2).
Al ser nson(2) = 0 < d(2) = 3, se actualiza nson(2) = 1 y se elige
j = Γ1 (2) = 1. Al ser p(1) > 0, no se realizan más operaciones, quedando

nson() p()
1 1 1
nvis = 2 2 1 1
3 0 0
4 0 0

y se repite la exploración del vértice 2.

4. Exploración(2).
Ahora, nson(2) = 1 < d(2) = 3, se actualiza nson(2) = 2 y se elige
j = Γ2 (2) = 3. Al ser p(3) = 0, se visita otro vértice:

nson() p()
1 1 1
nvis = 3 2 2 1
3 0 2
4 0 0

5. Exploración(3).
ORED 46 Conexión en grafos

nson() p()
1 1 1
nvis = 3 2 2 1
3 1 2
4 0 0

6. Exploración(3).

nson() p()
1 1 1
nvis = 4 2 2 1
3 2 2
4 0 3

7. Exploración(4).

nson() p()
1 1 1
nvis = 4 2 2 1
3 2 2
4 1 3

8. Exploración(4).

nson() p()
1 1 1
nvis = 4 2 2 1
3 2 2
4 2 3

9. Exploración(4).
Al ser nson(4) = 2 = d(4), se mueve uno hacia atrás con la asignación
i = p(i), de forma que sólo se modifica el vértice a explorar i = 3:

10. Exploración(3).
Análogamente a la iteración anterior, i = p(3) = 2.
Fijando el vértice inicial. Algoritmo de Trémaux-Tarjan ORED 47

11. Exploración(2).
Desde este vértice, sólo queda ir por la tercera arista, nson(2) = 3, pero
al ser p(3) > 0, se vuelve a explorar el vértice 2:

nson() p()
1 1 1
nvis = 4 2 3 1
3 2 2
4 2 3

12. Exploración(2).
Se va hacia atrás, i = p(2) = 1.

13. Exploración(1).
Al ser nson(1) = d(1) = 1, y coincidir i = h = 1, se ha recorrido todo el
grafo. Al ser nvis = n = 4, se concluye que el grafo es conexo.

Observación 4.1. En el caso en que el grafo no sea conexo, el algoritmo se


puede utilizar para identificar las componentes conexas identificando primero los
vértices conectados al vértice inicial h, posteriormente se inicializa el algoritmo
con otro vértice inicial no visitado, y ası́ sucesivamente.

4.1.1. Conexión fuerte


Para ver si un digrafo es fuertemente conexo, se puede utilizar el algoritmo
de Trémaux-Tarjan con las siguientes modificaciones:

Sustituir Γ(i) por Γ+ (i) para determinar los sucesores de cada vértice
i ∈ V . Se obligan ası́ los movimientos por los arcos sólo en el sentido
apropiado.

Para ver si el grafo es fuertemente conexo, hay que recorrer con el vértice
inicial h todo el conjunto V para ver si existe un camino entre h y cualquier
otro vértice del digrafo.
ORED 48 Conexión en grafos

4.1.2. Determinación de cadenas y caminos


El algoritmo de Trémaux-Tarjan permite identificar una cadena que une dos
vértices genéricos x, y ∈ V . El procedimiento es el siguiente:

1. Identificar uno de los vértices como vértice inicial, por ejemplo, x.

2. Aplicar el algoritmo de Trémaux-Tarjan.

3. Hay dos opciones:

p(y) = 0, en este caso, no existe ninguna cadena µ[x, y].


p(y) 6= 0, en este caso, se ha identificado una cadena µ[x, y] aplicando
sistemáticamente el vector p(.) desde el vértice y hasta encontrar el
vértice x:

y − p(y) − p(p(y)) − . . . − p(· · · p(y) · · · ) = x

Hay que observar que el procedimiento anterior no exige que el grafo sea
conexo.

Análogamente, a partir de lo comentado en la subsección 4.1.1, se puede


utilizar el algoritmo para identificar un camino entre dos vértices.

4.2. Conexión desde cualquier vértice. Algoritmo ma-


tricial
Para ver si desde cualquier vértice se puede conectar por cadenas (o caminos)
el resto del grafo, se puede utilizar otro algoritmo diferente, en lugar de ir varian-
do el vértice inicial h ∈ V , como se harı́a con el Algoritmo de Trémaux-Tarjan.
Se introducirá ası́ el algoritmo matricial, basado en la matriz de adyacencia.
Fue Shimbel [35] en 1951 quien primero estudió esta propiedad matricial para
analizar la conexión en 2, 3, ... arcos entre dos vértices.
Sea el digrafo G = (V, U ) con matriz de adyacencia B = (bij )i,j=1,...,n . Se
observa que el producto matricial ordinario

B 2 = B × B = (b2ij )i,j=1,...,n

que identifica cada uno de sus elementos


Conexión desde cualquier vértice. Algoritmo matricial ORED 49

n
X
b2ij = bik bkj
k=1

tiene la siguiente propiedad:

b2ij 6= 0 ⇐⇒ existe un camino de longitud 2 entre i y j

Las sucesivas potencias de B: B 2 , B 3 , . . ., permiten analizar la existencia de


caminos con 2, 3, . . . arcos. Si se trabaja con las potencias sucesivas de (I + B)k
se puede identificar en cada uno de sus elementos si existe el correspondiente
camino con k o menos arcos.

B̄ k ≡ (I + B)k ∀k = 1, 2, . . .

y concluir el siguiente resultado

Proposición 4.1. Un digrafo es fuertemente conexo si y sólo si cada uno de


los elementos b̄n−1
ij de la matriz B̄ n−1 definida anteriormente es distinto de 0.

Ejemplo 4.2. Sea el digrafo con 4 vértices y 3 arcos cuya matriz de incidencia
es  
1 0 0
 
 0 −1 1 
A=
 −1

 1 0 

0 0 −1

La matriz de adyacencia del digrafo es


 
0 0 1 0
 
 0 0 0 1 
B=
 0

 1 0 0 

0 0 0 0

Las sucesivas potencias de B̄ k = (I + B)k , son:


 
1 0 1 0
 
 0 1 0 1 
B̄ = I + B = 
 0

 1 1 0 

0 0 0 1
ORED 50 Conexión en grafos

 
1 1 2 0
 
2
 0 1 0 2 
B̄ = 
 0

 2 1 1 

0 0 0 1

La interpretación de B̄ 2 es la siguiente: Un 0 indica que no existe un camino


con 0, 1 ó 2 arcos que una el vértice asociado a la fila con el vértice asociado
a la columna; por ejemplo, (1, 4). Por otro lado, un valor distinto de 0, indica
que existe al menos un camino cuyos extremos son el vértice fila y el vértice
columna respectivamente; por ejemplo, (1, 2).
 
1 3 3 1
 
3
 0 1 0 3 
B̄ = 
 0

 3 1 3 

0 0 0 1

Se concluye ası́ que este digrafo no es fuertemente conexo.

Para ver si un digrafo es conexo, la matriz B de adyacencia se simetriza a


partir de la siguiente operación

b0ij = máx{bij , bji } ∀i, j ∈ {1, . . . , n}

de forma que el digrafo con matriz de adyacencia B es conexo si y sólo si


el digrafo —realmente es ahora un grafo— con matriz de adyacencia B 0 es
fuertemente conexo.

El digrafo del ejemplo 4.2 sı́ es conexo, ya que la matriz simetrizada es:
 
0 0 1 0
 
 0 0 1 1 
B0 = 
 1

 1 0 0 

0 1 0 0

Las sucesivas potencias de (I + B 0 )k son:


Conexión desde cualquier vértice. Algoritmo matricial ORED 51

 
1 0 1 0
 
0
 0 1 1 1 
(I + B ) = 
 1

 1 1 0 

0 1 0 1
 
2 1 2 0
 
0 2
 1 3 2 2 
(I + B ) = 
 2

 2 3 1 

0 2 1 2
 
4 3 5 1
 
0 3
 3 7 6 5 
(I + B ) = 
 5

 6 7 3 

1 5 3 4

Por consiguiente, este digrafo es conexo.

Este último resultado indica las condiciones bajo las cuales se garantiza que
un digrafo es conexo cuando al simetrizar su matriz de adyacencia se verifica la
proposión 4.1.

4.2.1. Algoritmo identificando los caminos entre cualquier par


de vértices (*)
A continuación se detalla una versión más precisa del algoritmo matricial, al-
goritmo 4.2, que permite identificar los caminos (cadenas al simetrizar la matriz
de adyacencia) que unen cualquier par de vértices. Para ello hay que extender el
vector p que identifica el camino saliendo desde un vértice inicial (fijo) h a la ma-
triz P, que identifica en cada fila i ∈ {1, 2, . . . , n} el vector (Pi,1 , Pi,2 , . . . , Pi,n )
asociado a los caminos que parten del vértice i como inicial.

La complejidad del algoritmo 4.2 es O(n4 ). Esta complejidad se obtiene


al considerar que cada producto matricial tiene complejidad O(n3 ) y hay que
realizar n − 1 productos.
No obstante, existe una simplificación que disminuye la complejidad. Se basa
k
en obtener las potencias B 2 , B 4 , . . . , B 2 , . . . hasta superar o igualar el exponente
ORED 52 Conexión en grafos

Algoritmo 4.2: [K, P] = ConexM atricial(B)


Entrada:
B Matriz de adyacencia del Digrafo G
Salida:
Ki,j = 1 si existe un camino µ[i, j] uniendo i y j
Ki,j = 0 si no existe tal camino
Pi,j = k el último arco del camino µ[i, j] es (k, j)
Inicialización:
Pi,j = i ∀i, j = 1, . . . , n
K = B + I {Ki,j = 1 si existe un camino uniendo i y j con 0 ó 1
arcos }
Proceso:
for k=2,n-1 do
{Se evalúa la potencia k-ésima de B + I }
C=K
for i = 1, . . . , n do
for j = 1, . . . , n do
h=1
{Se busca un camino con k arcos uniendo i y j a través de h
}
while Ci,j = 0 ∧ h ≤ n do
if Ki,h + Bh,j = 2 then
{Existe tal camino y el último arco es (h, j) }
Ci,j = 1
Pi,j = h
else
h=h+1
end if
end while
end for
end for
K=C
end for
if Ki,j = 1 i, j ∈ {1, 2, . . . , n} then
Existe el camino µ[i, j] : i → · · · → Pi,Pi,Pi,j → Pi,Pi,j → Pi,j → j
else
No existe dicho camino uniendo i con j
end if

al valor n − 1. En el algoritmo 4.2 habrı́a que sustituir la operación K ∗ B por


K ∗ K en el bucle más interior (asociado al ı́ndice h).
Conexión desde cualquier vértice. Algoritmo matricial ORED 53

Se necesitan ası́ kn productos matriciales donde kn verifica

kn = mı́n{k / 2k ≥ n − 1}

de forma que se repetirá un número de veces kn que es una función logarı́tmica de


n, y, por consiguiente, la complejidad algorı́tmica de esta variante es O(n3 ln(n)).
Con esta variación, la identificación de la matriz P es más compleja y habrı́a
que adaptarla.
ORED 54 Conexión en grafos
Capı́tulo 5
Árbol

En este capı́tulo se introduce el concepto de árbol con sus diversas caracte-


rizaciones.
La estructura de árbol permite optimizar la gestión de datos; es el caso de la
estructura de pila, basada en un árbol binario, que permitirá la ordenación más
eficiente —desde el punto de vista computacional— de una serie de números.
Se introduce ası́ el algoritmo de Heapsort. Este algoritmo se basa en la misma
estructura de árboles binarios que el algoritmo Quicksort, uno de los 10 mejores
algoritmos del sXX, ver Cipra [10].
Cada árbol incluido en un grafo conexo se denomina árbol soporte. Termina
el capı́tulo con el estudio algebraico de los ciclos y cociclos de un grafo conexo
a partir de un árbol soporte. Este estudio algebraico puede estudiarse con más
detalle en el libro de Berge [1].

5.1. Árbol. Definición y caracterizaciones


En el lenguaje cotidiano, se utiliza el concepto de árbol para identificar
una estructura concreta; es el caso, por ejemplo, de un árbol de decisión o de
un árbol de clasificación. Esta estructura está asociada a un tipo especial de
grafos, aquéllos que, por un lado, son conexos, lo que se refleja en que todas
las decisiones están enlazadas en el árbol de decisión y que todos los animales
están incluidos en las correspondientes especies y subespecies; y, por otro lado,
son grafos que no tienen ciclos, para evitar que la secuencia de decisiones esté
mal definida o que un animal esté doblemente clasificado.
ORED 56 Árbol

Formalmente, se introduce el concepto de árbol.

Definición 5.1. Un árbol es un grafo conexo sin ciclos.

Ejemplo 5.1. El grafo de 5 vértices y 4 aristas, con matriz de incidencia:


 
1 0 0 0
 
 0 1 0 0 
 
A= 1 1 1 0 
 
 
 0 0 1 1 
 
0 0 0 1

es un árbol.

Teorema 5.1. Las cuatro siguientes propiedades de un grafo G = (V, E) son


equivalentes:

1. G es un árbol

2. G no tiene ciclos y si se añade una arista se forma un único ciclo

3. ∀x, y ∈ V con x 6= y, existe una única cadena simple µ[x, y]

4. G es conexo y si se quita una arista deja de serlo

Demostración

1 =⇒ 2
Sean dos vértices x, y ∈ V tales que {x, y} 6∈ E, hay dos opciones al añadir
la arista {x, y} :

• x = y, entonces el ciclo formado serı́a el bucle {x, x}.


• x 6= y, en este caso, al ser G conexo, existe una cadena µ[x, y] ⊂ E.
El ciclo formado serı́a µ[x, y] ∪ {x, y}. Este ciclo, además, es único
(salvo cambio de sentido) ya que si hubiera más de un ciclo implicarı́a
la existencia de un ciclo en el grafo original G.

2 =⇒ 3
Sean x, y ∈ V , entonces existe una única cadena µ[x, y] ⊂ E puesto que
en caso contrario, hay dos posibilidades exhaustivas y excluyentes:
Árbol. Definición y caracterizaciones ORED 57

• No existe ninguna cadena uniendo x e y en G.


Al añadir la arista {x, y} no se forma ningún ciclo y se contradirı́a la
hipótesis de partida.
• Existe más de una cadena uniendo x e y en G.
Sean µ1 [x, y] y µ2 [x, y] dos cadenas diferentes. Como los extremos
coinciden, si son distintas definen un ciclo en G y se contradice tam-
bién la hipótesis de partida.

3 =⇒ 4
Al estar unidos cualquier par de vértices por una cadena, el grafo G es
conexo. Si al quitar una arista e = {x, y} ∈ E el grafo fuera conexo es
porque existe una cadena uniendo x e y que no utiliza la arista e. Esta
cadena y la propia arista serı́an dos cadenas distintas y se contradirı́a la
hipótesis de partida.

4 =⇒ 1
Para ver que G es árbol sólo hay que demostrar que no tiene ciclos, y
esto es cierto, puesto que si tuviera un ciclo, quitando una arista seguirı́a
siendo conexo, lo que contradice la hipótesis de partida.

Es fácil comprobar en el ejemplo 5.1 que son ciertas las caracterizaciones de


árbol del teorema 5.1.

Según este teorema, un árbol es un grafo crı́tico en el sentido de tener el


máximo número de aristas sin formar ciclos y el mı́nimo número de aristas siendo
conexo. El siguiente teorema de caracterización permite especificar exactamente
el número de aristas que debe tener un árbol.

Teorema 5.2. Las tres siguientes propiedades de un grafo G = (V, E), con
|V | = n, son equivalentes:

1. G es un árbol

2. G tiene n − 1 aristas y no tiene ciclos.

3. G tiene n − 1 aristas y es conexo


ORED 58 Árbol

Demostración

1 =⇒ 2
Se demuestra por inducción en n:

• n = 1.
Trivial, pues el grafo es el grafo formado por un único vértice.
• n = k − 1.
Se supone que un árbol de k − 1 vértices tiene k − 2 aristas.
• n = k.
Sea un grafo con k vértices. Por el teorema 5.1, al quitar una arista
deja de ser conexo y se tienen dos componentes conexas, cada una de
ellas con k1 y k2 vértices verificando 1 ≤ k1 , k2 ≤ k − 1 y k1 + k2 = k.
Cada componente conexa es un árbol con menos de k − 1 vértices,
por lo que al aplicar la hipótesis de inducción se tienen en cada una
de ellas k1 − 1 y k2 − 1 aristas para totalizar k1 − k2 − 2 = k − 2
aristas, que al añadir la arista que se eliminó al principio, da un total
de k − 1 aristas.

2 =⇒ 3
Se demuestra por inducción en n:

• n = 1.
Es trivial.
• n = k − 1.
Se supone que un grafo sin ciclos con k − 1 vértices y k − 2 aristas es
conexo.
• n = k.
Sea un grafo con k vértices, k − 1 aristas y sin ciclos.
Al no tener ciclos, existe un vértice x ∈ V pendiente. El subgrafo
generado por V − {x} tiene k − 1 vértices y no tiene ciclos; por lo que
al aplicar la hipótesis de inducción es conexo y, por consiguiente, el
grafo original G también lo es.
Representación vectorial de un árbol ORED 59

3 =⇒ 1
Hay que demostrar que un grafo conexo con n vértices y n − 1 aristas no
contiene ciclos. Si contuviera un ciclo, el grafo parcial que resulta al quitar
una arista del ciclo serı́a conexo y tendrı́a n vértices y n − 2 aristas.
La contradicción se ve en este grafo parcial, puesto que un grafo con n
vértices y n − 2 aristas nunca puede ser conexo.

En el ejemplo 5.1 se comprueba que m = 4 = n − 1.

Como consecuencia, un árbol es un grafo con n vértices que tiene dos de las
tres propiedades siguientes:

conexo

sin ciclos

n − 1 aristas

El número de árboles que se pueden construir con n vértices es nn−2 .

5.2. Representación vectorial de un árbol


Dadas las caracterı́sticas particulares de un árbol, es razonable pensar que
se pueda representar fácilmente. A diferencia de un grafo en general, un vector
de dimensión n permite identificar las n − 1 aristas del árbol.
Al ser conexo, el algoritmo de Trémaux-Tarjan recorrerá todos los vértices.
Se elige como vértice inicial un vértice arbitrario x0 ∈ V . El resto de los vértices
quedarán etiquetados por el vector p. Además, al no tener el árbol ciclos, todas
las aristas serán utilizadas para etiquetar con el vector p los vértices.
El vector p caracteriza el árbol, ya que el conjunto de aristas es

E = {{x, p(x)} / x ∈ V − {x0 }}

siendo x0 el vértice que verifica p(x0 ) = x0 .


Fijado el vértice x0 , el vector p es único; variando x0 se obtendrán diferentes
representaciones vectoriales del árbol.
ORED 60 Árbol

La no existencia de ciclos garantiza que el etiquetado de vértices es indepen-


diente del orden elegido al aplicar el algoritmo de Trémaux-Tarjan.

El vector p permite ordenar los vértices de un árbol en niveles: en el primer


nivel se situarı́a sólo el vértice x0 que verifica p(x0 ) = x0 :

V0 = {x0 }

El resto de los niveles se definen recurrentemente hasta llegar a un conjunto


vacı́o en el nivel h(T )-ésimo:

Vk = {x ∈ V / p(x) ∈ Vk−1 } k ∈ {1, . . . , h(T )}

Representando un árbol ordenando los niveles de izquierda a derecha

V0 V1 · · · Vh(T )

el vector permite moverse de derecha a izquierda.

En el ejemplo 5.1, considerando x0 = 1 como vértice inicial, se obtendrı́a,


al aplicar el algoritmo de Trémaux-Tarjan:

p(1) = 1 p(2) = 3 p(3) = 1 p(4) = 3 p(5) = 4

de forma que el conjunto de aristas es

E = {{2, 3}; {3, 1}; {4, 3}; {5, 4}; }

Si se elige como vértice inicial x0 = 5, se obtendrı́a como vector p:

p(1) = 3 p(2) = 3 p(3) = 4 p(4) = 5 p(5) = 5

5.3. Algoritmo Heapsort de ordenación de números


El concepto de árbol permite no sólo modelizar determinadas situaciones, es
útil también para almacenar de una forma eficiente la información al estructurar
la información de una forma ordenada. Con este fin se introduce un tipo especial
de árbol, el árbol binario. Con este tipo de árbol se introduce la estructura de
Algoritmo Heapsort de ordenación de números ORED 61

pila que permitirá el diseño de un algoritmo muy eficiente para reordenar un


conjunto de números, el algoritmo Heapsort. Para ver más detalles sobre este
algoritmo y otros de ordenación, ver el libro de Cormen y otros [?].

5.3.1. Árbol binario


Cualquier vértice x ∈ V de un árbol tiene definido un único vértice p(x) ∈ V .
Si se representa verticalmente el árbol en el sentido de situar en lo más alto el
nivel V0 , debajo el nivel V1 , y ası́ sucesivamente, se observa que el vector p
permite movimientos de abajo hacia arriba. Sin embargo, los movimientos en
sentido contrario son lentos computacionalmente hablando, puesto que cada mo-
vimiento implica —en el peor de los casos— recorrer todas las aristas incidentes
a un vértice para bajar por él.
En el caso en que se limite a dos el número de descendientes de cada vértice
de un árbol, por medio de dos vectores se pueden realizar movimientos de arriba
hacia abajo por el árbol. Esta es la idea de árbol binario.

Definición 5.2. Un árbol binario se define recurrentemente en el caso en que


no sea vacı́o —árbol nulo— a partir de tres conjuntos de vértices: el vértice raı́z
y dos árboles binarios enlazados con él, el árbol binario derecho y el izquierdo.
Cada uno de estos árboles binarios —que pueden ser vacı́os— se denominan
hijo izquierdo e hijo derecho del vértice raı́z, que es, a su vez, el padre de los
anteriores.

En la figura 5.1 se representa un árbol binario con 7 vértices

Los movimientos por un árbol binario son muy rápidos identificando el vector
p de dimensión n = |V | ya introducido previamente como el padre de cada
vértice y los vectores left y right, también de dimensión n, y que identifican
respectivamente el hijo izquierdo y derecho.
El vértice raı́z es aquél vértice r ∈ V que verifica p(r) = r.

El árbol binario anterior se caracteriza por:


ORED 62 Árbol

i p(i) lef t(i) right(i)


1 1 2 3
2 1 4 5
3 1 6 ∞
4 2 ∞ 7
5 2 ∞ ∞
6 3 ∞ ∞
7 4 ∞ ∞

El vértice raı́z es el vértice 1. Cuando un vértice i no tiene alguno de los


sucesores, se identifica lef t(i) = ∞ ó right(i) = ∞.

Definición 5.3. En la representación anterior, los vértices pendientes se deno-


minan hojas, en inglés leaf.

Las hojas del árbol binario anterior son 5, 6 y 7.

Definición 5.4. A partir de la representación anterior, se define la altura de


un vértice en un árbol binario como el máximo número de aristas hasta llegar
a una hoja al utilizar los vectores lef t o right.

2 3

4 5 6

Figura 5.1: Estructura de árbol


Algoritmo Heapsort de ordenación de números ORED 63

La altura del árbol binario T , denotada por h(T ), es la altura de su raı́z.

El siguiente procedimiento permite calcular la altura de los vértices:

1. La altura de las hojas es 0:


h(i) = 0 ∀i / lef t(i) > [Link] [Link](i) > n

2. Para el resto de vértices, la altura de un vértice es superior en una unidad


al máximo de las alturas de sus hijos:
h(j) = máx{h(lef t(j)); h(right(j))} + 1

Las alturas de los vértices del árbol binario de referencia son, respectivamen-
te, (3, 2, 1, 1, 0, 0, 0). La altura del árbol es 3.

5.3.2. Estructura de pila


A partir de un árbol binario, se puede almacenar un conjunto de datos
introduciendo la estructura de pila, en inglés heap.
Para ilustrar el concepto de pila, se introduce el siguiente ejemplo.

Ejemplo 5.2. Sea el conjunto de 10 datos:

(a(1), a(2), . . . , a(10)) = (35, 17, 23, 14, 15, 16, 9, 11, 7, 8)

Una representación alternativa a este vector es el siguiente árbol binario,


que distingue entre el ı́ndice i del nodo —dibujado fuera del cı́rculo— y el valor
a(i) del mismo —encerrado dentro del cı́rculo, ver figura 5.2.
El vértice raı́z es el vértice 1. Para i = 4, por ejemplo, se tiene que p(4) = 2,
lef t(4) = 8 y right(4) = 9.

Formalmente, se introduce el concepto de pila.

Definición 5.5. Una estructura de pila (binaria) es un vector a de dimensión


n guardado en un árbol binario de n vértices con las dos propiedades siguientes:

1. Los ı́ndices de los vértices i ∈ {1, 2, . . . , n} están ordenados de forma que:

a) La raı́z del árbol es el vértice de ı́ndice 1, p(1) = 1.


b) El resto de vértices i ∈ {2, . . . , n} verifican

p(i) = bi/2c
ORED 64 Árbol

c) Para todo i ∈ {1, 2, . . . , n}

lef t(i) = 2 · i right(i) = 2 · i + 1

Observación: si lef t(i) o right(i) es mayor que n, y con el fin de


explicitar que el vértice i no tiene el correspondiente sucesor, se puede
asignar el valor ∞.

2. La propiedad de la pila es

a(p(i)) ≥ a(i) ∀i = 2, . . . , n

En el ejemplo 5.2, la estructura de pila es la siguiente:

1
35

2 3
17 23

4 5 6 7
14 15 16 9

8 9 10
11 7 8

Figura 5.2: Estructura de pila


Algoritmo Heapsort de ordenación de números ORED 65

i a(i) p(i) lef t(i) right(i)


1 35 1 2 3
2 17 1 4 5
3 23 1 6 7
4 14 2 8 9
5 15 2 10 ∞
6 16 3 ∞ ∞
7 9 3 ∞ ∞
8 11 4 ∞ ∞
9 7 4 ∞ ∞
10 8 5 ∞ ∞

Obsérvese que el vector a no está ordenado de mayor a menor.

5.3.3. Algoritmo
Aunque el vector a asociado a una pila no está ordenado, la estructura de
árbol sı́ permite una ordenación de los elementos. Este es el objeto del algoritmo
Heapsort que se introduce a continuación.
El vector a tiene dos parámetros: dim(a), que indica el número de elementos
del vector; y lon(a), que especifica el tamaño de la pila. Inicialmente, ambos
parámetros coinciden con n, pero al evolucionar el algoritmo, los elementos
ordenados de la pila van saliendo de ésta y su tamaño lon(a) disminuye.
El algoritmo se basa en la reubicación de cada uno de los elementos i ∈
{1, . . . , n} para se verifique la propiedad de pila, concretamente para evitar que
a(i) sea menor que alguno de sus hijos. Obviamente, cualquier ı́ndice i > bn/2c
no necesita tal verificación.
La subrutina que permite verificar esta propiedad se basa en ir bajando por
el árbol binario el elemento i cambiándolo por el hijo con mayor valor a(j)
mientras sea necesario. El pseudocódigo es el especificado en el Algoritmo 5.1.

A partir de la subrutina HeapSortT estP ila (Algoritmo 5.1) se construye


una pila a partir de un vector a con dim(a) = n elementos y es guardada en el
mismo vector a, es el Algoritmo 5.2.
ORED 66 Árbol

Algoritmo 5.1: [a] = HeapSortT estP ila(a, i, lon(a), left, right)


l=left(i);
r=right(i);
if l ≤ lon(a) ∧ a(l) > a(i) then
maxi = l;
else
maxi = i;
end if
if r ≤ lon(a) ∧ a(r) > a(maxi) then
maxi = r;
end if
if maxi 6= i then
Cambiar a(i) por a(maxi);
[a] = HeapSortT estP ila(a, maxi, lon(a), left, right);
end if

Algoritmo 5.2: [a] = HeapSortConstP ila(a, lon(a), left, right)


n = lon(a);
for i = bn/2c, 1, −1 do
[a] = HeapSortT estP ila(a, i, lon(a), left, right);
end for

Una vez construida la pila, el elemento a(1) es el mayor de todos, por lo


que el algoritmo debe sacar dicho elemento y reordenar el resto para obtener el
vector reordenado.

El algoritmo Heapsort de reordenación de n números parte de un vector de


dimensión n donde se almacenan los números:

Algoritmo 5.3: [a] = HeapSortAlg(a, lon(a), left, right)


[a] = HeapSortConstP ila(a, lon(a), left, right);
while lon(a) > 0 do
Cambiar a(lon(a)) por a(1);
lon(a) = lon(a) − 1;
[a] = HeapSortT estP ila(a, 1, lon(a), left, right);
end while

Cuando termina el algoritmo Heapsort, se verifica


Algoritmo Heapsort de ordenación de números ORED 67

a(1) ≤ a(2) ≤ · · · ≤ a(n)

La complejidad algorı́tmica de ordenar un vector de n números por este


procedimiento es O(n · ln(n)) al ser los movimientos verticales en la estructura
de pila y ser la altura del árbol binario del orden ln(n).

Ejemplo 5.3. Sea el conjunto de 8 elementos a ordenar

(10, 90, 30, 80, 50, 40, 90, 99)

La representación inicial de la estructura de pila con los datos asignados


según a(1) = 10, a(2) = 90, . . . , a(8) = 99 es la representada en la figura 5.3(a).

1 1 1
10 10 10
2 3 2 3 2 3
90 30 90 30 90 90
4 5 6 7 4 5 6 7 4 5 6 7
80 50 40 90 99 50 40 90 99 50 40 30
8 8 8
99 80 80
(a) (b) (c)

Figura 5.3: Desarrollo del algoritmo Heapsort en el ejemplo 5.3

Al ejecutar Heapsort(a), se obtiene lon(a) = 8 y se llama a Construcción


Pila(a):

i=4 Se llama a T est P ila(a, 4) y se obtiene la representación de la figura 5.3(b).

i=3 Se llama a T est P ila(a, 3) y se obtiene la representación de la figura 5.3(c).

i=2 Se llama a T est P ila(a, 2) y se obtiene la representación de la figura 5.4(a)

i=1 Se llama a T est P ila(a, 1) y se obtienen las representaciones de las figu-


ras 5.4(b), 5.4(c) y 5.5(a).

Una vez construida la pila, se van cambiando el primer elemento a(1) = 99,
que es el más grande de los números, por el último activo a(lon(a) = a(8) = 10.
Al disminuir la variable lon, se desactiva este último elemento (el mayor), que
ORED 68 Árbol

ya no se moverá a lo largo del algoritmo, es decir, a(8) = 99 y ya se ha fijado


el mayor de los elementos del vector a.
Al aplicar T est P ila al primer elemento a(1) = 10, se va bajando sucesiva-
mente para obtener la estructura de pila de la figura 5.5(b).
Repitiendo el cambio del primero por el último activo, el séptimo, se guarda
como segundo elemento mayor de la lista de números el 90 y se obtiene la
estructura de pila de la figura 5.5(c).
Repitiendo este proceso se obtienen las estructuras de pila de las figuras 5.6(a),
5.6(b) y 5.6(c).
A partir de los valores que se han ido sacando se concluye que el vector

1 1 1
10 99 99
2 3 2 3 2 3
99 90 10 90 90 90
4 5 6 7 4 5 6 7 4 5 6 7
90 50 40 30 90 50 40 30 10 50 40 30
8 8 8
80 80 80
(a) (b) (c)

Figura 5.4: Desarrollo del algoritmo Heapsort en el ejemplo 5.3

1
99
2 3 1 1
90 90 90 90
4 5 6 7 2 3 2 3
80 50 40 30 80 90 80 40
8 4 5 6 7 4 5 6
10 10 50 40 30 10 50 30
(a) (b) (c)

Figura 5.5: Desarrollo del algoritmo Heapsort en el ejemplo 5.3

1 1
80 50
2 3 2 3 1
50 40 30 40 40
4 5 4 2 3
10 30 10 30 10
(a) (b) (c)

Figura 5.6: Desarrollo del algoritmo Heapsort en el ejemplo 5.3


Árbol soporte. Estudio algebraico de ciclos y cociclos ORED 69

ordenado es
(10, 30, 40, 50, 80, 90, 90, 99)

5.4. Árbol soporte. Estudio algebraico de ciclos y


cociclos
Dado un grafo conexo, siempre existe un grafo parcial que es un árbol; para
ello, es suficiente con eliminar aquellas aristas que no desconecten el grafo hasta
quedarse con n − 1 aristas.

Definición 5.6. Dado un grafo G = (V, E) conexo con n vértices, cualquier


grafo parcial conexo H = (V, T ), con T ⊂ E y |T | = n − 1, se denomina
árbol soporte de G.

En la bibliografı́a sajona se denomina spanning tree y ha sido traducido en


algunos textos como árbol generador o árbol de extensión.

Dado un grafo conexo G = (V, E) y un árbol soporte H = (V, T ), con


T ⊂ E, al añadir una arista a T se forma un único ciclo y al quitarla un único
cociclo. El concepto de cociclo se introducirá posteriormente. Se estudian en
esta sección determinadas propiedades algebraicas que permitirán caracterizar
todos los ciclos y cociclos de un grafo conexo.

Con el fin de ilustrar los correspondientes conceptos y propiedades, se intro-


duce el siguiente ejemplo.

Ejemplo 5.4. Sea el siguiente grafo con 6 vértices V = {a, b, c, d, e, f } y 8


aristas representado en la figura 5.7.
Por comodidad de notación, se consideran ordenadas las aristas según los
números (1, 2, . . . , 8) asociados.
Se considera como árbol soporte H = (V, T ), con

T = {1; 2; 3; 7; 8} = {{a, b}; {a, d}; {b, c}; {d, e}; {e, f }; }

5.4.1. Ciclos en un grafo conexo. Número ciclomático


Definición 5.7. Dado un grafo G = (V, E) conexo, un ciclo µ se caracteriza
por el vector (µ1 , . . . , µm ) verificando
ORED 70 Árbol

(
1 e∈µ
µe =
0 e 6∈ µ

Con el fin de operar con ciclos de forma que dos ciclos adyacentes que se
suman definan un ciclo cuyas aristas sean la unión de las aristas de los ciclos
originales y desaparezcan las aristas comunes a ambos, se introduce el siguiente
conjunto que comprende no sólo los ciclos —según se han definido en el capı́tu-
lo 2— sino las uniones inconexas de ciclos.
Formalmente, sea CG el conjunto de grafos parciales de G de forma que todos
los vértices tienen grado par o nulo. Cualquier ciclo genera un grafo parcial en
estas condiciones, pero no sólo los ciclos, sino la unión de ciclos inconexos, por
lo que se puede definir el conjunto CG como el conjunto de ciclos ampliados del
grafo conexo G.
Un ciclo ampliado que no es un ciclo es, por ejemplo, el conjunto de dos
ciclos inconexos µ = µ1 ∪ µ2 , es decir, que no compartan ningún vértice; en este
caso, µ ∈ CG pero no es un ciclo. En sentido inverso, cualquier ciclo µ ∈ CG .
La composición de nuevos ciclos a partir de otros, se basa en el operador

⊕ : CG × CG −→ CG

definido por

µ = µ1 ⊕ µ2 ⇐⇒ µe = µ1e .XOR.µ2e ∀e ∈ E

siendo el operador .XOR. definido en {0, 1}2 según la tabla:

1 3
a b c

5
2 4 6

7 8
d e f

Figura 5.7: Grafo y árbol soporte del ejemplo 5.4


Árbol soporte. Estudio algebraico de ciclos y cociclos ORED 71

.XOR. 0 1
0 0 1
1 1 0

El operador ⊕ es cerrado en el conjunto CG , en el sentido de verificarse

µ ⊕ µ0 ∈ CG ∀µ, µ0 ∈ CG

Este operador no es cerrado si se opera con ciclos, serı́a el caso de dos ciclos
inconexos que al ser operados con ⊕ no definen un ciclo.
El elemento neutro del operador ⊕ es el vector nulo de 0 ∈ {0, 1}m asociado
al ciclo nulo.
El elemento inverso del ciclo µ respecto del operador ⊕ es el propio µ. Como
consecuencia de esta propiedad, las operaciones suma y resta coinciden y, por
tanto:
µ = µ1 ⊕ µ2 ⇐⇒ µ ⊕ µ1 ⊕ µ2 = 0

A continuación se ilustra a partir de varios ejemplos las flexibilidad del ope-


rador ⊕ para generar nuevos ciclos.

En el grafo G y el árbol soporte H del ejemplo 5.4 se definen los ciclos:


µ = {1, 2, 7, 4, 3, 6, 5}
µ0 = {4, 5, 8}
µ∗ = {3, 5, 6}
µ@ = {1, 2, 4, 7}
que tienen los vectores asociados
µ = (1, 1, 1, 1, 1, 1, 1, 0)
µ0 = (0, 0, 0, 1, 1, 0, 0, 1)
µ∗ = (0, 0, 1, 0, 1, 1, 0, 0)
µ@ = (1, 1, 0, 1, 0, 0, 1, 0)
Se puede observar que
µ∗ ⊕ µ@ = (1, 1, 1, 1, 1, 1, 1, 0) = µ
ya que el ciclo µ no es elemental y se puede descomponer como suma de los
ciclos elementales µ∗ y µ@ .
Análogamente, se pueden obtener distintos ciclos operando con ⊕, por ejem-
plo:
ORED 72 Árbol

µ ⊕ µ0 = (1, 1, 1, 0, 0, 1, 1, 1)
µ0 ⊕ µ∗ = (0, 0, 1, 1, 0, 1, 0, 1)

Dado un conjunto de ciclos de un grafo conexo G, se define la dependencia o


independencia lineal de los mismos a partir del conjunto de vectores asociados
de {0, 1}m con el operador ⊕.

Continuando con el ejemplo anterior, el conjunto de ciclos

{µ, µ∗ , µ@ }

es linealmente dependiente.
El conjunto de ciclos
{µ0 , µ∗ , µ@ }

es linealmente independiente.

Si el conjunto de ciclos independiente permite generar cualquier ciclo de CG ,


se define una base de ciclos. Esta base de ciclos se caracteriza fácilmente a partir
de un árbol soporte del grafo conexo G.

Teorema 5.3. Sea G = (V, E) un grafo conexo con n vértices y m aristas. Dado
H = (V, T ), un árbol soporte de G, al añadir a T cualquier arista e ∈ E − T
se forma un único ciclo elemental µe en G. La base de ciclos de G definida a
partir de T es
{µe / e ∈ E − T }

de forma que cualquier ciclo de G se puede expresar como combinación de los


ciclos de esta base.
La dimensión de la base de ciclos de un grafo G se denomina número ciclomático
y se denota por ν(G). Se tiene, por consiguiente, que ν(G) = m − (n − 1) si el
grafo es conexo. Habrá tantas bases de ciclos como árboles soporte se puedan
definir en G.

Demostración
El conjunto de ciclos {µe }e∈E−T es independiente, ya que cada el vector de
dimensión m asociado a µe tiene un 1 en la posición e-ésima, mientras que los
0
otros ciclos µe , con e0 6= e, tienen un 0 en dicha posición.
Árbol soporte. Estudio algebraico de ciclos y cociclos ORED 73

A continuación se demuestra que el vector asociado a cualquier ciclo σ =


(σ1 , . . . , σm ) verifica

X
σ= σe µe
e∈E−T

Es decir, el coeficiente que acompaña a cada elemento de la base de ciclos


es la componente del vector caracterı́stico del ciclo asociada a cada una de las
aristas e ∈ E − T .
El sumatorio anterior se realiza con el operador ⊕ introducido previamente
en CG y, por tanto, es suficiente demostrar que el vector


X
σ⊕ σe µe
e∈E−T

tiene todas las componentes nulas y es, por consiguiente, el ciclo nulo.
Considerando que cada una de las componentes se asocia a las aristas de
E, las componentes asociadas al complementario del árbol T son nulas, ya que
0
para cada e ∈ E − T µee = 1 y µee = 0 ∀e0 6= e.
P⊕
Al ser el operador ⊕ un operador bien definido en CG , σ⊕ e∈E−T σe µe ∈ CG
y las componentes de E − T son nulas, por consiguiente, al ser T un árbol y
no contener ningún ciclo, se deduce que las componentes asociadas a T también
son nulas. El ciclo correspondiente es el ciclo nulo y termina la demostración.

En el ejemplo 5.4, considerando el árbol soporte T = {1, 2, 3, 7, 8}, se con-


cluye que

ν(G) = 8 − (6 − 1) = 3

de forma que la base de ciclos, asociada a E −T = {4, 5, 6} es BT = {µ4 , µ5 , µ6 }:


µ4 = (1, 1, 0, 1, 0, 0, 1, 0)
µ5 = (1, 1, 0, 0, 1, 0, 1, 1)
µ6 = (1, 1, 1, 0, 0, 1, 1, 1)
Cualquier ciclo se puede poner como combinación lineal, con el operador ⊕,
de los ciclos de la base BT . Por ejemplo, para el ciclo µ0 = (0, 0, 0, 1, 1, 0, 0, 1),
y siguiendo la demostración del teorema 5.3, al ser µ04 = 1, µ05 = 1 y µ06 = 0, se
concluye que
ORED 74 Árbol

µ0 = 1 · µ4 ⊕ 1 · µ5 ⊕ 0 · µ6 = (0, 0, 0, 1, 1, 0, 0, 1)

Observación 5.1. El teorema 5.3 demuestra que cualquier ciclo se puede po-
ner como combinación lineal trivial —de 0 y 1— de ciclos independientes. No
asegura, sin embargo, que cualquier combinación lineal de ciclos independientes
sea un ciclo, puesto que el operador ⊕ no es cerrado en el conjunto de ciclos,
sino en el conjunto CG .
Si se añadiera una novena arista uniendo los vértices a y e en el ejemplo 5.4,
al operar los ciclos µ09 = {2, 7, 9}, µ05 = {1, 2, 5, 7, 8} y µ06 = {1, 2, 3, 6, 7, 8} se
obtendrı́a:

µ09 ⊕µ04 ⊕µ06 = (0, 1, 0, 0, 0, 0, 1, 0, 1)⊕(1, 1, 0, 0, 1, 0, 1, 1, 0)⊕(1, 1, 1, 0, 0, 1, 1, 1, 0) =

= (0, 1, 1, 0, 1, 1, 1, 0, 1)

que corresponde a la unión de dos ciclos inconexos: {2, 7, 9} y {3, 5, 6}.

5.4.2. Cociclos en un grafo conexo. Número cociclomático (*)


Análogamente a los ciclos de un grafo, se estudian algebraicamente los co-
ciclos. Este concepto coincide con el conjunto de incidencia de un subconjunto
de vértices.

Definición 5.8. Dado G = (V, E) un grafo conexo, a partir de un subconjunto


A ⊂ V se define el cociclo como el subconjunto de aristas

w(A) = {e = {i, j} ∈ E / i ∈ A j 6∈ A}

Siempre se verifica que

w(A) = w(V − A) ∀A ⊂ V

Definición 5.9. El cociclo w(A) es elemental cuando los subgrafos generados


por A y V − A son conexos.

Al igual que a los ciclos, a los cociclos se les puede asociar un vector de
dimensión m.
Árbol soporte. Estudio algebraico de ciclos y cociclos ORED 75

Definición 5.10. Dado un grafo G = (V, E) conexo, considerando la perte-


nencia de sus aristas a un cociclo θ = w(A), se define el vector (θ1 , . . . , θm )
verificando (
1 e ∈ w(A)
θe =
0 e 6∈ w(A)

En el ejemplo 5.4 se pueden definir los siguientes cociclos, a los que se aso-
cian los vectores de dimensión 8:
A = {a, c, d, f } w(A) = {1, 3, 5, 7, 8} θ = (1, 0, 1, 0, 1, 0, 1, 1)
0 0 0
A = {a, b, d} w(A ) = {3, 4, 5, 7} θ = (0, 0, 1, 1, 1, 0, 1, 0)
∗ ∗ ∗
A = {b, c, f } w(A ) = {1, 4, 8} θ = (1, 0, 0, 1, 0, 0, 0, 1)
El cociclo θ no es elemental, mientras que θ y θ∗ sı́ lo son.
0

Dado un grafo conexo G = (V, E), se define el conjunto de cociclos del grafo
G como COG . En el conjunto COG se define el siguiente operador, análogo al
definido en el conjunto de ciclos CG .

Definición 5.11. Dados dos cociclos θ1 = w(A1 ) y θ2 = w(A2 ) del grafo conexo
G = (V, E), siendo A1 , A2 ∈ V , se define el operador ⊕ en COG :

θ = θ1 ⊕ θ2

verificando

θe = θe1 .XOR. θe2 ∀e ∈ {1, . . . , m}

El operador binario .XOR. es el definido para los ciclos.

El operador ⊕ está bien definido en el sentido de caracterizar un nuevo


cociclo.

Proposición 5.1. El vector θ = θ1 ⊕ θ2 caracteriza al cociclo w(A), siendo


A = A1 4 A2 .

El operador ⊕ verifica la propiedad asociativa de forma que se verifica la


siguiente propiedad

Proposición 5.2. Dados los cociclos {w(Ai ) / i = 1, . . . , k} y sus vectores


asociados {θi / i = 1, . . . , k}, el cociclo w(A), siendo

A = A1 4 A2 4 · · · 4 Ak
ORED 76 Árbol

está caracterizado por el vector


X
θ= θi
i=1,...,k

El elemento neutro del operador ⊕ es el vector nulo de 0 ∈ {0, 1}m asociado


al cociclo w(V ) = w(∅).
El elemento inverso del cociclo θ respecto del operador ⊕ es el propio θ.
Con el fin de poder reconstruir todos los cociclos de un grafo conexo G, COG ,
a partir de una base de cociclos, se introduce el concepto de dependencia lineal
entre cociclos a partir de la dependencia lineal de sus vectores asociados con el
operador .XOR..

Definición 5.12. Un conjunto de cociclos Θ = {θ1 , . . . θk } es linealmente de-


pendiente si existe un subconjunto de cociclos Θ0 ⊂ Θ tal que


X
θ=0
θ∈Θ0

Continuando con los cociclos definidos en el ejemplo 5.4, se comprueba que:


θ0 ⊕ θ∗ = (1, 0, 1, 0, 1, 0, 1, 1) = θ = w(A)
que es coherente con la propiedad
A0 4 A∗ = {a, c, d, f } = A

A continuación se introduce el concepto de coárbol, que juega un papel


similar en los cociclos al que juega el concepto de árbol en ciclos.

Definición 5.13. Dado un grafo conexo G = (V, E), un coárbol de G es el grafo


parcial complementario de un árbol soporte de G.
Es decir, H = (V, F ) es un coárbol si y sólo si H̄ = (V, E − F ) es un árbol
soporte de G.

Cualquier árbol soporte de G no contiene ningún ciclo; además, cualquier


arista que se añada al árbol destruye la propiedad. De forma análoga se verifica
la siguiente propiedad para coárboles.

Proposición 5.3. Un grafo parcial H = (V, F ) de un grafo conexo G = (V, E)


es un coárbol si y sólo si no contiene ningún cociclo elemental de G no vacı́o y
es, además, maximal con esta propiedad.
Árbol soporte. Estudio algebraico de ciclos y cociclos ORED 77

Demostración

=⇒
Si H contuviera un cociclo w(A), con A ⊂ V , el grafo parcial H c =
(V, E − F ) no serı́a conexo y, por consiguiente, H no serı́a un coárbol.
Para ver que es el grafo maximal con la propiedad de no contener cociclos,
hay que observar que al añadir una arista, ésta pertenece necesariamente
al árbol asociado H c . Sea V1 ⊂ V el conjunto de vértices de una de las
componentes conexas que resulta al quitar en H c la arista en cuestión.
El cociclo w(V1 ) es elemental al generar V1 y V − V1 subgrafos conexos.
El coárbol H contiene al cociclo elemental w(V1 ) y ya está demostrada la
implicación.

⇐=
Para demostrar que H = (V, F ) es un coárbol, es suficiente demostrar que
H c = (V, E − F ) es un árbol. En efecto, si no fuera un árbol es por una
de las dos razones siguientes

• H c contiene un ciclo µ.
Sea e ∈ E una arista de µ. El ciclo µ tiene al menos dos aristas en
cualquier cociclo que contenga a la arista e al estar los extremos de
ésta en cada uno de los subconjuntos de vértices del cociclo.
Al añadir a F sólo la arista e se asegura que el grafo parcial H e =
(V, F ∪{e}) no contiene ningún cociclo de G y, por consiguiente, H no
es maximal con la propiedad de no contener cociclos y se contradice
la hipótesis de partida.
• H c no es conexo.
En este caso, sea V1 ⊂ V uno de los conjuntos de vértices desconec-
tados. H contendrı́a al cociclo w(V1 ), lo que contradice la hipótesis
de partida.

Se concluye ası́ que al añadir al coárbol una arista se forma un cociclo ele-
mental, por lo que se pueden construir todos los cociclos elementales de un
grafo conexo a partir del árbol soporte complementario. Se tiene ası́ el siguiente
teorema
ORED 78 Árbol

Teorema 5.4. Sea G = (V, E) un grafo conexo con n vértices y m aristas.


Dado H = (V, T ), un árbol soporte de G, al quitar de T cualquier arista e ∈ T
se forma un único cociclo elemental θe en G. La base de cociclos de G definida
a partir de H es
{θe / e ∈ T }

siendo θe el cociclo definido por las aristas que unen las dos componentes conexas
del grafo parcial (V, T − {e}) que resulta al quitar de T la arista e.
La dimensión de la base de cociclos de un grafo G se denomina número
cociclomático y se denota por λ(G). Se tiene, por consiguiente, que λ(G) = n−1.
Habrá tantas bases de cociclos como árboles soporte se puedan definir en G.

Demostración
El conjunto de cociclos {θe }e∈T es independiente, ya que cada vector de
dimensión m asociado a θe tiene un 1 en la posición e-ésima, mientras que los
0
otros cociclos θe , con e0 6= e, tienen un 0 en dicha posición.
A continuación se demuestra que el vector asociado a cualquier cociclo γ =
(γ1 , . . . , γm ) verifica
X
γ= γe θ e
e∈T

Éste es un resultado análogo al de los ciclos, los coeficientes de la combinación


lineal asociada a la base de cociclos son las componentes del vector caracterı́stico
asociadas al árbol soporte.
Para demostrar esta igualdad, es suficiente demostrar que el vector de COG
X
γ⊕ γe θ e
e∈T

tiene todas las componentes nulas.


Considerando que cada una de las componentes se asocia a las aristas de E,
las componentes asociadas al árbol T son nulas, ya que para cada e ∈ T θee = 1
0
y θee = 0 ∀e0 6= e.
En el complementario de T , las componentes son nulas al ser (V, E − T ) un
coárbol y no contener ningún cociclo.

En el ejemplo 5.4, se verifica que λ(G) = 5. Al considerar T = {1, 2, 3, 7, 8},


Árbol soporte. Estudio algebraico de ciclos y cociclos ORED 79

se define la siguiente base de cociclos:

BT = {θ1 , θ2 , θ3 , θ7 , θ8 }

siendo:
θ1 = (1, 0, 0, 1, 1, 1, 0, 0) w(VT1 ) = w({a, d, e, f }) = w({b, c})
2
θ = (0, 1, 0, 1, 1, 1, 0, 0) w(VT2 ) = w({a, b, c}) = w({d, e, f })
θ3 = (0, 0, 1, 0, 0, 1, 0, 0) w(VT3 ) = w({a, b, d, e, f }) = w({c})
θ7 = (0, 0, 0, 1, 1, 1, 1, 0) w(VT7 ) = w({a, b, c, d}) = w({e, f })
θ8 = (0, 0, 0, 0, 1, 1, 0, 1) w(VT8 ) = w({a, b, c, d, e}) = w({f })
Por ejemplo, el cociclo θ = (1, 0, 1, 0, 1, 0, 1, 1) = w({b, e}) se obtiene como
combinación lineal de la base sin más que considerar que θ1 = 1, θ2 = 0, θ3 = 1,
θ7 = 1 y θ8 = 1:

θ = θ1 ⊕ θ3 ⊕ θ7 ⊕ θ8 = (1, 0, 1, 0, 1, 0, 1, 1)

Observación 5.2. El teorema 5.4 se extiende fácilmente a grafos no conexos


con p componentes conexas considerando cada una de ellas por separado para
obtener λ(G) = n − p
ORED 80 Árbol
Capı́tulo 6
Problema de árbol soporte de
mı́nimo peso

Considerando que en un grafo conexo se pueden definir varios árboles so-


porte, en el caso en que las aristas estén valuadas —red no dirigida— puede
interesar determinar el árbol soporte que acumula un peso total menor de sus
aristas. Se tiene ası́ planteado el problema del árbol soporte de mı́nimo peso. Se
estudian dos algoritmos que resuelven este problema: el de Kruskal [28], intro-
ducido en 1956, y el de Prim [32], introducido en 1958. Por último, se plantea
el modelo de programación matemática asociado.

6.1. Red no dirigida. Planteamiento del problema


El árbol soporte de un grafo conexo G no es único en general. Si las aristas
están valoradas tiene sentido plantearse el problema de encontrar el árbol so-
porte de menor peso entre todos los posibles. Para formalizar este problema, es
preciso introducir la siguiente

Definición 6.1. Una red es un grafo en el que las aristas están valorados. Se
representa por el par (G, d), siendo G un grafo y d ∈ IRm un vector cuyas
componentes identifican el valor numérico de cada arista. El peso de cada arista
se denota por d(e), con e ∈ E, o bien de si se asigna un ı́ndice e ∈ {1, . . . , m}
a cada una de las aristas.

Se hablará de red no dirigida o red dirigida para distinguir los casos de grafo
ORED 82 Problema de árbol soporte de mı́nimo peso

o digrafo con aristas o arcos valuados.

En el ejemplo 2.2 del capı́tulo 2, que estudiaba las comunicaciones entre 5


pueblos, y representado en la figura 2.2, un árbol soporte identifica un conjunto
de 4 tramos de carretera de forma que todos los pueblos estén conectados por
cadenas. Posibles árboles soporte serı́an:

T 1 = {{a, b}; {b, c}; {b, d}; {b, e}}

T 2 = {{a, b}; {a, c}; {d, e}; {b, e}}

T 3 = {{a, b}; {a, c}; {c, d}; {d, e}}

A partir de este ejemplo 2.2, asignando a cada arista la longitud de la ca-


rretera que une los pueblos asociados a sus extremos se define la red no dirigida
representada en la figura 6.1.

2
a c

3 6 4

2
b d
1 1
e

Figura 6.1: Red de carreteras del Ejemplo 2.2

El Problema del árbol soporte de mı́nimo peso es el siguiente:


Dada una red no dirigida (G, d), con G = (V, E) conexo y {de , e ∈ E},
determinar el árbol soporte H = (V, T ), T ⊂ E que minimiza el peso total
X
d(T ) = de
e∈T

Continuando con el ejemplo 2.2, se observa que la longitud total asociada a


cada uno de los árboles soporte es

d(T 1 ) = 12 d(T 2 ) = 7 d(T 3 ) = 10


Algoritmo de Kruskal ORED 83

y se puede comprobar que T 2 es el árbol soporte de longitud mı́nima.

En las siguientes secciones se introducen los algoritmos de Kruskal y Prim


que resuelven el problema del árbol soporte de peso mı́nimo. Ambos algoritmos
construyen la solución incorporando en cada etapa lo mejor, en el algoritmo
de Kruskal la arista de menor peso que no forme ciclo con las anteriores; en el
algoritmo de Prim, la arista de menor peso del cociclo definido por los vértices
conectados con las aristas del árbol en construcción. A este tipo de algoritmos
se les denomina algoritmos voraces (del inglés greedy).

6.2. Algoritmo de Kruskal


Partiendo de T = ∅, este algoritmo construye el árbol soporte añadiendo
aristas mientras no formen ciclo. Si el grafo de partida G = (V, E) es conexo y
las aristas están ordenadas crecientemente por sus pesos

d1 ≤ d2 ≤ · · · ≤ dm

el árbol soporte construido por el algoritmo es el de mı́nimo peso.


Para determinar si forman o no ciclos las aristas que se añaden, se identifican
distintos depósitos de vértices donde están los vértices conectados por aristas
de T . Inicialmente todos los depósitos están vacı́os y al final —si el grafo es
conexo— todos los vértices están en un único depósito.
Se denota por dep(i) el depósito del vértice i ∈ V . La variable nro dep repre-
sentará el número total de depósitos; cuando termine el algoritmo, identificará
el número de componentes conexas de G.
El algoritmo 6.1 de Kruskal parte de la red no dirigida (G, d), con G = (V, E)
y el vector d ordenado:

Al terminar el algoritmo, si

nro dep = 1 y dep(i) 6= 0 ∀i ∈ V

entonces el grafo original era conexo y (V, T ) es el árbol soporte de mı́nimo peso.

Tal como está el algoritmo, las aristas están ordenadas, y la complejidad del
algoritmo de Kruskal es O(m · n).
ORED 84 Problema de árbol soporte de mı́nimo peso

Algoritmo 6.1: [T, p, nro dep] = ArbolSopKruskal(G = (V, E); d)


Entrada:
E Aristas del grafo G
d Distancia o peso (ordenados) de las aristas d1 ≤ d2 ≤ · · · ≤ dm
Salida:
T ⊂ E subconjunto de aristas que definen el árbol soporte óptimo
Vector p : V → V que caracteriza el árbol soporte óptimo
nro dep Número de componentes conexas del grafo (1 si es conexo)
Inicialización:
{No hay depósitos de nodos, y T es el vacı́o }
dep(i) = 0 ∀i = 1, . . . , n
nro dep = 0
T =∅
Proceso:
{j es el ı́ndice de las aristas a sondear }
j=1
while (j ≤ m ∧ |T | < n − 1) do
{No se ha completado el árbol soporte }
Sea ej = {x, y}. Hay 4 posibilidades:
1)dep(x) = dep(y) = 0 :
{Nuevo depósito con los vértices x e y, se añade ej }
T = T ∪ {ej }
nro dep = nro dep + 1
dep(x) = dep(y) = nro dep
2)dep(x) = dep(y) 6= 0 :
{x e y pertenecen al mismo depósito, su inclusión formarı́a un ciclo en
T ; no se hace nada. }
3)dep(x) 6= dep(y) = 0 :
{el vértice y se añade al depósito de x, se añade ej }
T = T ∪ {ej }
dep(y) = dep(x)
4)0 6= dep(x) 6= dep(y) 6= 0 :
{se funden los depósitos de x e y, se añade ej }
T = T ∪ {ej }
{El depósito dep(x) recibe los nodos del depósito dep(y), que se
vacı́a }
dep(z) = dep(x) ∀z ∈ V / dep(z) = dep(y)
{El número de depósitos disminuye }
nro dep = nro dep − 1
j =j+1
end while
Algoritmo de Kruskal ORED 85

No obstante, si las aristas no están ordenadas, y utilizando el algoritmo


Heapsort, se puede conseguir una complejidad de orden O(m · ln(m)) con una
estructura de datos apropiada.

En el ejemplo 2.2, las aristas ordenadas serı́an:

{{b, e}; {d, e}; {a, c}; {b, d}; {a, b}; {c, d}; {b, c}}

Inicialmente:

a b c d e
T =∅ nro dep = 0
dep() 0 0 0 0 0

El análisis de las aristas según el orden anterior serı́a:

1. {b, e} =⇒ dep(b) = dep(e) = 0:

a b c d e
T = {{b, e}} nro dep = 1
dep() 0 1 0 0 1

2. {d, e} =⇒ dep(d) = 0 6= dep(e) = 1:

a b c d e
T = {{b, e}; {d, e}} nro dep = 1
dep() 0 1 0 1 1

3. {a, c} =⇒ dep(a) = 0 = dep(c):

a b c d e
T = {{b, e}; {d, e}; {a, c}} nro dep = 2
dep() 2 1 2 1 1

4. {b, d} =⇒ dep(b) = 1 = dep(d):

a b c d e
T = {{b, e}; {d, e}; {a, c}} nro dep = 2
dep() 2 1 2 1 1
ORED 86 Problema de árbol soporte de mı́nimo peso

5. {a, b} =⇒ dep(a) = 2 6= dep(b) = 1:

a b c d e
T = {{b, e}; {d, e}; {a, c}; {a, b}} nro dep = 1
dep() 1 1 1 1 1

Al completar 4 aristas en T , el algoritmo termina y se ha obtenido como


árbol soporte de mı́nimo peso

T = {{b, e}; {d, e}; {a, c}; {a, b}}

A continuación se demuestra que el árbol ası́ construido es de mı́nimo peso.

Proposición 6.1. El algoritmo de Kruskal construye el árbol soporte de mı́nimo


peso.

Demostración
Sea T el subconjunto de aristas construido por el algoritmo. Sea S el sub-
conjunto de aristas de un árbol de mı́nimo peso. En el caso en que T = S, ya
está demostrada la proposición.
En caso contrario, es decir, si T 6= S, por verificarse |T | = |S| = n − 1:

Existe una arista e1 verificando

e1 = {x1 , y 1 } ∈ T e1 6∈ S

esta arista e1 elegida es la primera de la lista ordenada por pesos verifi-


cando esta propiedad.

Al ser S un árbol y e1 6∈ S =⇒ ∃µ1S [x1 , y 1 ] ⊂ S .


Esta cadena µ1S [x1 , y 1 ] formará un único ciclo en S al añadir la arista e1 .

∀e ∈ µ1S [x1 , y 1 ] se verifica d(e) ≤ d(e1 ), puesto que en caso contrario, S


no serı́a el árbol de peso mı́nimo.

En µ1S [x1 , y 1 ] existe una arista e2 = {x2 , y 2 } que no pertenece a T , puesto


que si todas las aristas de µ1S [x1 , y 1 ] ⊂ T habrı́a un ciclo en T .

Considerando que e2 ∈ µ1S [x1 , y 1 ], se concluye que d(e2 ) ≤ d(e1 ).


Algoritmo de Prim ORED 87

Hay que demostrar la desigualdad contraria, se hará viendo que la arista


e2 no puede estar delante de la arista e1 en la lista ordenada asociada al
algoritmo de Kruskal, puesto que en caso contrario:
Si e2 6∈ T es porque formarı́a un ciclo si se añadiera a T , existe por
consiguiente una cadena µ2T [x2 , y 2 ] ⊂ T . Además, todas las aristas de µ2T
están situadas en la lista del algoritmo antes que e2 .
Por definición de e1 , al ser la primera arista de la lista incluida en T y
no incluida en S, se deduce que µ2T [x2 , y 2 ] ⊂ S y la arista e2 formarı́a un
ciclo en S.
Por consiguiente, la arista e2 está después de la arista e1 en la lista del
algoritmo y d(e2 ) ≥ d(e1 ).

Se concluye ası́ que d(e2 ) = d(e1 ).

Sea S 0 = S ∪ {e1 } − {e2 }. Este árbol es también de peso mı́nimo al verificar


d(S 0 ) = d(S) y tiene una arista más en común con T que S. El proceso se repite

S → S 0 → S 00 → · · · → S (k

hasta concluir que

d(S) = d(S 0 ) = · · · = d(S (k ) = d(T )

y la proposición ha quedado demostrada.

6.3. Algoritmo de Prim


El algoritmo de Prim construye el árbol soporte de mı́nimo peso añadiendo
vértices a un conjunto P ⊂ V que, inicialmente, es un vértice arbitrario. El
conjunto P va incorporando en cada iteración aquel vértice de V − P que es el
extremo de la arista con menor peso del cociclo w(P ).
A continuación se detalla el algoritmo de Prim.
Los vectores p y u, ambos de dimensión n, se utilizarán para construir el
árbol soporte de peso mı́nimo; para todo j ∈ V se verifica que p(j) ∈ V y
u(j) ∈ <; en cualquier caso:
ORED 88 Problema de árbol soporte de mı́nimo peso

Si j 6∈ P , u(j) es el peso mı́nimo de la arista que une el vértice j con el


conjunto P .

Si j ∈ P , u(j) es el peso de la arista {j, p(j)} ∈ T .

En cada iteración se irá construyendo el árbol soporte de peso mı́nimo T


añadiendo a P un vértice j 6∈ P y añadiendo a T la arista {j, p(j)}.

Al final del algoritmo, cuando P = V , el árbol soporte de peso mı́nimo


será T = {{j, p(j)} / j ∈ V }.

A continuación se detalla el algoritmo de Prim para un grafo conexo; en caso


contrario, habrá que elegir los vértices iniciales en cada una de las componentes
conexas.

La complejidad del paso de inicialización es O(n) utilizando la matriz de


adyacencia, de forma que se computa directamente a través del elemento bij el
valor inicial de u(j). Para analizar la complejidad del paso de proceso, hay que
observar que hay que vaciar el conjunto N en el bucle principal, que tendrá,
por consiguiente, complejidad O(n); dentro de este bucle, tanto la búsqueda
del mı́nimo u(k) como la posterior actualización de los u(j), tienen complejidad
O(n), por que el paso 2 tiene complejidad O(n2 ), que es la del algoritmo.

En el ejemplo 2.2, considerando como vértice inicial a, se tiene inicialmente:

a b c d e
P = {a} T =∅ p() a a a a a
u() 0 3 2 ∞ ∞

El proceso es determinado por las siguientes iteraciones:

1. k = c

a b c d e
P = {a, c} T = {{a, c}} p() a a a c a
u() 0 3 2 4 ∞

2. k = b
Algoritmo de Prim ORED 89

Algoritmo 6.2: [T, p] = ArbolSopP rim(G = (V, E); i ∈ V ; d)


Entrada:
E Aristas del grafo G
El vértice inicial del árbol i ∈ {1, . . . , n}
d Distancia o peso de las aristas (no necesaria la ordenación)
Salida:
T ⊂ E subconjunto de aristas que definen el árbol soporte óptimo
Vector p : V → V que caracteriza el árbol soporte óptimo
Inicialización:
{P es el conjunto de vértices permanentes y N los transitorios; inicialmente,
P = {i}, un vértice inicial, y N es el complementario de P }
P = {i}
N =V −P
{Inicialmente, no hay aristas en el árbol soporte óptimo }
T =∅
{En cada iteración, cualquier nodo transitorio j ∈ N se conecta a un nodo
permanente p(j) ∈ P con la arista de menor peso, uj es el peso de la citada
arista; inicialmente: p(j) = i, u(j) = dj,p(j) si existe la arista y u(j) = ∞ si
no existe. }
∀j ∈ N :
p(j) = i 
de si e = {i, j} ∈ E
u(j) =
∞ si {i, j} 6∈ E
Proceso:
while N 6= ∅ do
{En cada iteración, un nodo transitorio se convertirá en permanente, se
hará eligiendo la arista del cociclo w(P ) de menor peso. La arista elegida
se añade a T y su extremo transitorio será permanente }
Sea k ∈ N tal que u(k) = mı́nj∈N {u(j)}
T = T ∪ {k, p(k)}
P = P ∪ {k}
N = N − {k}
{Se actualizan los pesos de las aristas del cociclo w(P ) utilizando el nodo
k}
for j ∈ N do
if dkj < u(j) then
u(j) = dkj
p(j) = k
end if
end for
end while
ORED 90 Problema de árbol soporte de mı́nimo peso

a b c d e
P = {a, c, b} T = {{a, c}; {a, b}} p() a a a b b
u() 0 3 2 2 1

3. k = e

a b c d e
P = {a, c, b, e} T = {{a, c}; {a, b}; {b, e}} p() a a a e b
u() 0 3 2 1 1

4. k = d

P = {a, c, b, e, d} T = {{a, c}; {a, b}; {b, e}; {d, e}}

a b c d e
p() a a a e b
u() 0 3 2 1 1

El siguiente resultado justifica el algoritmo de Prim.

Teorema 6.1. Dado el grafo conexo G = (V, E), H = (V, T ) es el árbol soporte
de mı́nimo peso si y sólo si ∀e ∈ T se verifica d(e) ≤ d(e0 ) ∀e0 ∈ θe , siendo θe
el cociclo definido en el teorema 5.4 a partir de la base asociada a T .

Demostración

=⇒ En caso contrario, sean e ∈ T , e0 ∈ E, siendo e0 6= e tal que e0 ∈ θe y


verificando d(e) > d(e0 ).
Se construye T 0 = T ∪ {e0 } − {e}. T 0 es un árbol también al sustituir dos
aristas del mismo cociclo y se verifica que d(T 0 ) < d(T ), que contradice la
hipótesis de partida.

⇐= Sea H = (V, T ) y H ∗ = (V, T ∗ ) los árboles que verifican las hipótesis y


el árbol soporte de mı́nimo peso respectivamente. Hay que demostrar que
d(T ∗ ) = d(T ).
El modelo de Programación Matemática (*) ORED 91

En caso contrario, se deduce que T ∗ 6= T . Sea e ∈ T tal que e 6∈ T ∗ :


Al ser e ∈ T se verifica d(e) ≤ d(e0 ) ∀e0 ∈ θe
Al ser e 6∈ T ∗ , existe un ciclo µeT ∗ que se forma al añadir una arista a un
árbol (teorema 5.1).
La arista e pertenece al ciclo y al cociclo anteriores, es decir, e ∈ θe ∩ µeT ∗ .
Además, según se vio en la demostración de la proposición 5.3, existe otra
arista del ciclo µeT ∗ que pertenece al mismo cociclo θe . Sea e0 dicha arista.
Otra forma de ver esta propiedad, sin utilizar la citada proposición, es por
construcción al pertenecer uno de los extremos al subconjunto A ⊂ V y el
otro al complementario.
Al ser e0 del cociclo θe , por la hipótesis de partida, d(e0 ) ≥ d(e). No puede
ser d(e0 ) > d(e), ya que si éste fuera el caso, sustituyendo e por e0 en T ∗
se obtendrı́a un peso inferior estrictamente y no serı́a T ∗ el árbol soporte
de mı́nimo peso.
Se concluye ası́ que para cada arista e ∈ T que no pertenece a T ∗ se
asocia una arista e0 ∈ T ∗ con el mismo peso que se puede permutar hasta
conseguir que T ∗ = T , como se querı́a demostrar.

6.4. El modelo de Programación Matemática (*)


El problema de Árbol soporte de peso mı́nimo se puede plantear como un
problema de Programación entera con m variables y un número de restricciones
exponencial respecto de n.
La variable de decisión es {xe , e ∈ E}, que toma los valores 1 ó 0 dependiendo
de si la arista pertenece o no al árbol soporte de peso mı́nimo. El modelo de
Programación es:

P
M in e∈E de xe
P
e∈E xe =n−1
P
E(S) xe ≤ |S| − 1 ∀S 6= ∅ ⊂ V
xe ≥ 0 entera ∀e ∈ E

siendo E(S) el conjunto de aristas del subgrafo generado por S ⊂ V , es decir,


aquellas aristas que unen vértices de S.
ORED 92 Problema de árbol soporte de mı́nimo peso

La primera restricción asegura que sólo se eligen n − 1 aristas.


La segunda restricción asegura que las n − 1 aristas elegidas determinen un
árbol, por lo que hay que evitar un ciclo. Si existiera un ciclo µ que visita un
P
conjunto de vértices S ⊂ V , se verificarı́a que E(S) xe = |S|. Para evitar estos
ciclos, de cualquier subconjunto de V debe poder salirse con aristas de T , de
ahı́ la restricción. Obviamente, el número de subconjuntos de V es un número
exponencial respecto de n = |V |.
En la familia de conjuntos S no se incluye el conjunto total V , puesto que
la primera restricción es más restrictiva y está incluida en la correspondiente
inecuación a S = V .
El caso particular |S| = 2 asegura que xe ≤ 1 ∀e ∈ E, por lo que el modelo
anterior se plantea como uno de programación entera.
No obstante la dificultad computacional del modelo, que deriva del número
exponencial de restricciones, la restricción de integralidad se puede eliminar al
considerar que la solución del problema relajado continuamente se alcanza en
el árbol soporte de peso mı́nimo obtenido por el algoritmo de Kruskal. Esta
propiedad se demuestra a continuación.
La demostración se basa en encontrar una solución del problema dual aso-
ciada a la solución obtenida por el algoritmo de Kruskal y comprobar que se
verifica el teorema de las holguras complementarias para deducir la optimalidad
de ambas soluciones.
Identificando por E = {1, 2, . . . , m} el conjunto de aristas, se supone sin
pérdida de generalidad que las aristas determinadas por Kruskal son las n − 1
primeras, es decir, T = {1, . . . , n − 1} y se verifica

d1 ≤ d2 ≤ · · · ≤ dn−1

Sea la relajación continua del problema de programación binaria:


 P

 M in e∈E de xe

 P

e∈E xe =n−1
P P


 E(S) xe ≤ |S| − 1 ∀S 6= ∅ ⊂ V

xe ≥ 0 ∀e ∈ E

Asociando las variables duales zV y zS a cada una de las restricciones de P ,


se define su problema dual:
El modelo de Programación Matemática (*) ORED 93

 P

 M ax S⊆V (|S| − 1)zS

 P

S / i,j∈S zS ≤ de ∀e = {i, j} ∈ E
D


 zS ≤ 0 ∀S ⊂ V

zV cualquiera

Cambiando de signo las variables zS se tiene el modelo de programación:


 P

 M ax − S⊆V (|S| − 1)zS

 P
 − S / i,j∈S zS ≤ de ∀e = {i, j} ∈ E
D


 zS ≥ 0 ∀S ⊂ V

zV cualquiera

La construcción de una solución factible para el problema D es la siguien-


te: Para todo k ∈ {1, 2, . . . , n − 1} se define el conjunto de vértices Sk como
la componente conexa del subgrafo generado por los extremos de las aristas
{1, 2, . . . , k} que contiene la arista k.
Por construcción, Sk ⊂ V ∀k < n − 1 y Sn−1 = V .
La solución del problema dual es la siguiente:

zSk = dl − dk ∀k ∈ {1, . . . , n − 2}

siendo l el primer ı́ndice de arista mayor que k tal que los extremos de dicha
arista intersecan con el conjunto Sk .
La solución anterior se completa con:

zV = −dn−1 zS = 0 ∀S 6= {S1 , S2 , . . . , Sn−1 = V }

Por construcción de los zSk , el vector z verifica las restricciones de no nega-


tividad.
Para comprobar la restricción
X
− zS ≤ de ∀e = {i, j} ∈ E
S / i,j∈S

se parte de una arista genérica {a, b} y se determina el menor ı́ndice k tal que
ORED 94 Problema de árbol soporte de mı́nimo peso

a, b ∈ Sk , se comprueba que
X
− zS = dk
S / a,b∈S

y se demuestra que
dk ≤ de ∀e ∈ E

ya que, en caso contrario, si una arista e0 verificase de0 < dk , habrı́a entrado en
el árbol T construido con el algoritmo de Kruskal.
Para verificar el teorema de las holguras complementarias, hay que observar
que:
P
xe > 0 implica que e = {i, j} ∈ T y, por consiguiente, − S / i,j∈S zS =
de .

zS > 0 implica que existe un k ∈ {1, . . . , n − 2} tal que S = Sk y al ser Sk


P
conexo por construcción, se verifica e∈E(Sk ) = |Sk | − 1.

Se concluye ası́ que no ha sido necesaria la restricción de integralidad para


resolver el problema del árbol soporte de peso mı́nimo. No obstante, este modelo
de programación es poco eficiente por el elevado número, crece exponencialmente
con n, de restricciones.
Para ilustrar la demostración, se incluye el siguiente ejemplo.

Ejemplo 6.1. Sea la red no dirigida (G = (V, E), {de , e ∈ E}) de la figura 6.2
con n = 5.

13
b d

20 15 15 8

10 30
a c e

Figura 6.2: Red no dirigida del Ejemplo 6.1

A continuación se especifican las aristas ordenadas con los correspondien-


tes ı́ndices, sus extremos y el peso. Las cuatro primeras corresponden al árbol
soporte (V, T ) construido por el algoritmo de Kruskal.
El modelo de Programación Matemática (*) ORED 95

Índice 1 2 3 4 5 6 7
Arista { d,e } { a,c } { b,d } { b,c } { c,d } { a,b } { c,e }
Peso 8 10 13 15 15 20 20
Los conjuntos Sk son:

S1 = {d, e}

S2 = {a, c}

S3 = {b, d, e}

S4 = {a, b, c, d, e} = V

Los ı́ndices l asociados a cada una de las variables duales zSk son:

k=1 l = 3 (arista {b, d}), zS1 = 13 − 8 = 5

k=2 l = 4 (arista {b, c}), zS2 = 15 − 10 = 5

k=3 l = 4 (arista {b, c}), zS3 = 15 − 13 = 2

La otra variable no nula es zV = −15.

Se comprueba que la solución del problema dual es realmente una solución


factible de D verificando las siguientes restricciones asociadas a las aristas de
G. En la siguiente tabla se lista para cada arista el conjunto de subconjuntos de
vértices que contienen a sus extremos y que tiene un valor no nulo en la variable
dual.

P
{i, j} ∈ E {S ⊂ V / i, j ∈ S} − S zS de
{a, b} V 15 20
{a, c} S2 , V 15 − 5 = 10 10
{b, c} V 15 15
{b, d} S3 , V 15 − 2 = 13 13
{c, d} V 15 15
{c, e} V 15 30
{d, e} S1 , S3 , V 15 − 5 − 2 = 8 8

Además, la función objetivo del problema D es −(−15)4 − 5 − 5 − (2)2 = 46,


que coincide con el peso del árbol soporte obtenido por Kruskal.

El resultado obtenido en esta sección representa una demostración alterna-


tiva de la validez del algoritmo de Kruskal.
ORED 96 Problema de árbol soporte de mı́nimo peso
Capı́tulo 7
Problema de la arborescencia
de mı́nimo peso

En un digrafo, si desde un vértice existe un camino que llega al resto de los


vértices, se dice entonces que es una raı́z del digrafo. Un digrafo para el que
existe una raı́z se dice que es casi-fuertemente-conexo.
Una arborescencia es una estructura análoga a la de árbol en digrafos. Tiene
sentido plantearse el problema de determinar la arborescencia de mı́nimo peso a
partir de una raı́z fijada de antemano. El algoritmo que la determina, introducido
por Edmonds [14] en 1967, se basa en contraer sucesivamente el digrafo para
luego expandirlo y obtener la arborescencia de mı́nimo peso.
El conocimiento de la estructura de arborescencia es fundamental para en-
tender el problema de camino mı́nimo, por caracterizar su solución.

7.1. Arborescencia. Conexión casi-fuerte


Se propone el siguiente ejemplo para justificar los conceptos que se van a
introducir.

Ejemplo 7.1. La distribución de mensajes desde la sede central de una empresa


multinacional a sus 5 sucursales se puede realizar directamente o utilizando otras
sucursales.
Por las diferentes condiciones de los paı́ses donde se encuentran las sucur-
sales, no son posibles todas las comunicaciones, en la figura 7.1 se representa el
digrafo asociado G = (V, U ), donde r ∈ V representa a la sede central y el resto
ORED 98 Problema de la arborescencia de mı́nimo peso

de vértices {a, b, c, d, e} representan a las sucursales.

r b

e d

Figura 7.1: Digrafo del Ejemplo 7.1

Definición 7.1. Dado un digrafo G = (V, U ), un vértice r ∈ V se denomina


raı́z si de dicho vértice parten caminos al resto de vértices.

En el ejemplo 7.1, el único vértice que es una raı́z es el vértice r.

Definición 7.2. Un digrafo G = (V, U ) es casi-fuertemente conexo si para


cualquier par de vértices x, y ∈ V existe un vértice z ∈ V del que parten sendos
caminos µ[z, x] y µ[z, y].

No es difı́cil demostrar la siguiente

Proposición 7.1. Un digrafo es casi-fuertemente conexo ⇐⇒ tiene una raı́z.

La relación entre los tres conceptos de conexión en un digrafo es la siguiente:

Conexión fuerte =⇒ Conexión casi-fuerte =⇒ Conexión

El digrafo del ejemplo 7.1 es casi-fuertemente conexo. La raı́z es la sede


central y la casi-fuerte-conexión garantiza que cualquier sucursal puede ser co-
nectada por un camino que sale de la sede central.

Una raı́z en un digrafo tiene asociada una estructura particular, que formal-
mente se denomina arborescencia.

Definición 7.3. Un digrafo H = (V, T ) es una arborescencia con raı́z r ∈ V si


verifica las dos condiciones siguientes:
Arborescencia. Conexión casi-fuerte ORED 99

1. H no contiene ciclos.

2. ∀x ∈ V ∃µ[r, x] ⊂ T , camino que une r con x.

Una arborescencia se puede caracterizar de varias formas, según especifica


el siguiente teorema

Teorema 7.1. Dado un digrafo H = (V, T ) con n > 1 vértices, las siguientes
afirmaciones son equivalentes:

1. H es una arborescencia (digrafo sin ciclos con una raı́z r)

2. ∃r ∈ V del que parte un único camino al resto de los vértices

3. H es casi-fuertemente-conexo y es mı́nimo —en el sentido de la inclu-


sión— con esa propiedad.

4. H es conexo y ∃r ∈ V al que no llega ningún arco y al resto de los vértices


llega exactamente uno

5. H no tiene ciclos y ∃r ∈ V al que no llega ningún arco y al resto de los


vértices llega exactamente uno

6. H es casi-fuertemente-conexo y no tiene ciclos

7. H es casi-fuertemente-conexo y tiene n − 1 arcos

Demostración

1 =⇒ 2 El vértice r es la raı́z de la arborescencia y claramente el digrafo es casi-


fuertemente-conexo. El camino que une r con cualquier vértice es único,
puesto que en caso contrario habrı́a un ciclo en H.

2 =⇒ 3 Claramente, H es casi-fuertemente-conexo y si esta propiedad no desapa-


reciese al quitar un arco u = (x, y) ∈ U es porque habrı́a dos caminos para
llegar al vértice y.

3 =⇒ 4 Trivialmente, H es conexo. A r no puede llegar ningún arco porque se


podrı́a eliminar sin dejar de ser casi-fuertemente-conexo H. Al resto de
los vértices llega un arco por hipótesis. Si llegara más de un arco se podrı́a
eliminar manteniendo la casi-fuerte conexión.
ORED 100 Problema de la arborescencia de mı́nimo peso

4 =⇒ 5 Por hipótesis, hay n − 1 arcos en la arborescencia y al ser conexo, consi-


derando el árbol subyacente, no puede haber ciclos.

5 =⇒ 6 Sea y 6= r un vértice genérico de H. Sea (x, y) ∈ T el único arco que llega


a y; se define p(y) = x y se itera el proceso desde x hasta llegar a r, puesto
que no hay circuitos al no haber ciclos. Se definen ası́ los caminos que
salen desde r al resto de vértices y 6= r:

r −→ p(. . . p(p(y)) . . .) −→ · · · −→ p(x) −→ x = p(y) −→ y

y el digrafo es casi-fuertemente-conexo.

6 =⇒ 7 Al ser conexo sin ciclos, tiene n − 1 arcos.

7 =⇒ 1 Trivial.

Una arborescencia con raı́z r ∈ V se caracteriza por un vector (p(j), j ∈ V ),


de dimensión n = |V |, verificando:

p(r) = r

El camino que saliendo desde r llega al vértice j 6= r es:

r −→ p(. . . p(p(j)) . . .) −→ · · · −→ p(p(j)) −→ p(j) −→ j

7.2. Arborescencia de mı́nimo peso


Un digrafo G = (V, U ) puede contener varias arborescencias para una raı́z
dada siempre que sea casi-fuertemente-conexo.
Si cada arco u ∈ U está valuado según d(u) o du para todo u ∈ U , se define
el peso de una arborescencia H = (V, T ), con T ⊂ U como
X
d(T ) = d(u)
u∈T

Tiene sentido, pues, a partir de una red dirigida (G, d) y de un vértice fijo
r ∈ V como raı́z, plantearse cuál es la arborescencia de mı́nimo peso H ∗ =
(V, T ∗ ):
d(T ∗ ) = mı́n d(T )
T ⊂U
Arborescencia de mı́nimo peso ORED 101

Si se considera en el ejemplo 7.1 el coste de cada arco como el coste de enviar


el correspondiente mensaje, se la red dirigida representada en la figura 7.2.

8
r b
7 1
9 3
a
6 2 2 5
c
3
4
e 2 d

Figura 7.2: Ejemplo 7.1; G = (V, U )

Por consiguiente, la arborescencia de mı́nimo peso con raı́z r representa la


estructura de comunicación de los mensajes desde la sede central a todas las su-
cursales con coste mı́nimo total. Si el problema es el de enviar un mensaje a una
sucursal, el problema es de camino mı́nimo, que se estudiará posteriormente.

Por el teorema de caracterización de arborescencias, si de todos los arcos que


inciden en cada vértice, exceptuando la raı́z, se elige el arco de menor peso, si
no se forma un circuito, se tiene automáticamente definida la arborescencia de
mı́nimo peso. A continuación se define formalmente este digrafo parcial.

Definición 7.4. Dada la red dirigida (G = (V, U ), d) con raı́z r ∈ V , se define


el digrafo parcial con los arcos de menor peso que inciden en V −{r} y se denota
por H(G, d) = (V, U (G, d)), siendo
 
U (G, d) = uj ∈ U / duj = mı́n

d(i,j) , j ∈ V − {r}
i∈Γ (j)

No es difı́cil demostrar que si H(G, d) no tiene circuitos, define la arbores-


cencia de mı́nimo peso de la red dirigida (G = (V, U ), d).
En este caso, el vector p que identifica la arborescencia de mı́nimo peso se
determina considerando
(
p(r) = r
p(j) = i si uj = (i, j) ∀j ∈ V − {r}

A continuación, se construye H(G, d) para las dos redes dirigidas que se


representan en la figura 7.3.
ORED 102 Problema de la arborescencia de mı́nimo peso

a a a a
6
15
4
r 5 3 r 3 r 3 4 r 3 4
7
17
2 2
b b b b
(a) (b)

Figura 7.3: Obtención del digrafo parcial de menor peso

El primero de los digrafos parciales (a) no tiene ningún circuito, es decir,

U (G, d) = {(b, a); (r, b)}

y se define la arborescencia de mı́nimo peso por

p(r) = r p(a) = b p(b) = r

En el segundo de los digrafos (b), el digrafo parcial de los arcos de menor


peso define un circuito.

El problema, por consiguiente, surge cuando se forma un circuito en H(G, d).


El teorema siguiente relaciona, no obstante, este circuito y la arborescencia de
mı́nimo peso.

Teorema 7.2. Dada la red dirigida (G = (V, U ), d), si en el digrafo parcial


H(G, d) existe un circuito, entonces todos los arcos del circuito excepto uno
pertenecen a H ∗ = (V, T ∗ ), la arborescencia de mı́nimo peso de (G, d).

Demostración
Obviamente, todos los arcos del circuito no pueden pertenecer a H ∗ .
La demostración se completa al llegar a una contradicción si se supone que
hay dos arcos del circuito µ que no pertenecen a H ∗ , sean (a, b), (c, d) ∈ µ no
incluidos en la arborescencia H ∗ .
Los vértices b y d son distintos y ninguno de ellos puede ser la raı́z r. Se
elige, por ejemplo, el vértice b, al que se llega por un camino de H ∗ desde r; sea
(a0 , b) el último arco de dicho camino.
Sea H 0 = H ∗ ∪ {(a, b)} − {(a0 , b)}. Al ser µ el circuito definido por los arcos
de menor peso que inciden en los vértices, se verifica que d(a, b) ≤ d(a0 , b). Al
Arborescencia de mı́nimo peso ORED 103

ser H ∗ la arborescencia de mı́nimo peso, no puede ser d(a, b) < d(a0 , b) y, por
consiguiente, d(a, b) = d(a0 , b).
Se sustituye H ∗ por H 0 y se itera el proceso anterior hasta concluir que la
arborescencia de mı́nimo peso contiene todos los arcos del circuito excepto uno.

En el caso en que H(G, d) contenga un circuito, no se define una arbores-


cencia al no existir un camino entre la raı́z r y cualquiera de los vértices del
circuito. La arborescencia debe incidir en alguno de los vértices del circuito. El
teorema 7.2 asegura que es suficiente con llegar a un único vértice. Interesará
elegir aquel arco que aporte un menor peso, el peso que aportará dicho arco
será su peso menos el peso del arco del circuito que incida en el mismo vértice.
Esta propiedad justifica la contracción de todos los vértices de dicho circuito a
la hora de construir la arborescencia de mı́nimo peso.
Formalmente, se introduce la siguiente operación en un digrafo:

Definición 7.5. Dado un digrafo G = (V, U ), a partir de un subconjunto de


vértices W ⊂ V se define el grafo contraı́do, denotado por G/W , de la siguiente
forma:

G/W = (V − W ∪ {w}, UW )

siendo

UW = {u = (i, j) ∈ U / i, j 6∈ W } ∪ {(i, w) / (i, j) ∈ U, i 6∈ W, j ∈ W } ∪ . . .

. . . ∪ {(w, j) / (i, j) ∈ U, i ∈ W, j 6∈ W }

Es decir, w es la contracción del conjunto W de forma que todos los arcos que
incidı́an exteriormente en alguno de los vértices de W son sustituidos por arcos
que inciden en w; el resto de los arcos se mantienen desapareciendo aquéllos
con ambos extremos en W .

En el caso en que el conjunto de vértices son los de un circuito µ del di-


grafo parcial H(G, d), se denota por G/µ a la correspondiente contracción, que
modifica los pesos de los arcos según:
ORED 104 Problema de la arborescencia de mı́nimo peso

(
d(u) ∀u = (i, j) / j 6∈ µ
dµ (u) =
d(u) − d(uµj ) ∀u = (i, j) / j ∈ µ

siendo uµj el arco del circuito µ que incide en el vértice j.


La sucesiva determinación del digrafo parcial de mı́nimo peso en el digrafo
y las correspondientes contracciones cuando exista un circuito, hasta obtener
una arborescencia al no formar circuito, permite obtener la arborescencia de
mı́nimo peso en el digrafo original sin más que deshacer las contracciones con
las expansiones en orden inverso.
El algoritmo7.1 se define a continuación.

Algoritmo 7.1: [p] = ArborMin(G = (V, U ); r ∈ V ; d)


Entrada:
G = (V, U ) r ∈ V Digrafo G y nodo raı́z (r)
d Distancia o peso de los arcos
Salida:
p vector que caracteriza la arborescencia óptima con raı́z r (p(r) = r)
Inicialización:
Gs = (V s , U s ) y ds es la red contraı́da en la etapa s
s=0
V s = V ,U s = U
Gs = (V s , U s )
ds (u) = d(u) ∀u ∈ U s
Proceso:
loop
Sea H s = (V s , T s ) el digrafo parcial de mı́nimo peso obtenido a partir de
Gs :
∀i(6= r) ∈ V s : ds (p(i), i) = mı́nj ds (j, i)
T s = {(p(i), i) , ∀i(6= r) ∈ V s }
if ∃ un circuito µs en H s then
Contracción de Gs : Gs+1 = Gs /µs
s=s+1
else
Sea H s es la arborescencia de mı́nimo peso de Gs
for i = s, 0, −1 do
Expandir H i
end for
return Arborescencia de mı́nimo peso: H 0 expandido.
end if
end loop
Arborescencia de mı́nimo peso ORED 105

Para la red dirigida del ejemplo 7.1, se ilustra el algoritmo 7.1 en la figu-
ra 7.4.
En la figura 7.4 (a) se presenta la red original G0 = G.
El digrafo parcial H 0 de los arcos que inciden con menor peso a cada vértice
distinto de la raı́z es el representado en la figura 7.4 (b).
Al existir circuitos en H 0 , se identifican éstos y se aplica el paso 4:
s=1
µ1 = {a, c, b}, Sea w1 el vértice contraı́do asociado.
Se modifican las longitudes de los arcos por la contracción y se obtiene el
digrafo contraı́do G1 se representa en la figura 7.4 (c). El grafo parcial H 1 de
los arcos con menor peso es ahora el representado en la figura 7.4 (d).
Al existir un circuito en H 1 , se identifica éste y se aplica el paso 4:
s=2
µ2 = {e, d}, Sea w2 el vértice contraı́do asociado.
Se modifican las longitudes de los arcos por la contracción y se obtiene un
nuevo digrafo contraı́do G2 , representado en la figura 7.4 (e).
El grafo parcial H 2 de los arcos con menor peso se representa en la figura 7.4
(f ).
Al no tener circuitos H 2 , comienza la expansión —en orden inverso— para
identificar la arborescencia de mı́nimo peso: El digrafo que resulta al expandir
H 2 se representa en la figura 7.4 (g).
Expandiendo H 1 se tiene la arborescencia de mı́nimo peso, representada en
la figura 7.4 (h).
La arborescencia de mı́nimo peso con raı́z r queda ası́ identificada por:

p(a) = b; p(b) = c; p(c) = d; p(d) = e; p(e) = r

con peso total 15.


ORED 106 Problema de la arborescencia de mı́nimo peso

8
r 7 1 b r 1 b
9 3 3
a a
6 2 2 5 2
c 3 c
4 4
e 2 d e 2 d
(a) (b)

r 8-3 r
7-1
9-2
w1 w1
6 3-2 3-2
5
4 4
e 2 d e 2 d
(c) (d)

r 8-3 r
7-1
9-2
w1 w1
6-4 5-2 6-4
3-2 3-2

w2 w2
(e) (f)

r r 1 b
3
w1 a
6 3 6
c 3
e 2 d e 2 d
(g) (h)

Figura 7.4: Desarrollo del algoritmo 7.1 al ejemplo 7.1 (a), hasta llegar a la
arborescencia óptima (h)
Capı́tulo 8
Problema de Camino Mı́nimo.
Vértice inicial fijo

El problema de camino mı́nimo es uno de los problemas de optimización


combinatoria más relevantes. Muchos problemas de gestión se pueden plantear
como problemas de camino mı́nimo. En este capı́tulo se introduce el problema
del camino mı́nimo en una red dirigida desde un vértice fijo al resto de vértices.
Aunque el problema de camino mı́nimo ya fue planteado por Wiener [42] en
1873 y por Lucas [26] en 1882 (pero adjudicado a Trémaux), hay que esperar al
trabajo de Shimbel [36] en 1953, posteriormente ampliado por Bellman [6] en
1958, para obtener algoritmos precisos. Posteriormente, en 1959, Dijkstra [12]
propuso un nuevo algoritmo para este problema. Para más detalles sobre la
historia del desarrollo de los algoritmos de camino mı́nimo, ver Schrijver [34].
La solución de este problema se caracteriza por las ecuaciones de optimalidad
de Bellman, que identifican no sólo la longitud del camino mı́nimo a cada vértice
sino también la arborescencia con raı́z el vértice fijo que permite construir los
caminos mı́nimos.
La solución de estas ecuaciones es inmediata para redes sin circuitos. A
partir de un problema de programación lineal equivalente a la solución de las
ecuaciones de Bellman, se introduce un algoritmo de relajación.
Sin embargo, los algoritmos más eficientes para resolver el problema de ca-
mino mı́nimo desde un vértice son el algoritmo de Dijkstra y el de Bellman-Ford.
El de Dijkstra exige que todas las longitudes de los arcos sean positivas. El al-
goritmo de Bellman-Ford no exige ninguna hipótesis adicional y permite incluso
ORED 108 Problema de Camino Mı́nimo. Vértice inicial fijo

detectar la existencia de circuitos de longitud negativa.

8.1. Problema de Camino Mı́nimo. Existencia de so-


lución
En muchos problemas reales representados por una red dirigida donde la
valoración de cada arco representa una distancia, un tiempo, etc. es natural
plantearse la búsqueda de un camino uniendo dos vértices concretos s, t ∈ V de
forma que la distancia, tiempo, etc. total del camino —la suma de las corres-
pondientes magnitudes de los arcos que lo componen— sea mı́nima.
A continuación se introducen dos ejemplos que ilustran este tipo de proble-
mas.

Ejemplo 8.1. En un determinado perı́odo de tiempo se desea ir desde Madrid


hasta Tokio; al no haber vuelo directo entre los correspondientes aeropuertos, se
desea saber cuál debe ser el itinerario a seguir —utilizando los aeropuertos de
Londres, Parı́s, Frankfurt o Singapur— de forma que el coste total sea mı́nimo.
La red dirigida queda definida por los aeropuertos como vértices y los vuelos
directos como arcos. Cada arco se valora por el coste asociado al vuelo. En la
figura 8.1 se representa la red.

10 90
L F S

40 100
20 9 11 35

27 150
M P T

Figura 8.1: Red de aeropuertos del Ejemplo 8.1

La solución de este problema es el camino que une los vértices m y t con


coste total mı́nimo.

Ejemplo 8.2. Un barco de carga debe decidir la ruta a seguir desde el puerto
de origen O a un puerto de destino D. En los puertos intermedios puede tener
disponible una carga para trasladarla a otro puerto, obteniendo un beneficio, o
bien tiene que viajar de vacı́o con la consiguiente pérdida.
Problema de Camino Mı́nimo. Existencia de solución ORED 109

La red dirigida se construye a partir de los puertos de origen, de destino


y los intermedios; los arcos son los posibles trayectos entre estos puertos. La
valoración de cada arco es el beneficio o pérdida asociado a cada uno de los
trayectos; sin embargo, si se invierten los signos de forma que la ponderación de
cada arco sea un número negativo si el trayecto correspondiente es beneficioso
y sea un número positivo para los trayectos con pérdida, la solución de este
problema se identificará por el camino que, uniendo los vértices O y D, tenga
asociada una ponderación mı́nima.

Formalmente, el Problema de Camino Mı́nimo es el siguiente:


Dada la red dirigida (G = (V, U ), {du , u ∈ U }) y fijados dos vértices s, t ∈ V ,
determinar el camino µ[s, t] con longitud mı́nima.
La longitud de un camino es la suma de las longitudes de los arcos que lo
componen
X
d(µ) = du
u∈µ

A diferencia del problema del árbol soporte de peso mı́nimo —que siempre
existe para un grafo conexo— el problema de camino mı́nimo puede no tener
solución incluso existiendo camino entre los vértices especificados. Serı́a el caso
de la red de la figura 8.2.

3 5
s a t

2 1

-5
c b

Figura 8.2: Red con circuito negativo

donde se observa que el circuito

a→b→c→a

tiene longitud negativa y provoca que no exista un camino mı́nimo entre s y t. Es


decir, aún en el caso de que existiera un camino entre los vértices especificados,
no existirı́a camino mı́nimo (problema no acotado) si desde él se pudiera acceder
a un circuito de longitud negativa.
ORED 110 Problema de Camino Mı́nimo. Vértice inicial fijo

En todos los desarrollos posteriores se supondrá que existe al menos un


camino entre los vértices especificados y que no existen circuitos con longitud
negativa.

En el ejemplo 8.1 no puede haber circuitos de longitud negativa al tener un


coste positivo todos los vuelos.
En el ejemplo 8.2, sin embargo, sı́ puede haber arcos con longitud negativa.

Para plantear el problema de camino mı́nimo se introduce la matriz n × n,


D, que se define de la siguiente forma ∀i, j ∈ V :

 0 i=j


dij = du u = (i, j) ∈ U

 ∞

(i, j) 6∈ U

8.2. Ecuaciones de optimalidad


El fundamento teórico del Problema de Camino Mı́nimo lo proporciona la
adaptación, a dicho problema, del Principio de optimalidad de Bellman:
Si µ∗ [s, t] es un camino de longitud mı́nima entre los vértices s y t que pasa
por los vértices i y j, entonces el trozo de ese camino entre i y j, µ∗ [i, j], es de
longitud mı́nima entre los caminos que unen i y j.
Bellman [6] introdujo en 1958 este enfoque funcional para resolver el proble-
ma de camino mı́nimo: si uij es la longitud de un camino mı́nimo entre un par
de vértice cualesquiera i y j, se verifica:

ust = mı́n {usi + uij + ujt }


i,j∈V

En particular, eliminando el vértice j y considerando que i sea un predecesor


de t, se verificarı́a:

ust = mı́n{usi + dit }


i∈V

En consecuencia, para determinar el camino mı́nimo entre s y t, hay que


determinar simultáneamente el camino mı́nimo entre s y el resto de vértices. Es
el problema de camino mı́nimo desde un vértice fijo. Por comodidad de notación,
se supone que el vértice fijo es el primero, con ı́ndice 1. Denotando por uj = u1j
Ecuaciones de optimalidad ORED 111

a la longitud del camino mı́nimo que va desde 1 a j 6= 1, las ecuaciones de


Bellman serı́an:
(
u1 = 0
(8.1)
uj = mı́nk6=j {uk + dkj } ∀j 6= 1

Observación 8.1. Por el principio de optimalidad de Bellman, las ecuaciones


anteriores identifican condiciones necesarias de óptimo para el problema de ca-
mino mı́nimo. Sin embargo, en general, no son suficientes como se prueba en el
siguiente ejemplo.

Ejemplo 8.3. Sea V = {1, 2, 3}, d12 = 10, d23 = 1, d32 = −1, dij = ∞ en otro
caso. Las ecuaciones de Bellman serı́an:

 u1 = 0


u2 = mı́n{0 + 10, u3 − 1}

 u = mı́n{0 + ∞, u + 1} = u + 1

3 2 2

La solución de las ecuaciones de Bellman debe verificar:

u1 = 0, u2 ≤ 10, u3 = u2 + 1

Por ejemplo, el vector (0, 5, 6) las verifica y, sin embargo, no identifica las
longitudes de los caminos mı́nimos. El problema se presenta por la existencia
de un circuito de longitud 0.

A continuación, se demuestra como las ecuaciones de Bellman identifican


condiciones suficientes de óptimo para el problema de camino mı́nimo desde un
vértice si se excluye la posibilidad de existencia de circuitos de longitud nula.

Proposición 8.1. Las ecuaciones de optimalidad


(
u1 = 0
uj = mı́nk6=j {uk + dkj } j 6= 1

permiten construir la arborescencia asociada al problema de camino mı́nimo si


no existen circuitos de longitud nula.

Demostración
ORED 112 Problema de Camino Mı́nimo. Vértice inicial fijo

A partir de las ecuaciones de Bellman se construye la arborescencia con raı́z


1 (p(1) = 1) y:

uj = up(j) + dp(j),j ≡ mı́n{uk + dkj } ∀j 6= 1


k6=j

Para cualquier vértice j 6= 1 verificando p(j) ∈ {1, 2, . . . , n} existe un camino


que parte del vértice inicial:

1 → · · · → p(p(j)) → p(j) → j

Este camino está bien definido de forma que siempre se llega al vértice 1,
puesto que es el único al que no llega ningún arco (del resto siempre se puede
salir por un arco que entra), y no se puede formar ningún circuito del tipo:

k → h → · · · → p(k) → k → · · · → p(j) → j

Si existiera tal circuito µ = {k, h, . . . , p(k), k}, por construcción del vector
p, se verifica:

u = (p(i), i) ∈ µ ui = up(i) + dp(i),i


(p(k), k) uk = up(k) + dp(k),k
(p(p(k)), p(k)) up(k) = up(p(k)) + dp(p(k)),p(k)
.. ..
. .
(k, h) uh = uk + dk,h

Sumando todos los términos de las igualdades de todos los arcos se obtiene:
X
(uk + up(k) + · · · + uh ) = (up(k) + up(p(k)) + · · · + uk ) + du
u∈µ

y al ser los términos de los paréntesis iguales, se deduce que la suma de las
longitudes de los arcos del circuito es nula, lo que es imposible por hipótesis y
está bien definida la arborescencia del vector p.
Hay que demostrar, además, que la solución de las ecuaciones de Bellman
determina la longitud de los caminos mı́nimos:

uj = d(µ[1, j]) ∀j 6= 1
Ecuaciones de optimalidad ORED 113

En efecto, si no fuera ası́, existirı́a otra arborescencia {(p∗ (j), j)), j 6= 1}


asociada a un conjunto de caminos mı́nimos {µ∗ [1, j], j 6= 1} y para algún vértice
h ∈ V se verifica uh > d(µ∗ [1, h]). Se elige como tal vértice h, que no puede
ser el inicial, el primer vértice —en el sentido de la arborescencia p∗ — con la
propiedad anterior.
Al elegir ası́ el vértice h, se verifica, por construcción de la arborescencia p,
que
uh = up(h) + dp(h),h = mı́n{uk + dk,h }
k6=h

Por la elección del vértice h, se verifica que d(µ∗ [1, p∗ (h)]) = up∗ (h) y, por
consiguiente, se verifica la cadena de desigualdades

d(µ∗ [1, h]) = d(µ∗ [1, p∗ (h)]) + dp∗ (h),h = up∗ (h) + dp∗ (h),h ≥ up(h) + dp(h),h = uh

que contradice la hipótesis de partida uh > d(µ∗ [1, h]).

En el ejemplo 8.1, la solución del problema de camino mı́nimo desde M a T


es
M →L→F →S→T

y los valores de uj que determinan la longitud del camino mı́nimo desde M a


j 6= M y las etiquetas p(j) asociadas a la arborescencia solución son:

j p(j) uj
M M 0
L M 20
P M 27
F L 30
S F 120
T S 155

A pesar de estos resultados teóricos, la deducción de la solución de estas


ecuaciones no es tarea sencilla en general. Sin embargo, en el caso en el que no
existan circuitos se pueden reordenar los vértices de forma que la solución de
las ecuaciones de optimalidad es inmediata. El algoritmo asociado se estudia a
continuación.
ORED 114 Problema de Camino Mı́nimo. Vértice inicial fijo

8.3. Algoritmo para Redes sin circuitos


El algoritmo se basa en la siguiente propiedad

Proposición 8.2. Un digrafo no tiene circuitos si, y sólo si, sus vértices se pue-
den reordenar de forma que u = (i, j) ∈ U ⇐⇒ i < j ∀i, j ∈ V = {1, 2, . . . , n}

Demostración

⇐ Trivial.

⇒ Si el digrafo no tiene circuitos, existe un vértice al que no llega ningún


arco, este vértice será el número 1.
El subgrafo generado por V − {1} tampoco tiene circuitos, por lo que se
selecciona el vértice 2 como aquél al que no llegan arcos.
Este proceso se itera hasta llegar al subgrafo vacı́o.

A continuación se especifica un algoritmo que identifica la ordenación de


vértices apropiada para evaluar las longitudes de los caminos mı́nimos desde el
vértice raı́z, numerado como 1 al no tener ningún predecesor. Este algoritmo 8.1
se basa en la matriz de adyacencia B = (bij )i,j=1,...,n que identifica la existencia
del arco (i, j) cuando bij = 1
El vértice raı́z debe ser aquél al que no llega ningún arco y el algoritmo
reordena los vértices según la permutación σ siendo σ1 el primer vértice (raı́z)
y σn el último, del que no sale ningún arco.

La complejidad algorı́tmica de cada uno de los tres pasos del algoritmo: Ini-
cialización, ordenación de vértices y solución de las ecuaciones de optimalidad,
es O(n2 ), por lo que la complejidad total es O(n2 ).

Ejemplo 8.4. Sea el digrafo con 5 vértices, con matriz de adyacencia


 
0 1 0 1 0
 
 0 0 0 0 1 
 
B= 0 1 0 0 1 
 
 
 0 1 1 0 0 
 
0 0 0 0 0
Algoritmo para Redes sin circuitos ORED 115

Algoritmo 8.1: [u, p, σ] = CamM inSinCircuitos(B, D)


Inicialización:
Pn
qj = i=1 bij ∀j = 1, . . . , n
m=1
W = V = {1, . . . , n}
Ordenación de los vértices:
while W 6= ∅ do
Sea k ∈ W tal que qk = 0
σm = k
m=m+1
W = W − {k}
qj = qj − bkj ∀j ∈ W
end while
Solución de la ecuación de optimalidad:
uσ1 = 0
p(σ1 ) = σ1
for j = 2, . . . , n do
uσj = mı́nk<j {uσk + dσk ,σj } = uσk∗ + dσk∗ ,σj
p(σj ) = σk∗
end for

y con longitudes de los arcos especificadas por la matriz


 
0 7 ∞ 1 ∞
 
 ∞ 0 ∞ ∞ 2 
 
D= ∞ 4 0 ∞ 4 
 
 
 ∞ 4 1 0 ∞ 
 
∞ ∞ ∞ ∞ 0

representado en la figura 8.3.

1
4 3

1 4 4 4

7 2
1 2 5

Figura 8.3: Red del Ejemplo 8.4

El vértice raı́z debe ser 1, ya que la primera columna es nula. En un digrafo


sin circuitos, siempre existen una fila y una columna nulas.
ORED 116 Problema de Camino Mı́nimo. Vértice inicial fijo

1.
j 1 2 3 4 5
m=1 W = {1, 2, 3, 4, 5}
q(j) 0 3 1 1 2

2. k = 1 σ1 = 1

j 2 3 4 5
m=2 W = {2, 3, 4, 5}
q(j) 2 1 0 2

3. k = 4 σ2 = 4

j 2 3 5
m=3 W = {2, 3, 5}
q(j) 1 0 2

4. k = 3 σ3 = 3

j 2 5
m=4 W = {2, 5}
q(j) 0 1

5. k = 2 σ4 = 2

j
m=5 W = {5}
q(j) 0

6. k = 5 σ5 = 5

m=6 W =∅

El vector σ, que indica la reordenación de vértices es

σ = (1, 4, 3, 2, 5)

Los valores de u y p se determinan siguiendo esta ordenación, partiendo del


vértice σ1 = 1 y la inicialización:

1. u1 = 0 p(1) = 1

2. u4 = 0 + d14 = 1 p(4) = 1
Modelos de programación matemática asociados ORED 117

3. u3 = M in{u1 + d13 ; u4 + d43 } = M in{0 + ∞; 1 + 1} = 2 p(3) = 4

4. u2 = M in{u1 + d12 ; u4 + d42 ; u3 + d32 } = M in{0 + 7; 1 + 4; 2 + 4} =


5 p(2) = 4

5. u5 = M in{u1 + d15 ; u4 + d45 ; u3 + d35 ; u2 + d25 } = M in{0 + ∞; 1 + ∞; 2 +


4; 5 + 2} = 6 p(5) = 3

1 2
1
4 3

1 4 4

0 5 6
1 2 5

Figura 8.4: Arborescencia solución del Ejemplo 8.4

La arborescencia asociada al vector p se ilustra en la figura 8.4, donde se


han representado los arcos (p(j), j), siendo j ∈ {2, 3, 4, 5} los vértices y repre-
sentado el valor uj encima de los mismos; junto a los arcos se ha representado
su longitud.

8.4. Modelos de programación matemática asocia-


dos
Se pueden considerar dos problemas de optimización lineales asociados. El
primero se basa en la identificación de la variable de decisión que selecciona o
no los arcos como pertenecientes al camino mı́nimo que une dos vértices s y t
concretos. Se introduce la propiedad de total unimodularidad de la matriz de
incidencia de cualquier digrafo, que permitirá simplificar la solución de dicho
problema como un problema de programación lineal; posteriormente se plantea
el dual de dicho problema, que permitirá interpretar los valores uj introducidos
en las ecuaciones de Bellman como las variables duales.
El segundo propone un problema de programación lineal equivalente a la
solución de las ecuaciones de Bellman. A partir de éste, se propone un algoritmo
ORED 118 Problema de Camino Mı́nimo. Vértice inicial fijo

de relajación que resuelve el problema de camino mı́nimo desde un vértice fijo.


Su dual identificará la arborescencia óptima asociada a la solución del problema.

8.4.1. Modelo de selección de arcos. Unimodularidad


Considerando que hay que elegir un subconjunto de arcos que conforman un
camino, las variables a considerar son variables binarias xu ∈ {0, 1} ∀u ∈ U ;
el valor xu = 1 asociará el arco u ∈ U al camino mı́nimo y el valor xu = 0 lo
excluirá.
Para garantizar que los arcos elegidos determinen un camino entre s y t
hay que especificar tres condiciones, que están relacionadas con la matriz de
incidencia:

El camino sale del nodo s.


Más generalmente, el número de arcos del camino que salen de s debe
superar en 1 al número de arcos que entran en s, dicho de otro modo:
X X X X
xu = xu + 1 ⇔ xu − xu = 1
u∈w+ (s) u∈w− (s) u∈w+ (s) u∈w− (s)

Considerando que la matriz de incidencia se caracteriza por aiu = 1, −1, 0


si u ∈ w+ (i), ∈ w− (i), 6∈ w(i) respectivamente, la condición anterior se
puede especificar como:
m
X
asu = 1
u=1

que, por coherencia con otros modelos posteriores, se puede multiplicar


por −1 para obtener:
m
X
−asu = −1
u=1

El camino termina en el nodo t. Procediendo del mismo modo con el nodo


t, al que deben llegar un numero de arcos superior en una unidad al número
de arcos que salen de dicho nodo, se obtiene:
m
X
−atu = +1
u=1

Para los nodos restantes, debe entrar y salir el mismo número de arcos,
Modelos de programación matemática asociados ORED 119

pudiendo ser 0 este número en el caso en no pase el camino por el vértice,


1 si pasa una vez, etc. Se obtiene entonces:
m
X
−aiu = 0 ∀i ∈ V − {s, t}
u=1

Observación 8.2. Al considerar que a los nodos anteriores pueden llegar o salir
más de un arco se está suponiendo que los caminos pueden repetir nodos (incluir
un ciclo que pase por ellos); en este caso, no serı́an caminos elementales.

La función objetivo debe minimizar la suma de las longitudes de los arcos


seleccionados
X
M in du xu
u∈U

En forma matricial, el problema de minimizar el camino mı́nimo entre s y t


serı́a
M in dt x
−Ax =b
x ∈ {0, 1}m
s t
donde bt = (0 . . . 0, −1, 0 . . . 0, 1, 0 . . . 0) y A es la matriz de incidencia del digrafo
asociado al problema.
Si se relaja la restricción de ser binarias las variables xu exigiendo simple-
mente que sean enteras, la variable de decisión xu especificarı́a el número de
veces que se utiliza el arco u ∈ U ; el camino no serı́a entonces simple, pues repe-
tirı́a arcos. En cualquier caso, valores enteros mayores que 1 sólo tienen sentido
si existe un circuito de longitud negativa y el camino mı́nimo pasarı́a por repetir
dicho circuito un número arbitrariamente grande de veces, indicando ası́ que el
problema de programación matemática ası́ definido tendrı́a solución no acotada.
Además, como se analiza con más detalle en la siguiente subsección, la matriz
A es totalmente unimodular y, en consecuencia, la solución del problema de
programación relajado continuamente proporciona la solución del problema de
camino mı́nimo. En el caso en que no haya circuitos de longitud negativa, los
valores de xu sólo tomarán el valor 0 ó 1.
Por consiguiente, el modelo de programación lineal asociado al problema de
ORED 120 Problema de Camino Mı́nimo. Vértice inicial fijo

camino mı́nimo de un vértice al resto serı́a:



 M in

 dt x
PA −Ax =b

≥0

 x

En el ejemplo 8.4, la matriz de incidencia, cambiada de signo, y los vectores


b y d son:

 
7
     
−1 −1 0 0 0 0 0 −1 
 1 

   
1 0 −1 1 0 1 0  0  2 
   
    
 
−A =  0 0 0 −1 −1 0 1  b= 0  d= 4 
   
     
−1 −1 
 

 0 1 0 0 0 

 0 
  4 
 
0 0 1 0 1 0 0 1 
 4 

1

La solución del problema de programación binaria es:

x̄12 = 0 x̄14 = 1 x̄25 = 0 x̄32 = 0 x̄35 = 1 x̄42 = 0 x̄43 = 1

Relajación Continua. Unimodularidad


El término de Optimización Combinatoria se distingue del término más ge-
neral de Programación entera por considerar aquél problemas que están fuerte-
mente estructurados y tener, en consecuencia, propiedades especı́ficas.
Una de estas propiedades se refiere a la posibilidad de obtener la solución
del problema de programación relajándolo continuamente, es decir, obviar la
restricción de integralidad de las variables del modelo. Una opción, en este caso,
serı́a aplicar el algoritmo del simplex al problema entero y, olvidándose de la
restricción de integralidad, obtener la solución.
Esta situación es la que se presenta en el modelo de selección de arcos de
esta subsección. Puede ser identificada a partir de las propiedades algebraicas
de la matriz A del modelo de Programación entera asociado:
Modelos de programación matemática asociados ORED 121


 M in

 ct x
PE Ax =b

≥ 0 entera

 x

Para este problema P E se definen

S = {x ∈ IRn / Ax = b, x ≥ 0 entera}

y
zP∗ E = M in{ct x / x ∈ S}

El problema de programación lineal que resulta de eliminar la restricción


de integralidad de la variable x es una relajación del problema original, en el
sentido de que se han eliminado parte de sus restricciones.
A continuación se introduce formalmente el concepto de relajación de un
problema de optimización.

Definición 8.1. Dado un problema de optimización


(
M in zP (x)
P
x ∈ SP

Una relajación del problema P es un nuevo problema de optimización:


(
M in zRP (x)
RP
x ∈ SRP

verificando:
(
SP ⊂ SRP
zP (x) ≥ zRP (x) ∀x ∈ SP

Introduciendo
zP∗ = M in{zP (x) / x ∈ SP }

y

zRP = M in{zRP (x) / x ∈ SRP }

se deducen automáticamente dos propiedades:


ORED 122 Problema de Camino Mı́nimo. Vértice inicial fijo

Proposición 8.3. Si RP no tiene solución factible, P tampoco la tiene.

Proposición 8.4. Si RP tiene solución factible, se verifica que zP∗ ≥ zRP


Para el problema P E introducido anteriormente se puede definir la relajación


continua si no se consideran las restricciones de integralidad de las variables:

 M in

 ct x
RC Ax =b

≥0

 x

Según la notación anterior, el conjunto SRC serı́a el conjunto de soluciones


(continuas) factibles, que incluye al conjunto de soluciones factibles enteras; la
función objetivo del problema relajado serı́a la misma, es decir, zRC = ct x.
Consecuentemente, si la relajación continua alcanza el óptimo en una so-
lución entera, este óptimo es la solución óptima entera. En caso contrario, la
información obtenida puede ser útil para llegar al óptimo entero, según se es-
tudia en la siguiente sección. En el caso que la relajación continua termine con
solución no acotada, el problema entero o no tiene solución factible o tiene
solución no acotada.

En determinadas condiciones se puede asegurar que la solución del problema


RC proporciona directamente la solución del problema P E.

Ejemplo 8.5. Sea el problema de programación entera:





 M ax 2x1 +3x2

x1 +x2 +xh1 =4




PE x1 +xh2 =2

+xh3



 x2 =3


 x ≥ 0 entera

Es fácil comprobar que la solución del problema relajado continuamente RC


es el vector (1, 3, 0, 1, 0), que es solución factible de P E.

Las condiciones generales que permiten obtener la solución del problema P E


a partir de la solución de RC están relacionadas con la propiedad de unimodu-
laridad de la matriz A de restricciones del problema P E.
Modelos de programación matemática asociados ORED 123

Definición 8.2. Una matriz entera A de dimensión m × n se dice totalmente


unimodular si el determinante de cualquier submatriz cuadrada de A es igual a
0, 1 o −1.

La matriz A asociada al ejemplo 8.5


 
1 1 1 0 0
 
A=
 1 0 0 1 0 

0 1 0 0 1

es totalmente unimodular.

Al poder elegir submatrices de tamaño 1 × 1, se deduce que cualquier ele-


mento aij de la matriz A debe ser igual a 0, 1 o −1.
La implicación inversa no es cierta; por ejemplo, el determinante de la matriz
 
1 −1 0
 
A=
 0 1 −1 

1 0 1

es igual a 2.

Sea
SRC = {x ∈ IRn / Ax = b, x ≥ 0}

el conjunto de soluciones factibles del problema relajado RC en su forma estándar.

Definición 8.3. Se dice que SRC 6= ∅ es integral si sus puntos extremos son
enteros, es decir, son soluciones factibles del problema P E.

Se verifica la siguiente propiedad:

Proposición 8.5. Si la matriz de restricciones A es totalmente unimodular,


entonces SRC es integral para todo b ∈ Zm tal que SRC 6= ∅.

Demostración
Dada una base B ⊂ A, se verifica necesariamente que |B| ∈ {+1, −1}. Por
la fórmula de Cramer, la inversa de una matriz es la traspuesta de su matriz
adjunta. Al ser A una matriz totalmente unimodular, todos los elementos de la
ORED 124 Problema de Camino Mı́nimo. Vértice inicial fijo

matriz adjunta de B ⊂ A, son 0, 1 o −1, de forma que se verifica, si B a es la


matriz adjunta de B:

1
x̄tB = bt Ba
|B|

En consecuencia, cada componente de la solución básica x̄s es el resultado


de sumar y restar las componentes del vector de términos independientes, que
son números enteros.

Sea la matriz B y su matriz adjunta B a :


   
1 1 0 0 −1 1
Ba = 
   
B=
 1 0 0 
  −1 1 −1 

0 1 1 0 0 −1

Al ser |B| = −1, cualquier vector b ∈ Z3 determinará una solución entera


del sistema de ecuaciones Bx = b, ya que

x̄t = (x̄1 , x̄2 , x̄3 ) = (b2 , b1 − b2 , −b1 + b2 + b3 )

La proposición 8.5 se puede generalizar al caso en que el conjunto de solucio-


nes factibles del problema relajado esté definido por un conjunto de inecuaciones:

SRC = {x ∈ IRn / Ax ≤ b, x ≥ 0}

Sólo hay que considerar que si A es una matriz totalmente unimodular,


la matriz ampliada (A, I) definida al añadir m vectores unitarios, también es
totalmente unimodular.

En el ejemplo 8.5, habrı́a sido suficiente comprobar que la matriz


 
1 1
 
A=
 1 0 

0 1
Modelos de programación matemática asociados ORED 125

es totalmente unimodular al considerar el problema con restricciones:





 M ax 2x1 +3x2

x1 +x2 ≤4




PE x1 ≤2

≤3



 x2


 x ≥ 0 entera

La matriz de incidencia de un digrafo es totalmente unimodular, por lo que


en el modelo de selección de arcos serı́a suficiente con aplicar el algoritmo del
simplex para obtener la arborescencia solución. A continuación se demuestra
este resultado.

Proposición 8.6. La matriz de incidencia de un digrafo es totalmente unimo-


dular.

Demostración
La matriz A es totalmente unimodular si cualquier submatriz cuadrada tiene
determinante 0, 1 ó −1. La demostración se hace por inducción del número k
de filas y columnas de la matriz cuadrada.

k=1
Por definición, todos los elementos de A son 0, 1 ó −1.

Se supone cierta la propiedad para cualquier submatriz (k − 1) × (k − 1).

Sea B una submatriz cuadrada k × k.


Hay tres opciones exclusivas y exhaustivas:

• Existe una columna con todos los elementos nulos.


En este caso, el determinante de B es 0.
• Existe una columna con un único elemento distinto de 0.
El determinante de B será el producto de dicho elemento (1 ó −1)
por el determinante que resulta al quitar de B la fila y columna de
dicho elemento y variando el signo si es el caso. Por la hipótesis de
inducción, este determinante vale 0, 1 ó −1.
ORED 126 Problema de Camino Mı́nimo. Vértice inicial fijo

• Todas las columnas tienen dos elementos distintos de 0.


En este caso, al sumar todas las filas de B el vector 0, se concluye
que det(B) = 0.

En cualquier caso, se ha demostrado que el determinante de cualquier


matriz cuadrada k × k toma los valores 0, 1 ó −1.

Modelo dual
A continuación se plantea el problema dual del problema PA y se interpre-
tarán las variables duales.
Recordando el planteamiento de pares duales en programación lineal en for-
ma canónica:
 
 M in

 ct x  M ax

 bt u
Pc Ax ≥b Dc At u ≤ c
 
≥0 u ≥0
 
 x 

Si se sustituye la inecuación del problema Pc por una ecuación, se tiene el


formato del problema PA :

t
 M in c x
 (
bt u

M ax
Ps Ax = b Ds
 At u ≤ c
x ≥0

En el problema dual DA habrá tantas variables como restricciones en PA ,


en total n = |V |; sea ui la variable dual asociada al nodo i ∈ V . Por otra parte,
habrá en el problema dual tantas restricciones como variables en PA , en total
m = |U |. El par de problemas duales será entonces:


 M in
 dt x (
bt u

M ax
PA −Ax =b DA
 uj − uk ≤ dkj ∀(k, j) ∈ U
≥0

 x

En el ejemplo 8.4, el problema DA se concreta de la siguiente forma:


Modelos de programación matemática asociados ORED 127



 M ax −u1 u5

−u1 +u2 ≤ 7





−u1 ≤ 1



 +u4


 −u2 +u5 ≤ 2
DA


 u2 −u3 ≤ 4

−u3 +u5 ≤ 4





u2 −u4 ≤ 4





−u4 ≤ 1

u3

El valor u5 de la solución de este problema coincide con la longitud mı́nima


del camino que sale de 1 y va a 5, este camino tiene la propiedad de que para
todos sus arcos, las restricciones se alcanzan en la igualdad; en este caso, las
asociadas a los arcos: {(1, 4); (4, 3); (3, 5)}. La solución completa, identificando
también el vector p, es la siguiente:

j p(j) uj
1 1 0
2 4 5
3 4 2
4 1 1
5 3 6

Conviene destacar que este problema resuelve sólo el camino que une dos
vértices prefijados, los otros valores de los uj asociados a vértices por los que no
pasa dicho camino no identifican las longitudes mı́nimas entre el vértice inicial
y dicho j.

En el ejemplo anterior, en concreto, otra solución óptima del problema DA


es (0, 4, 2, 1, 6), pues verifica todas las restricciones y alcanza el mismo valor de
la función objetivo u5 = 6; sin embargo, el valor u2 = 4 no identifica la longitud
del camino mı́nimo que va desde 1 a 2. Este vértice 2 no pertenece al camino
mı́nimo µ[1, 5] = {(1, 4) − (4, 3) − (3, 5).

Para resolver el problema del camino mı́nimo desde un vértice al resto, hay
que plantear otro modelo de programación equivalente a las ecuaciones de Bell-
man.
ORED 128 Problema de Camino Mı́nimo. Vértice inicial fijo

8.4.2. Modelo de las ecuaciones de Bellman. Algoritmo de


relajación
La solución de las ecuaciones de Bellman
(
u1 = 0
B
uj = mı́nk6=j {uk + dkj } j 6= 1

coincide con la solución del siguiente problema de programación lineal con n − 1


variables (u2 , . . . , un ), pues se fija u1 = 0, y m restricciones:
(
M ax u2 + · · · + u n
P
uj − uk ≤ dkj ∀(k, j) ∈ U

En el ejemplo 8.4, este problema serı́a el siguiente:




 M ax u2 +u3 +u4 +u5

−u1 +u2 ≤ 7





−u1 ≤ 1



 +u4


 −u2 +u5 ≤ 2
P


 u2 −u3 ≤ 4

−u3 +u5 ≤ 4





u2 −u4 ≤ 4





−u4 ≤ 1

u3

y cuya solución era

u1 = 0 u2 = 5 u3 = 2 u4 = 1 u5 = 6

Hay que observar que, en este caso también, en las restricciones asociadas
a los arcos de la arborescencia solución, la desigualdad se verifica en el lı́mite,
es decir, se verifica la igualdad.

Formalmente, se tiene la siguiente proposición

Proposición 8.7. Dado un vector de dimensión n, (u1 , . . . , un ), se verifica que

u∈B ⇐⇒ u∈P

Demostración
Modelos de programación matemática asociados ORED 129

⇒ Por definición de los uj , se verifica que

uj ≤ uk + dkj ∀(k, j) ∈ U

y, por consiguiente, el vector u es una solución del problema P .


Para ver que es la que maximiza la función objetivo u2 + · · · + un , se
demuestra que no puede haber otra solución u0 de P mejor, puesto que en
este caso existe al menos un j ∈ {2, . . . , n} tal que u0j > uj , o, lo que es
equivalente, u0j = uj + δj con δj > 0; el vector δ recoge la diferencia entre
las dos soluciones: u0 = u + δ.
A partir de este vértice concreto j, sea p(j) el predecesor de j en la
arborescencia asociada a las ecuaciones de Bellman, por lo que verifica
uj = up(j) + dp(j)j .
Al ser u0 una solución de P , se verifica u0j − u0k ≤ dkj para todo k 6= j, en
particular, si k = p(j) y considerando que u0p(j) = up(j) + δp(j) , se tiene:

u0j − u0p(j) ≤ dp(j)j ⇐⇒ uj + δj − up(j) − δp(j) ≤ dp(j)j

Se concluye ası́ (uj − up(j) = dp(j)j ) que δj ≤ δp(j) y δp(j) > 0.


El proceso se itera a p(p(j)), p(p(p(j))), . . . hasta llegar a la raı́z 1 y concluir
que δ1 > 0, que contradice que

u01 = u1 + δ1 = u1 = 0

⇐ Por ser uj − uk ≤ dkj ∀(k, j) ∈ U y ser dkj = ∞ ∀(k, j) 6∈ U se verifica


siempre que

uj ≤ uk + dkj ∀k 6= j, ∀j 6= 1 ⇐⇒ uj ≤ mı́n{uk + dkj } ∀j 6= 1


k6=j

Además, uj alcanza la cota superior ∀j 6= 1. En caso contrario, si existe


un j tal que

uj < mı́n{uk + dkj }


k6=j

se elegirı́a el primero que está más cerca del vértice 1 siguiendo el vector
ORED 130 Problema de Camino Mı́nimo. Vértice inicial fijo

p definido por uh = up(h) + dp(h),h para aquellos vértices h que sı́ alcancen
la cota superior; para ese vértice j, se define un nuevo valor:

u0j = mı́n{uk + dkj }


k6=j

y para todos los posteriores a este vértice j (en el sentido del vector p
anterior) se reajusta el nuevo valor aumentándolo si es el caso. Este proceso
se repite hasta que todos los valores uj alcancen la cota máxima y, por
consiguiente, se verifican las ecuaciones de Bellman:

uj = mı́n{uk + dkj } ∀j 6= 1
k6=j

Considerando que el problema P es equivalente a la solución del problema de


camino mı́nimo desde el vértice 1 al resto, se sugiere el siguiente procedimiento
de relajación, que se basa en dar una cota superior de la función objetivo sin
considerar las restricciones de P e ir incorporando éstas hasta llegar a la solución
óptima.
La aproximación anterior de las magnitudes uj por cotas superiores se ini-
cializa con uj = d1j , que es siempre mayor o igual que la distancia del camino
mı́nimo de 1 a j; esta inicialización está asociada a la arborescencia p(j) = 1
para todo j ∈ V .
La restricción uj −uk ≤ dkj , cuando no es verificada, indica que se puede ob-
tener una cota superior con valor inferior si se ajusta uj = uk +dkj determinando
el acceso a j desde k, por lo que se actualiza p(j) = k.
Para el caso en que uj = uk = ∞, se considera que uj − uk = ∞.
El algoritmo de relajación, introducido por Ford [18]en 1956, se detalla como
algoritmo 8.2.

La complejidad algorı́tmica del algoritmo de relajación es O(m · n), ya que


cada ciclo de comprobaciones implica los m arcos y debe realizarse dicho ciclo
hasta que no se modifique ningún uj . En el peor de los casos, cuando la arbo-
rescencia solución es un camino de longitud n − 1, en cada uno de los ciclos
anteriores se fija sólo uno de los uj , por lo que el número máximo de ciclos será
n − 1. De ahı́ la complejidad obtenida.
Modelos de programación matemática asociados ORED 131

Algoritmo 8.2: [u, p] = CamM inRelajacion(D)


Entrada:
D : Matriz asociada a la red dirigida (di,j = du si u = (i, j) ∈ U ; di,j = ∞ si
no existe el arco (i, j))
Salida:
u : Vector que identifica la distancia del camino mı́nimo µ[1, j] ∀j ∈ V
p : Vector que identifica la arborescencia del camino mı́nimo que parte de 1,
1 → · · · → p(p(j)) → p(j) → j.
Inicialización:
La arborescencia inicial es el conjunto de arcos que salen de 1 al resto de
nodos.
u1 = 0
uj = d1,j ∀j = 2, . . . , n
p(j) = 1 ∀j = 1, . . . , n
Proceso de comparación:
Se buscan todos los arcos para que verifiquen la restricción.
while ∃(k, j) ∈ U tal que uj − uk > dkj do
uj = uk + dk,j
p(j) = k
end while

Aplicando el algoritmo de relajación al ejemplo 8.4, se tiene:

1. Inicialización

j 1 2 3 4 5
uj 0 7 ∞ 1 ∞
p(j) 1 1 1 1 1

2. Primer ciclo de comprobaciones:

u2 − u1 ≤7
u4 − u1 ≤1
u5 − u2 6≤ 2 u5 = u2 + 2 = 9 p(5) = 2
u2 − u3 ≤4
u5 − u3 ≤4
u2 − u4 6≤ 4 u2 = u4 + 4 = 5 p(2) = 4
u3 − u4 6≤ 1 u3 = u4 + 1 = 2 p(3) = 4

Se obtiene ası́
ORED 132 Problema de Camino Mı́nimo. Vértice inicial fijo

j 1 2 3 4 5
uj 0 5 2 1 9
p(j) 1 4 4 1 2

3. Segundo ciclo de comprobaciones:

u2 − u1 ≤7
u4 − u1 ≤1
u5 − u2 6≤ 2 u5 = u2 + 2 = 7 p(5) = 2
u2 − u3 ≤4
u5 − u3 6≤ 4 u5 = u3 + 4 = 6 p(5) = 3
u2 − u4 ≤4
u3 − u4 ≤1

Se obtiene ası́

j 1 2 3 4 5
uj 0 5 2 1 6
p(j) 1 4 4 1 3

4. Tercer ciclo de comprobaciones:

u2 − u1 ≤7
u4 − u1 ≤1
u5 − u2 ≤2
u2 − u3 ≤4
u5 − u3 ≤4
u2 − u4 ≤4
u3 − u4 ≤1

Se obtiene ası́, al no haberse modificado ningún uj , la solución óptima:

j 1 2 3 4 5
uj 0 5 2 1 6
p(j) 1 4 4 1 3
Modelos de programación matemática asociados ORED 133

En el ejemplo 8.4 se ha llegado al óptimo después de dos ciclos de comproba-


ciones al ser 2 el número máximo de arcos de cualquiera de los caminos mı́nimos.
Con el fin de detectar circuitos de longitud negativa, hay que realizar n ciclos,
si no se ha modificado ningún uj , la red no tiene circuitos de longitud negativa
y se ha llegado al óptimo.

El problema dual del problema P anterior identifica la arborescencia que


caracteriza la solución del problema de camino mı́nimo. El problema dual D es
el siguiente:
 P
 M in dkj xkj

 (k,j)∈U
P P
D k xkj − i xji = 1 ∀j 6= 1

≥0 ∀(k, j) ∈ U

 xkj

La variable de decisión {xkj / (k, j) ∈ U } se interpreta de la siguiente forma:

xkj = 0 si el arco (k, j) no pertenece a la arborescencia.

xkj ≥ 1 identifica los arcos de la arborescencia. Además, es un número


entero que es igual al número de caminos que unen la raı́z 1 con algún
vértice utilizando dicho arco.

En el caso del ejemplo 8.4, el problema dual es:

M in 7x12 + x14 + · · · + 4x42 + x43


x12 + x42 + x32 − x25 =1
x43 − x32 − x35 =1
x14 − x42 − x43 =1
x25 + x35 =1
xu ≥ 0 ∀u ∈ U

La solución de este problema es:

x̄12 = 0 x̄14 = 4 x̄25 = 0 x̄32 = 0 x̄35 = 1 x̄42 = 1 x̄43 = 2

y alcanza un valor de la función objetivo igual a 14 = u2 + u3 + u4 + u5 .

Este problema dual D no determina la arborescencia de mı́nimo peso, puesto


que las variables xu no son binarias, sino que al identificar xu el número de
ORED 134 Problema de Camino Mı́nimo. Vértice inicial fijo

caminos mı́nimos que salen de 1 y utilizan el arco u ∈ U , está minimizando la


suma total de todos los caminos que salen de 1.

8.5. Algoritmo de Dijkstra


Para el caso en que las longitudes de los arcos sean no negativas, uno de los
algoritmos más eficientes es el de Dijkstra [12], introducido en 1959.
En este algoritmo, se aproxima para cada P ⊂ V y para cada j ∈ V , la
longitud del camino mı́nimo desde 1 a j, uj , por

uP
j ≡ longitud del camino mı́nimo de 1 a j utilizando como vértices
intermedios los vértices del conjunto P ⊂ V

De tal forma, que se verifica cuando P = {1}:


uP
1 =0
uP
j = d1j ∀j 6= 1
y en la medida en que P ⊂ V va incorporando vértices, las longitudes mı́nimas
uP
j decrecen hasta alcanzar el valor uj cuando P = V :

{1} 0
uj ≥ · · · ≥ uP P V
j ≥ uj ≥ · · · ≥ uj = uj ∀j ∈ V, ∀P ⊂ P 0

El conjunto P ⊂ V se denomina conjunto de vértices permanentes, que se


distingue del conjunto de vértices transitorios T = V − P . La interpretación de
uP
j para ambos conjuntos difiere:

j ∈ P:

En este caso, uP
j = uj = d(µ [1, j])

j∈T

En este caso, uP
j ≥ uj = d(µ [1, j])

Inicialmente, P = {1} y T = {2, . . . , n}. En cada iteración, incorpora desde


T a P un vértice, al que llega el arco de menor peso que une un vértice de P
con otro de T .
Este algoritmo 8.3 es de tipo voraz y se puede concretar de la siguiente
forma:
Algoritmo de Dijkstra ORED 135

Algoritmo 8.3: [u, p] = CamM inDijkstra(D)


Entrada:
D : Matriz asociada a la red dirigida (di,j = du si u = (i, j) ∈ U ; di,j = ∞ si
no existe el arco (i, j))
Salida:
u : Vector que identifica la distancia del camino mı́nimo µ[1, j] ∀j ∈ V
p : Vector que identifica la arborescencia del camino mı́nimo que parte de 1,
1 → · · · → p(p(j)) → p(j) → j.
Inicialización:
Inicialmente, P es el nodo 1 ∈ V , T es V − P ; la arborescencia inicial es el
conjunto de arcos que salen de 1.
P = {1} T = {2, . . . , n}
u1 = 0, uj = d1j ∀j = 2, . . . , n
p(j) = 1 ∀j = 1, . . . , n
Proceso de actualización:
while T 6= ∅ do
El nodo k ∈ T es el más próximo a P , se añade a P .
uk ≡ mı́nj∈T {uj }
P = P ∪ {k} T = T − {k}
for j ∈ T do
if uj > uk + dk,j then
Al nodo j ∈ T compensa ir desde k.
p(j) = k
uj = uk + dk,j
end if
end for
end while
ORED 136 Problema de Camino Mı́nimo. Vértice inicial fijo

La complejidad algorı́tmica de este algoritmo es O(n2 ).


El algoritmo de Dijkstra garantiza la construcción del camino mı́nimo al ser
las longitudes no negativas. Este resultado se demuestra a continuación

Proposición 8.8. Sea la red (G = (V, U ); {du , u ∈ U }). Supongamos que du ≥


0, ∀u ∈ U . Entonces, el algoritmo de Dijkstra construye los caminos de longitud
mı́nima.

Demostración:
Sea la iteración del algoritmo donde se incluye el vértice k como vértice
permanente. En ese instante, uP
k = uk es la longitud del camino mı́nimo que va
desde 1 a k utilizando, exclusivamente, vértices permanentes:
Si existiera otro camino de longitud estrictamente menor, irı́a por vértices
de P hasta llegar al vértice h, que serı́a el primero de los vértices transitorios.
La longitud de este camino a través de h no puede ser inferior a uP
k , ya que
uP P
k ≤ uh y desde el vértice h hasta el vértice k hay que sumar una cantidad no
negativa, puesto que du ≥ 0 ∀u ∈ U .
Por tanto, uP
k es la longitud del camino mı́nimo que va desde 1 a k.
Como en ninguna iteración se modifican las cantidades uP
j para los vértices
permanentes, cuando T = ∅ se han conseguido todos los caminos mı́nimos.

Aplicando el algoritmo de Dijkstra al ejemplo 8.1, se obtienen las siguientes


iteraciones:

1. P = {M }

j M L P F S T
uj 0 20 27 40 ∞ ∞
p(j) M M M M M M

k=L

2. P = {M, L}

j M L P F S T
uj 0 20 27 30 ∞ ∞
p(j) M M M L M M
Algoritmo de Bellman-Ford ORED 137

k=P

3. P = {M, L, P }

j M L P F S T
uj 0 20 27 30 127 177
p(j) M M M L P P

k=F

4. P = {M, L, P, F }

j M L P F S T
uj 0 20 27 30 120 177
p(j) M M M L F P

k=S

5. P = {M, L, P, F, S}

j M L P F S T
uj 0 20 27 30 120 155
p(j) M M M L F S

k=T

Observación 8.3. En el caso en que la red dirigida tenga longitudes negati-


vas, el algoritmo de Dijkstra no determina necesariamente el camino mı́nimo.
Al aplicar el algoritmo a la red representada en la figura 8.5, se obtendrı́a la
solución u1 = 0, u2 = 5 y u3 = 2; siendo la solución óptima u1 = 0, u2 = 5 y
u3 = 1.

8.6. Algoritmo de Bellman-Ford


En el caso general, cuando existen circuitos de longitud mayor o igual que
0 y arcos de longitud negativa, una alternativa para obtener la solución de las
ecuaciones de optimalidad consiste en aproximar el camino mı́nimo a cualquier
vértice por el camino mı́nimo con 1, 2, . . . arcos. Es la idea del algoritmo de
ORED 138 Problema de Camino Mı́nimo. Vértice inicial fijo

Bellman-Ford, basado en los trabajos de Ford [18] y Bellman [6] ya referidos


anteriormente.
Se distingue ası́ entre uj , la longitud del camino mı́nimo entre 1 y j y

utj ≡ longitud del camino mı́nimo que sale de 1 y va a j con t arcos o menos

Al existir camino de longitud mı́nima, se verifica que

u1j = d1j un−1


j = uj ∀j ∈ {1, . . . , n}

Otra propiedad que se verifica es la siguiente

u1j ≥ u2j ≥ · · · ≥ un−1


j ∀j ∈ {1, . . . , n}

El algoritmo8.4 de Bellman-Ford queda de la siguiente forma:

Es fácil comprobar que la complejidad algorı́tmica es O(n3 ).


Aplicando el algoritmo de Bellman-Ford al ejemplo 8.1, se obtiene:

1. t = 1

j M L P F S T
utj 0 20 27 40 ∞ ∞
p(j) M M M M M M

2. t = 2

j M L P F S T
utj 0 20 27 30 127 177
p(j) M M M L P P

5
1 2

2
-4

Figura 8.5: Red con arco negativo


Algoritmo de Bellman-Ford ORED 139

Algoritmo 8.4: [u, p] = CamM inBellmanF ord(D)


Entrada:
D : Matriz asociada a la red dirigida (di,j = du si u = (i, j) ∈ U ; di,j = ∞ si
no existe el arco (i, j))
Salida:
u : Vector que identifica la distancia del camino mı́nimo µ[1, j] ∀j ∈ V
p : Vector que identifica la arborescencia del camino mı́nimo que parte de 1,
1 → · · · → p(p(j)) → p(j) → j.
Inicialización:
Inicialmente, ut identifica las longitudes de caminos mı́nimos con 0 ó 1 arco;
la arborescencia inicial es el conjunto de arcos que salen de 1.
t=1
ut1 = 0, utj = d1j ∀j = 2, . . . , n
p(j) = 1 ∀j = 1, . . . , n
Proceso de actualización:
for t = 1, 2, . . . , n − 2 do
Determinación de los caminos mı́nimos utilizando t + 1 arcos.
for j = 1, 2, . . . , n do
Para todo j ∈ V se determina el nodo anterior k ∈ V del camino
mı́nimo con t + 1 arcos.
utk + dkj ≡ mı́nl6=j {utl + dlj }
Se compara con  t el tcamino mı́nimo con t arcos.
ut+1
j = M in uj , uk + dkj
t t
if uj > uk + dk,j then
Y si compensa usar un arco más, se modifica la arborescencia.
p(j) = k
end if
end for
end for
Si existe solución óptima, se identifica u con un−1
uj = un−1
j ∀j = 1, . . . , n
ORED 140 Problema de Camino Mı́nimo. Vértice inicial fijo

3. t = 3

j M L P F S T
utj 0 20 27 30 120 162
p(j) M M M L F S

4. t = 4

j M L P F S T
uj 0 20 27 30 120 155
p(j) M M M L F S

5. t = 5

j M L P F S T
uj 0 20 27 30 120 155
p(j) M M M L F S

Gráficamente, la arborescencia asociada al camino mı́nimo es la formada por


los arcos marcados por un cı́rculo en la figura 8.6.

10 90
L F S

40 100
20 9 11 35

27 150
M P T

Figura 8.6: Arborescencia solución de la red de aeropuertos del Ejemplo 8.1

El algoritmo de Bellman-Ford no necesita agotar las n − 1 iteraciones mayo-


res. Esta posibilidad se detalla en la siguiente proposición.

Proposición 8.9. Si al aplicar el algoritmo de Bellman-Ford, para algún t se


verifica:
ut+1
j = utj ∀j ∈ V

entonces se verifica que se ha alcanzado ya la arborescencia óptima y

uj = utj ∀j ∈ V
Algoritmo de Bellman-Ford ORED 141

Demostración
De no ser ası́, existirı́a un k ∈ V tal que ut+2
k < ut+1
k y, en consecuencia,
existirı́a un h 6= k tal que

ut+1
k > ut+2
k = ut+1
h + dhk

Por hipótesis, utj = ut+1


j para todo j ∈ V y, en particular, utk = ut+1
k y
uth = ut+1
h .
Por consiguiente, la primera desigualdad se transforma en

utk = ut+1
k > ut+1
h + dhk = uth + dhk

y se concluye que utk > uth + dhk , o lo que es lo mismo, ut+1


k = uth + dhk < utk ,
que está en contradicción con la hipótesis inicial.

Observación 8.4. Con este algoritmo se pueden detectar los circuitos de lon-
gitud negativa sin más que iterar hasta t = n y observar que existe al menos
un vértice j verificando unj < un−1
j ; a partir de dicho vértice se van sondeando
vértices siguiendo por el vector p(.) y todos los antecesores hasta identificar el
circuito; este proceso se repite para todos los vértices verificando unj < un−1
j y
que no hayan sido sondeados para detectar otros circuitos.
ORED 142 Problema de Camino Mı́nimo. Vértice inicial fijo
Capı́tulo 9
Problema de Camino Mı́nimo.
Extensiones

La extensión natural del problema de camino mı́nimo desde un vértice fijo


es la de considerar variable este vértice y determinar ası́ el camino mı́nimo entre
cualquier par de vértices. Esta es la idea del algoritmo matricial. No obstante,
se puede conseguir para este problema una complejidad algorı́tmica mejor con
el algoritmo de Floyd-Warshall.
Otra generalización del problema de camino mı́nimo consiste en añadir un
criterio, que puede ser, por ejemplo, el tiempo que se tarda en recorrer la distan-
cia asociada a cada arco. El problema de redes con tiempo de tránsito considera
este tiempo de tránsito como una restricción y plantea el problema de camino
mı́nimo sin violar esta restricción.
Si en lugar de asignar a cada camino la suma de las longitudes de sus arcos
y determinar el camino de longitud mı́nima, sustituimos los operadores suma y
mı́nimo por otros operadores se pueden resolver distintos problemas en redes.
Serı́a, por ejemplo, el Problema de embotellamiento.

9.1. Camino mı́nimo entre cualquier par de vértices


Dada la red dirigida (G = (V, U ); {du , u ∈ U }), el problema es identificar el
camino mı́nimo entre cualquier par de vértices i, j ∈ V .
Generalizando el vector (u1 , u2 , . . . , un ), que especifica la longitud de los
caminos mı́nimos desde el vértice 1 al resto, se introduce
ORED 144 Problema de Camino Mı́nimo. Extensiones

uij ≡ longitud del camino mı́nimo µ∗ [i, j]


Se tiene ası́ definida la matriz

U = (ui,j )i,j∈{1,...,n}

que identifica la longitud de todos los caminos mı́nimos posibles en la red diri-
gida.
Análogamente, para identificar cada uno de estos caminos mı́nimos, se in-
troduce la matriz
P = (pi,j )i,j∈{1,...,n}

que identifica en cada fila i la arborescencia asociada al camino mı́nimo que


parte del vértice i ∈ {1, . . . , n}.
Ası́, por ejemplo, el camino mı́nimo que va desde i a j, con distancia d(µ∗ [i, j]) =
ui,j , se define por:

µ∗ [i, j] : i → pi,···pi,pi,j → · · · → pi,pi,j → pi,j → j

Las matrices U y P generalizan respectivamente a los vectores u y p asocia-


dos al problema de camino mı́nimo desde el vértice 1 al ser dichos vectores la
primera fila de las matrices:

p(j) = p1,j u(j) = u1,j ∀j = 2, . . . , n

Para resolver el problema, y siguiendo la idea del algoritmo de Bellman-Ford,


se tiene el siguiente algoritmo:

9.1.1. Algoritmo matricial


Sea
uti,j ≡ longitud del camino mı́nimo µt [i, j] con t o menos arcos.
La inicialización, considerando 1 arco o menos, es

u1i,j = dij ∀i, j ∈ {1, . . . , n}

El algoritmo 9.1 se detalla a continuación:


Camino mı́nimo entre cualquier par de vértices ORED 145

Algoritmo 9.1: [U, P] = CamMinMatricial(D)


Entrada:
D : Matriz asociada a la red dirigida (dij = du si (i, j) ∈ U ; dij = ∞ si no
existe el arco (i, j))
Salida:
U : Matriz que identifica las distancias de los caminos mı́nimos
µ[i, j] ∀i, j ∈ V
P : Vector que identifica en cada fila i la arborescencia del camino mı́nimo
que parte de i, i → · · · → Pi,Pi,j → Pi,j → j.
Inicialización:
Las arborescencias iniciales son el conjunto de arcos que salen de cada nodo
i al resto de nodos.
t=1
uti,j = di,j ∀i, j ∈ {1, . . . , n}
pi,j = i ∀i, j ∈ {1, . . . , n}
Proceso:
Se identifican los caminos que salen del nodo i ∈ V .
for i = 1, n do
El ı́ndice t especifica el número de arcos utilizados
for t = 1, n − 2 do
for j = 1, n do
Para cada nodo j ∈ V se identifica el nodo previo k ∈ V que
minimiza la distancia utilizando t + 1 arcos.
uti,k + dkj ≡ mı́nl6=j {uti,l + dlj }
n o
ut+1
i,j = M in u t
i,j , ut
i,k + d kj
Se comprueba si compensa utilizar t + 1 arcos en lugar de t para ir
desde i hasta j.
if uti,j > uti,k + dkj then
Si compensa, se actualiza la arborescencia asociada a i.
pi,j = k
end if
end for
end for
end for
ORED 146 Problema de Camino Mı́nimo. Extensiones

1
1 2
5
2 2
4
1
4 3

Figura 9.1: Red dirigida

El esquema de cálculo es el mismo que el de Bellman-Ford, sólo que añadien-


do un bucle exterior en el que varı́a la raı́z i de la arborescencia. Ası́ pues, si la
complejidad algorı́tmica del algoritmo de Bellman-Ford era O(n3 ), la del algo-
ritmo matricial es O(n4 ).

Ejemplo 9.1. Sea la red dirigida, representada en la figura 9.1 con 4 vértices
y matrices de adyacencia B y de distancias D las especificadas a continuación:
   
0 1 0 1 0 1 ∞ 2
   
 0 0 1 1   ∞ 0 2 4 
B=  D=
 ∞

 0
 0 0 1 
  ∞ 0 1 

0 1 0 0 ∞ 5 ∞ 0

La inicialización proporciona las matrices U 0 y P :


   
0 ∞ ∞ ∞ 1 1 1 1
   
 ∞ 0 ∞ ∞   2 2 2 2 
U0 = 
 ∞
 P = 
 ∞ 0 ∞ 

 3
 3 3 3 

∞ ∞ ∞ 0 4 4 4 4

Las longitudes de los caminos mı́nimos y la matriz de las 4 arborescencias


asociadas acotando en 1 y 2 el número de arcos de cada uno de los caminos son:
   
0 1 ∞ 2 1 1 1 1
   
1
 ∞ 0 24   2 2 2 2 
U =
 ∞
 P = 
 ∞ 0 1 

 3
 3 3 3 

∞ 5 ∞ 0 4 4 4 4
Camino mı́nimo entre cualquier par de vértices ORED 147

1
1 2 1 2 1 2 1 2

5 5
2 2 2 2

1 1
4 3 4 3 4 3 4 3

(1) (2) (3) (4)

Figura 9.2: Arborescencias óptimas del ejemplo 9.1 con caminos mı́nimos salien-
do de 1,. . . ,4

   
0 1 3 2 1 1 2 1
   
 ∞ 0 2 3   2 2 2 3 
U2 = 
 ∞ 6
 P = 
 0 1 

 3
 4 3 3 

∞ 5 7 0 4 4 2 4

Se puede comprobar que U 3 = U 2 , por lo que, al igual que con el algoritmo


de Bellman-Ford, se ha determinado la longitud de los caminos mı́nimos y las
arborescencias asociadas a cada una de las raı́ces: U = U 2 .
Las arborescencias óptimas asociadas a los caminos que salen de los 4 vérti-
ces posibles se muestran en la figura 9.2.

La formalización matricial de este algoritmo es la siguiente:


Sea la operación matricial definida para matrices cuadradas n × n:

C =A⊗B ⇐⇒ cij = mı́n{aik + bkj } ∀i, j ∈ {1, . . . , n}


k

Denotando por U t las matrices (utij ), se tiene


 
0 ∞ ··· ∞
 
 ∞ 0 ··· ∞ 
0
U =
 
.. .. .. 

 . . . 

∞ ∞ ··· 0

que es, además, el elemento neutro del operador ⊗ definido anteriormente.

Considerando que la matriz D identifica las distancias entre dos vértices


cuando exista el arco correspondiente y toma el valor ∞ en caso contrario, se
tiene:
ORED 148 Problema de Camino Mı́nimo. Extensiones

U1 = U0 ⊗ D
U2 = U1 ⊗ D
........................
U t+1 = U t ⊗ D
Hasta llegar a la matriz U = U n−1 si no hay circuitos de longitud negativa.

Una convergencia más rápida, del orden O(n3 ln(n)), se consigue de la si-
guiente forma:
D(2) = D ⊗ D
D(4) = D(2) ⊗ D(2)
.......................................
k k−1 k−1
D(2 )
= D(2 )
⊗ D(2 )
k
siendo D2 = U siempre que 2k ≥ n − 1, por lo que el mı́nimo número de veces
que hay que realizar la operación matricial es

k0 = mı́n{k / 2k ≥ n − 1}

y se consigue ası́, al ser k0 del orden de ln(n), la complejidad O(n3 ln(n)).

Observación 9.1. Con la simplificación anterior, sin embargo, la determina-


ción de las arborescencias que identifican los caminos mı́nimos se complica al
tener que enlazar caminos; el procedimiento se detalla más adelante para el al-
goritmo de Floyd-Warshall.

9.1.2. Algoritmo de Floyd-Warshall


En el algoritmo matricial —al igual que en el de Bellman-Ford— se apro-
ximaba la longitud del camino mı́nimo ui,j por la longitud del camino mı́nimo
con t arcos como máximo uti,j .
La aproximación del algoritmo de Floyd-Warshall, introducido de forma in-
dependiente en 1962 por Floyd [17] y Warshall [41], es la misma que la del
algoritmo de Dijkstra, a través de los vértices intermedios de los caminos mı́ni-
mos:
(k) {1,...,k−1}
ui,j ≡ ui,j longitud camino mı́nimo µ(k) [i, j] utilizando como
vértices intermedios {1, 2, . . . , k − 1}.
Camino mı́nimo entre cualquier par de vértices ORED 149

Como consecuencia inmediata de la definición, se obtiene

(1)
ui,j = dij ∀i, j ∈ {1, . . . , n}

Por otra parte, si no existen circuitos de longitud negativa en el digrafo, se


verifica:

(1) (2) (n) (n+1)


ui,j ≥ ui,j ≥ · · · ≥ ui,j ≥ ui,j = ui,j ∀i, j ∈ {1, . . . , n}

(k+1) (k)
Para cualquier k ∈ {1, 2, . . . , n} se verifica que ui,j ≤ ui,j , ya que el
primer término contempla todos los caminos del segundo más los que contengan
como vértices intermedios el vértice k. Por tanto, se da una de las dos siguientes
opciones:
(k+1) (k)
ui,j = ui,j
En este caso, no compensa añadir el vértice k y el camino asociado a uk+1
i,j
no contiene este vértice como intermedio.
(k+1) (k)
ui,j < ui,j
(k+1)
En este caso, el camino asociado a ui,j sı́ incluye al vértice k como uno
de los intermedios. Por el principio de optimalidad de Bellman, este camino
está compuesto de dos caminos óptimos: uno que parte de i hasta k y otro
(k)
que va desde k hasta j, cada uno de ellos tiene asociada la distancia ui,k y
(k)
uk,j respectivamente, ya que no utilizan más que los vértices {1, 2, . . . , k −
1}.
Esta situación se detecta al verificarse:

(k) (k) (k)


ui,j > ui,k + uk,j

y conlleva la actualización de las distancias

(k+1) (k) (k)


ui,j = ui,k + uk,j

Las arborescencias asociadas a los caminos mı́nimos desde cada vértice i ∈


{1, . . . , n}, se identifican por la matriz:

P = (pi,j )i,j∈{1,...,n}
ORED 150 Problema de Camino Mı́nimo. Extensiones

que determina el último arco (pi,j , j) del camino mı́nimo que va desde i hasta
j.
Inicialmente,
pi,j = i ∀i, j ∈ {1, . . . , n}
(k) (k) (k)
y se actualiza la arborescencia con raı́z i cada vez que ui,j > ui,k + uk,j , puesto
(k+1)
que la última parte —desde k hasta j— del camino asociada a ui,j se forma
(k)
con el camino mı́nimo asociado a la distancia uk,j .
Esto se consigue con la asignación pi,j = pk,j y repitiendo esta asignación
para el vértice h = pi,j según pi,h = pk,h hasta llegar al propio vértice k.
El algoritmo 9.2 detalla todos estos cálculos.

Este algoritmo tiene una complejidad O(n3 ).


La detección de circuitos de longitud negativa se realiza si en alguna iteración
(k)
k existe un vértice i tal que ui,i < 0; tal vértice pertenece al circuito.

Ejemplo 9.2. Sea la red dirigida con 5 vértices con matrices de adyacencia y
de distancias:

   
0 1 1 0 0 0 5 2 ∞ ∞
   
 0 0 1 1 0   ∞ 0 3 4 ∞ 
   
B= 0 0 0 1 1  D= ∞ ∞ 0 5 −4 
   
   
 0 1 0 0 1   ∞ −3 ∞ 0 4 
   
0 0 1 0 0 ∞ ∞ 6 ∞ 0

La inicialización de las matrices U y P proporciona:

   
0 5 2 ∞ ∞ 1 1 1 1 1
   
 ∞ 0 3 4 ∞   2 2 2 2 2 
   
U (1) = ∞ ∞ 0 5 −4  P = 3 3 3 3 3 
   
   
 ∞ −3 ∞ 0 4   4 4 4 4 4 
   
∞ ∞ 6 ∞ 0 5 5 5 5 5

donde se han marcado en la matriz U 1 la primera fila y columna para facilitar


las operaciones que proporcionan U 2 y P . Al ser ∞ todos los elementos de la
Camino mı́nimo entre cualquier par de vértices ORED 151

Algoritmo 9.2: [U, P] = CamMinFloyd(D)


Entrada:
D : Matriz asociada a la red dirigida (dij = du si (i, j) ∈ U ; dij = ∞ si no
existe el arco (i, j))
Salida:
U : Matriz que identifica las distancias de los caminos mı́nimos
µ[i, j] ∀i, j ∈ V
P : Matriz que identifica en cada fila i la arborescencia del camino mı́nimo
que parte de i, i → · · · → Pi,Pi,j → Pi,j → j.
Inicialización:
Las arborescencias iniciales son el conjunto de arcos que salen de cada nodo
i al resto de nodos (no utilizan ningún nodo intermedio).
(1)
ui,j = dij ∀i, j ∈ {1, . . . , n}
pi,j = i ∀i, j ∈ {1, . . . , n}
Proceso:
Se va introduciendo en cada iteración el nodo k ∈ V como posible nodo
intermedio en los caminos.
for k = 1, . . . , n do
Al usar el nodo k ∈ V , el camino de i a j se divide en dos: desde i a k y
desde k a j.
(k+1) (k) (k) (k)
ui,j = mı́n{ui,j ; ui,k + uk,j } ∀i, j 6= k ∈ {1, . . . , n}
Se comprueba si compensa utilizar el nodo k para ir desde i hasta j.
(k+1) (k)
if ui,j < ui,j then
Si compensa, se actualiza la arborescencia asociada a i desde k hasta j
por medio de la arborescencia asociada a k.
h=j
while h 6= k do
pi,h = pk,h
h = pi,h
end while
end if
end for
ORED 152 Problema de Camino Mı́nimo. Extensiones

primera columna, la operación asociada al algoritmo no varı́a las matrices y se


obtiene U 2 = U 1 :

   
0 5 2 ∞ ∞ 1 1 1 1 1
   
 ∞ 0 3 4 ∞   2 2 2 2 2 
   
U (2) = ∞ ∞ 0 5 −4  P = 3 3 3 3 3 
   
   
 ∞ −3 ∞ 0 4   4 4 4 4 4 
   
∞ ∞ 6 ∞ 0 5 5 5 5 5

A continuación se detallan las matrices U 3 , U 4 y U 5 , que identifica ya la


matriz U , y las correspondientes matrices P en cada iteración.

   
0 5 2 9 ∞ 1 1 1 2 1
   
 ∞ 0 3 4∞   2 2 2 2 2 
   
U (3) = ∞ ∞ 0 5 −4  P = 3 3 3 3 3 
   
   
 ∞ −3 0 0 4   4 4 2 4 4 
   
∞ ∞ 6 ∞ 0 5 5 5 5 5

   
0 5 2 7 −2 1 1 1 3 3
   
 ∞ 0 3 4 −1   2 2 2 2 3 
   
U (4) = ∞ ∞ 0 5 −4  P = 3 3 3 3 3 
   
   
 ∞ −3 0 0 −4   4 4 2 4 3 
   
∞ ∞ 6 11 0 5 5 5 3 5

   
0 4 2 7 −2 1 4 1 3 3
   
 ∞ 0 3 4 −1   2 2 2 2 3 
   
U (5) = ∞ 2 0 5 −4  P = 3 4 3 3 3 
   
   
 ∞ −3 0 0 −4   4 4 2 4 3 
   
∞ 8 6 11 0 5 4 5 3 5

Al ser U (6) = U (5) se ha concluido el algoritmo y se tiene construida la


matriz U = U 5 , que identifica las longitudes de los caminos entre todos los
vértices y la matriz P , que identifica estos caminos.
Redes con tiempo de tránsito (*) ORED 153

Por ejemplo, el camino mı́nimo que va desde 4 hasta 5 es:

5 ←− p4,5 = 3 ←− p4,3 = 2 ←− 4

que tiene longitud igual a u4,5 = −4.

9.2. Redes con tiempo de tránsito (*)


Si en el problema de camino mı́nimo desde un vértice fijo se asocia a cada
arco dos magnitudes: la longitud del mismo, que es la función objetivo en el
problema, y el tiempo que se tarda en recorrer dicha distancia, se tiene planteado
un problema con dos criterios que pueden estar en contradicción.
Se tiene ası́ una red dirigida con dos valores asignados a cada arco:

(G = (V, U ); {dkj / (k, j) ∈ U }; {zkj / (k, j) ∈ U })

Una forma de plantear el problema ası́ definido es considerar uno de los


criterios, en este caso el tiempo de tránsito, como una restricción a verificar. El
otro criterio, la distancia, seguirá siendo el que defina la función objetivo.
Tiene sentido introducir la siguiente notación:
uj (z) ≡ longitud del camino mı́nimo µ(z)[1, j] invirtiendo en total un
tiempo de tránsito menor o igual que z.
Se supone que los tiempos de tránsito son unidades enteras. El enfoque se
basa en iterar en los tiempos de tránsito viendo si al aumentar una unidad de
tiempo de tránsito disponible, se mejora la solución con el otro criterio.
Las ecuaciones que verifican ({uj (z)}j∈{1,...,n} , z ∈ IN ) son las siguientes:
u1 (0) = 0
u1 (z) = ∞ ∀z < 0
uj (z) = ∞ ∀z ≤ 0 ∀j ∈ {2, . . . , n}
La iteración z = z + 1 se basa en identificar si uj (z) < uj (z − 1) para algún
j, indicando en ese caso que compensa utilizar un camino distinto al disponer
de una unidad de tiempo de tránsito adicional; tiene sentido distinguir las dos
situaciones siguientes:

uj (z) = uj (z − 1), cuando no varı́a el camino de mı́nimo coste utilizando


z − 1 unidades de tránsito si se añade una unidad de tiempo adicional.
ORED 154 Problema de Camino Mı́nimo. Extensiones

400(1)
2 4
100(1)
100(1) 100(1)
100(3)
1 3

Figura 9.3: Red de tránsito del Ejemplo 9.3

uj (z) < uj (z − 1), cuando varı́a el camino de mı́nimo coste utilizando z − 1


unidades de tránsito. En este caso, existe un nuevo camino utilizando z
unidades de tránsito con distancia o coste menor; sea k ∈ V el vértice
anterior a j en el nuevo camino ; el tiempo de tránsito por el arco (k, j) es
zkj , por lo que el tiempo disponible para el tramo del nuevo camino desde
1 hasta k será z − zkj y se verificará entonces:

uj (z) < uk (z − zkj ) + dkj

Tiene sentido, pues, identificar el mejor vértice k (en el sentido de minimizar


la distancia) que minimice uk (z − zkj ) + dkj con el tiempo disponible z. En
cualquier caso, la actualización de uj (z) en función de los uj (z − 1) se basa en
contemplar las dos situaciones descritas anteriormente:
uj (z) = M in{uj (z − 1); mı́nk {uk (z − zkj ) + dkj }}
La complejidad algorı́tmica es O(n2 · Z), siendo Z el máximo tiempo de
tránsito a considerar.

Ejemplo 9.3. Sea la red dirigida de la figura 9.3, que representa posibles tra-
yectos entre 4 puntos —los vértices— y donde cada trayecto está doblemente
valorado con el coste (en euros) asociado al trayecto y el tiempo (en dı́as) que
se tarda en recorrerlo, el tiempo de tránsito, que se representa encerrado entre
paréntesis.
Si se considera acotado el tiempo de tránsito y se trata —sin superar di-
cho tiempo— de minimizar el coste, se resuelve el problema iterando según los
distintos valores de la cota z:

1. z = 0
Redes con tiempo de tránsito (*) ORED 155

u1 (0) = 0 u2 (0) = ∞ u3 (0) = ∞ u4 (0) = ∞

que indica la longitud del camino de menor distancia o coste no superando


un tiempo total de tránsito igual a 0. Al ser todos los tiempos estrictamente
positivos, sólo se puede llegar al vértice 1, el resto de las longitudes no
están acotadas.

2. z = 1

u1 (1) = 0 u2 (1) = 100 u3 (1) = ∞ u4 (1) = ∞

3. z = 2

u1 (2) = 0 u2 (2) = 100 u3 (2) = 200 u4 (2) = 500

4. z = 3

u1 (3) = 0 u2 (3) = 100 u3 (3) = 100 u4 (3) = 300

5. z = 4

u1 (4) = 0 u2 (4) = 100 u3 (4) = 100 u4 (4) = 200

Hay que observar que al aumentar z, disminuyen los uj (z), es decir,

uj (z) ≥ uj (z 0 ) ∀j ∈ V ∀z ≤ z 0

Observación 9.2. La identificación del camino mı́nimo con tiempo de tránsito


acotado es más complicada que en el problema de camino mı́nimo. En el ejem-
plo 9.3, cuando z = 3, el camino de longitud mı́nima hasta el vértice 3 es a
través del arco (1, 3), mientras que el camino mı́nimo hasta el vértice 4 pasa por
los arcos (1, 2), (2, 3) y (3, 4). Es decir, al haber dos criterios en contraposición,
el principio de optimalidad de Bellman no es aplicable.
Con este tipo de problemas se pueden plantear aquellos problemas de redes
con dos criterios contrapuestos: tiempo / coste, peso / precio, etc. El enfoque
es el visto anteriormente, acotado un criterio, minimizar o maximizar el otro.
ORED 156 Problema de Camino Mı́nimo. Extensiones

3
2 4
1
2 1

5
1 3

Figura 9.4: Red de embotellamiento del Ejemplo 9.4

9.3. Problema de embotellamiento (*)


El problema de camino mı́nimo determina el camino que minimiza (operador
1) la longitud total de un camino, siendo la longitud de un camino la suma
(operador 2) de las longitudes de los arcos que lo componen.
En algunas situaciones, cuando el problema sea determinar un camino con
otras propiedades, será suficiente modificar alguno de los dos operadores ante-
riores para obtener el resultado adecuado.

Ejemplo 9.4. Se desea transportar una carga muy pesada entre dos puntos.
Los caminos que los unen se pueden considerar como los caminos de un digrafo
donde cada arco tiene asignado el peso máximo autorizado al encontrarse en el
tramo de carretera asociado un puente. ¿Cuál es el peso máximo que se puede
transportar y por dónde?
Para ilustrar el problema, sea el digrafo de la figura 9.4 con 4 vértices y 5
arcos con sus pesos máximos autorizados. Los vértices inicial y final son respec-
tivamente 1 y 4.
Hay tres caminos que unen los vértices 1 y 4:
µ1 = 1 −→ 2 −→ 4
µ2 = 1 −→ 2 −→ 3 −→ 4
µ3 = 1 −→ 3 −→ 4
El máximo peso que se puede transportar es el mı́nimo de los pesos autori-
zados en cada tramo. Sea d(µ) dicha cantidad, que se determina según

d(µ) = mı́n du
u∈µ

Para cada uno de los tres caminos, se tiene:


d(µ1 ) = mı́n{2, 3} = 2
d(µ2 ) = mı́n{2, 1, 1} = 1
Problema de embotellamiento (*) ORED 157

d(µ3 ) = mı́n{5, 1} = 1
El problema es determinar el máximo de estas cantidades y el camino que
consigue dicho máximo, en este caso es el camino µ1 , con valor d(µ1 ) = 2, que
se interpreta como el máximo peso que se puede transportar desde 1 hasta 4.

Este es el planteamiento tı́pico de un problema de embotellamiento. Se trata


de encontrar un camino caracterizado por el peso máximo que puede soportar,
que será el mı́nimo (operador 2) de los pesos autorizados en cada arco que lo
componen. El problema es determinar el camino que maximiza (operador 1) la
caracterı́stica anterior.
En estos casos se traducen los algoritmos de camino mı́nimo sustituyendo
los operadores resultantes.
ORED 158 Problema de Camino Mı́nimo. Extensiones
Capı́tulo 10
Flujo en digrafos.

Muchos problemas reales se plantean al moverse determinadas unidades (co-


ches, agua, fluido eléctrico, etc.) por determinados conductos (carreteras, cana-
les, cables, etc.). Estos conductos tienen una capacidad que limita el paso de las
citadas unidades por unidad de tiempo. Además, estas unidades se mantienen,
en el sentido que a un punto determinado de la red ası́ definida salen tantas
unidades como entran.
Por otra parte, muchos problemas de programación entera o binaria —es
el caso, por ejemplo, de los problemas de asignación— pueden ser modelizados
como problemas de flujo, identificando las unidades que se mueven por el digrafo
correspondiente como operaciones lógicas sobre los elementos que relacionan los
arcos de la red.
Al conjunto de unidades, fı́sicas o lógicas, que se mueven por unidad de tiem-
po en una red se denomina flujo. En este capı́tulo se introduce formalmente el
concepto matemático de flujo y se analizan una serie de propiedades algebraicas
que serán utilizadas en capı́tulos posteriores, cuando se planteen diversos pro-
blemas relacionados con los flujos: Problema de flujo máximo, flujo compatible,
flujo de coste mı́nimo, etc.
Al final del capı́tulo se introduce el lema de coloración de arcos, que jus-
tificará muchos de los algoritmos de flujo que serán estudiados en capı́tulos
posteriores.
ORED 160 Flujo en digrafos.

2
b c
1
7
a 6 3
5
4
e d

Figura 10.1: Digrafo del Ejemplo 10.1 con los arcos etiquetados por su ı́ndice

10.1. Concepto de flujo


Definición 10.1. Dado un digrafo conexo con m arcos, un flujo es un vector
f = (f1 , . . . , fm )t ∈ IRm verificando la denominada ley de conservación de flujo:
X X
fu = fu ∀i ∈ {1, . . . , n}
u∈w+ (i) u∈w− (i)

Ejemplo 10.1. Sea el digrafo G = (V, U ) con 5 vértices V = {a, b, c, d, e} y 7


arcos:

U = {1 ≡ (a, b); 2 ≡ (b, c); 3 ≡ (c, d); 4 ≡ (d, e); 5 ≡ (e, a); 6 ≡ (e, b); 7 ≡ (e, c); }

representado en la figura 10.1.


Cualquier vector de IR7 verificando la ley de conservación de flujo en los
vértices de G es un flujo. Ejemplos de flujo son los siguientes:
     
2,7 0 1
     

 2 


 1 

 0 
 
2 1   −1 
     
  
1 2
f3 = 
     
f =
 2 
 f =
 1 
  −1 

     
 2,7   0   1 
     
 −0,7   1   −1 
     
0 0 −1

Posteriormente, cuando se planteen determinados problemas de flujo, al vec-


tor f se le exigirá determinadas propiedades, por ejemplo, que tenga las com-
ponentes no negativas o que cada componente no supere un determinado valor.
Todas estas restricciones no son necesarias para estudiar las propiedades alge-
braicas de los flujos en digrafos.
Concepto de flujo ORED 161

Obviamente, el vector con todas las componentes nulas

fu = 0 ∀u ∈ U

es un flujo, que se denomina flujo nulo o trivial. En algunos casos, además, es


el único posible como se ve en la siguiente proposición.

Proposición 10.1. Un flujo definido sobre un árbol —digrafo conexo sin ciclos—
es necesariamente nulo.

Demostración
El árbol tiene n vértices y n − 1 arcos. Existe al menos un vértice pendiente,
sea x1 tal vértice. El arco que incide en este vértice, tanto si entra en o sale
de x1 , tiene un flujo nulo, puesto que no sale o no entra ningún otro arco en el
vértice.
Se repite el esquema para el subgrafo generado por V − {x1 } y se concluye
ası́ que todos los arcos tienen un flujo nulo.

Al multiplicar un flujo por un escalar, se obtiene un nuevo flujo. Análoga-


mente al sumar dos flujos, se obtiene un nuevo flujo. Formalmente, se tiene el
siguiente resultado.

Proposición 10.2. La combinación lineal de flujos es otro flujo.

Demostración
Sea G = (V, U ) un digrafo con m arcos. Sea {f 1 , f 2 , . . . , f k } un conjunto de
flujos sobre G. Si se define el vector

k
X
f= λj f j λj ∈ R ∀j ∈ {1, . . . k}
j=1

Al ser f j un flujo sobre G para todo j, el vector f ∈ IRm al ser IRm un


espacio vectorial.
Además, cada flujo f j verifica la ley de conservación de flujo; por consiguien-
te:
ORED 162 Flujo en digrafos.

X k
X X k
X X X
fu = λj fuj = λj fuj = fu ∀i ∈ {1, . . . , n}
u∈w+ (i) u∈w+ (i) j=1 u∈w− (i) j=1 u∈w− (i)

concluyendo ası́ que f verifica también la ley de conservación de flujo. Es, por
tanto, un flujo definido sobre G.

En el digrafo del ejemplo 10.1, se puede comprobar que el vector


 
2,4
 
 5 
 
 8 
 

2 · f1 + 1 · f2 − 3 · f3 = 
 
 8 

 
 2,4 
 
 2,6 
 
3

es un flujo.

Con la proposición 10.2 se ha demostrado que el conjunto de flujos definidos


sobre un digrafo es un espacio vectorial. Para identificar su dimensión y una
base de flujos que permita caracterizarlos todos, es preciso estudiar la relación
que existe entre los ciclos y los flujos de un digrafo.

10.2. Flujos y ciclos de un digrafo. Estudio algebrai-


co
Dado un ciclo µ en un digrafo conexo G = (V, U ), al dotarlo de un sentido
de giro, los arcos u ∈ µ se clasifican en positivos u ∈ µ+ o negativos u ∈ µ−
dependiendo de que tengan dicho sentido o el contrario respectivamente.
Ası́, se puede asociar a cada ciclo —cadena simple cerrada— un vector de
dimensión m con 0, 1 ó −1 de forma análoga a los ciclos en un grafo.

Definición 10.2. Dado un ciclo en un digrafo, se define el vector µ ∈ IRm :


Flujos y ciclos de un digrafo. Estudio algebraico ORED 163




 1 u ∈ µ+
µu = −1 u ∈ µ−

u 6∈ µ

 0

Dado el digrafo del ejemplo 10.1, se define el ciclo µ a partir de la cadena


que visita (en este orden) los vértices a − b − e − d − c − e − a. Obsérvese que
no es un ciclo elemental porque repite el vértice e.
Con el sentido ası́ definido, se definen los subconjuntos de arcos:

µ+ = {1, 5} µ− = {3, 4, 6, 7}

de forma que el vector µ de dimensión 7 es


 
1
 
 0 
 
 −1 
 
 
µ=
 −1 

 
 1 
 
 −1 
 
−1

Un circuito es un ciclo en el que todos los arcos están orientados en el mismo


sentido. En el digrafo del ejemplo 10.1, se puede definir el circuito µ0 que visita
los vértices b − c − d − e, de forma que los arcos del circuito son

µ0 = {2, 3, 4, 6}

y el vector µ0 asociado es
 
0
 

 1 

1 
 

µ0 = 
 
 1 

 
 0 
 

 1 

0
ORED 164 Flujo en digrafos.

No es difı́cil demostrar que cualquier ciclo, y por inclusión, circuito, es un


flujo en el sentido de verificar los vectores asociados la ley de conservación de
flujo en cada vértice.

Proposición 10.3. Cualquier ciclo de un digrafo es un flujo.

Demostración
Sea µ el vector asociado al ciclo. Obviamente, µ ∈ IRm . Hay que demostrar
la ley de conservación de flujo en cada vértice:

X X
µu = µu ∀i ∈ {1, . . . , n}
u∈w+ (i) u∈w− (i)

Sea i ∈ V un vértice genérico de G. Si el vértice no es visitado por el ciclo,


todos los arcos que inciden en él, exterior o interiormente, tienen asignado el
valor 0 en el vector µ, por lo que se verifica trivialmente la ley de conservación
de flujo en el vértice al ser µu = 0 ∀u ∈ w(i).
Si el vértice i es visitado por el ciclo una vez, las tres posibilidades de cone-
xión de los dos arcos u1 y u2 que inciden en el vértice i son:

u1 ∈ w+ (i), u2 ∈ w− (i)
Dependiendo del sentido del ciclo, hay dos posibilidades:

• µu1 = µu2 = 1
• µu1 = µu2 = −1

En ambos casos,
X X
µu = µu1 = 1(−1) µu = µu2 = 1(−1)
u∈w+ (i) u∈w− (i)

y coinciden.

u1 , u2 ∈ w+ (i)
En este caso, si uno de ellos, por ejemplo, µu1 = 1, el otro debe ser negativo
µu2 = −1 y se verifica
X X
µu = µu1 + µu2 = 1 − 1 = 0 µu = 0
u∈w+ (i) u∈w− (i)
Flujos y ciclos de un digrafo. Estudio algebraico ORED 165

u1 , u2 ∈ w− (i)
Este caso es análogo al anterior
X X
µu = 0 µu = µu1 + µu2 = 1 − 1 = 0
u∈w+ (i) u∈w− (i)

En el caso en que el ciclo no sea elemental y pueda visitar más de una vez
un vértice, habrá que reiterar el proceso anterior tantas veces como sea visitado
el vértice para concluir la ley de conservación para todos los vértices.

En el ejemplo 10.1, el ciclo µ y el circuito µ0 son, respectivamente, los flujos


f y f 2 al coincidir los vectores asociados.
3

De la proposición 10.3 y del hecho de ser un espacio vectorial el conjunto de


flujos de un digrafo, se deduce el siguiente corolario:

Corolario 10.1. Dado un flujo, si se le suma el vector asociado a un ciclo


multiplicado por una constante, se obtiene otro flujo.

Obviamente, el recı́proco de la proposición 10.3 no es cierto en el sentido


de que no todos los flujos son ciclos, es suficiente con observar el flujo f 1 del
ejemplo 10.1. No obstante, sı́ es cierto que cualquier flujo se puede expresar
como combinación lineal de ciclos. Además, generalizando los resultados de la
sección 5.4 del capı́tulo 5, se identificará una base del espacio vectorial de los
flujos de un digrafo.
Esta base depende del árbol soporte elegido del digrafo en cuestión.

Para definir la base de flujos, es necesario introducir el concepto de indepen-


dencia para un conjunto de flujos definidos en un digrafo. Al ser un ciclo o un
circuito un flujo, la definición de independencia es válida también para ellos.

Definición 10.3. Dado un digrafo G = (V, U ), un conjunto de flujos del mismo


es independiente si el conjunto de vectores de IRm asociado lo es.
ORED 166 Flujo en digrafos.

Obviamente, un ciclo y su inverso, al considerar el sentido contrario, son


linealmente dependientes puesto que sus vectores asociados, µ y −µ, suman el
vector 0.

Con el fin de obtener todos los flujos de un digrafo G, de forma análoga a la


base de ciclos de un grafo se construye la base de ciclos de un digrafo sin más
que asignar a cada ciclo el sentido del arco u ∈ U − T , siendo H = (V, T ) un
árbol soporte de G.

En el ejemplo 10.1, sea el árbol soporte H = (V, T ), con

T = {1, 4, 5, 7}

El número ciclomático es m − n + 1 = 7 − 5 + 1 = 3. La base de ciclos


asociada es
µ2 , µ3 , µ6


siendo:
     
1 0 −1
     

 1 


 0 

 0 
 
0  1   0 
     
 
µ2 =  µ3 =  µ6 = 
     
 0 
  1 
  0 

 −1 
     
 1   0 
     

 0 


 0 

 1 
 
−1 1 0

Los tres flujos (ciclos) son independientes por tener cada uno de ellos un 1
donde los demás tienen un 0: la coordenada 2 para µ2 , la coordenada 3 para µ3 ,
etc.

Realmente, la base de ciclos definida para el ejemplo 10.1 a partir de un árbol


soporte es una base de flujos. Este resultado se detalla en el siguiente teorema.

Teorema 10.1. Sea G = (V, U ) un digrafo conexo con n vértices y m arcos.


Dado H = (V, T ), un árbol soporte de G, al añadir a T cualquier arco u ∈ U −T
se forma un único ciclo elemental µu en G, el sentido del ciclo es el del arco u,
Flujos y ciclos de un digrafo. Estudio algebraico ORED 167

es decir, µuu = 1. La base de flujos de G definida a partir de H es

{µu / u ∈ U − T }

Demostración
En primer lugar, el conjunto de ciclos elementales

{µu / u ∈ U − T }

es independiente, puesto que cada uno de los ciclos µu tiene un 1 en la compo-


0
nente asociada al arco u, mientras que el resto de ciclos µu , con u0 6= u, tiene
un 0 en la citada componente u-ésima.
Para demostrar que este conjunto genera cualquier flujo, sea f un flujo.
Se define un nuevo vector
X
f0 = f − fu µu
u∈U −T

siendo fu la componente u-ésima del vector f .


El vector f 0 es un flujo, puesto que tiene tantas componentes como arcos el
digrafo y verifica la ley de conservación de flujo por verificarla tanto el ciclo µ
como cada uno de los ciclos µu , con u ∈ U −T . Al considerar que las componentes
de f 0 se pueden clasificar en dos:

u∈U −T
Por construcción, el ciclo fu0 = 0

u∈T
El resto de las componentes, al ser H = (V, T ) un árbol, por la proposi-
ción 10.1, deben ser nulas y fu0 = 0

Por tanto, f 0 = 0 y el flujo f se puede expresar como combinación lineal de


la base de ciclos:

X
f= fu µu
u∈U −T


ORED 168 Flujo en digrafos.

Dado un digrafo conexo G = (V, U ), ya se vio que el conjunto de los flujos


definidos en G es un espacio vectorial con las operaciones usuales de IRm ; con
el teorema10.1, además, se determina su dimensión como el número ciclomático
del grafo ν(G) = m − n + 1.
La construcción de la base depende del árbol soporte de G; si H = (V, T )
es el árbol soporte elegido, entonces la base del espacio vectorial de los flujos
definidos en G es:

B = {µu / u ∈ U − T }

En el ejemplo 10.1, dado el flujo


 
3
 

 4 

6 
 

 
f =
 6 

 
 3 
 

 1 

2

a partir de la base de flujos {µ2 , µ3 , µ6 }, considerando que f2 = 4, f3 = 6 y


f6 = 1, se tiene que
       
3 1 0 −1
       

 4 

 1




 0 

 0 
 
6   0 1   0 
       
  
2 3 6
       

 6 
 = 4 · µ + 6 · µ + 1 · µ = 4 ·  0

+6·
  +1· 0 
1   
 −1 
       
 3   1   0 
       

 1 
  0




 0 

 1 
 
2 −1 1 0

Como consecuencia, cualquier flujo es combinación lineal de ciclos elementa-


les independientes. Dicho de otra forma, la diferencia entre dos flujos se puede
identificar como una combinación de ciclos elementales independientes. Es decir,
si a un flujo le sumamos un ciclo multiplicado por una constante, se obtendrá
un nuevo flujo.
Lema de coloración de arcos ORED 169

10.3. Lema de coloración de arcos


Este lema, debido a Minty en 1966, tiene una gran utilidad en la demos-
tración de muchos —por no decir todos— de los resultados que justifican los
algoritmos de los problemas de flujo: Problema de flujo máximo, flujo compatible
y coste mı́nimo, etc.

Previamente, se introduce el vector asociado a cualquier cociclo en un digra-


fo.

Definición 10.4. Dado G = (V, U ) un digrafo conexo, a partir de un subcon-


junto A ⊂ V se define el cociclo como el subconjunto de arcos

w(A) = {u = (i, j) ∈ U / i ∈ A j 6∈ A} ∪ {u = (j, i) ∈ U / i ∈ A j 6∈ A}

A los arcos del primer tipo se les denota por w+ (A) y a los del segundo por
w− (A).

Definición 10.5. Dado un digrafo G = (V, U ) conexo, dependiendo de si sus


arcos pertenecen o no a un cociclo θ = w(A), se define el vector (θ1 , . . . , θm )
verificando 
 +1

 u ∈ w+ (A)
θu = −1 u ∈ w− (A)

u 6∈ w(A)

 0

En el ejemplo 10.1, si se consideran los conjuntos

A = {a, b, e} A0 = {b, d}

se definen los conjuntos de arcos

w+ (A) = {2, 7} w− (A) = {4} w+ (A0 ) = {2, 4} w− (A0 ) = {1, 3, 6}

y los vectores asociados a los cociclos w(A) y w(A0 ) son

θt = (0, 1, 0, −1, 0, 0, 1) θ0t = (−1, 1, −1, 1, 0, −1, 0)


ORED 170 Flujo en digrafos.

Lema 10.1. Sea G = (V, U ) un digrafo conexo cuyos arcos pueden estar (ar-
bitrariamente) coloreados de negro N , verde V , rojo R o no estar coloreados 0.
La única hipótesis es que uno de ellos, el arco de referencia u0 , es negro.
Se denota la clasificación de los arcos del digrafo por el vector col():

col : U −→ {N, V, R, 0}

con la única restricción col(u0 ) = N .


Entonces, se verifica una, y sólo una, de las dos aseveraciones siguientes:

Por el arco u0 pasa un ciclo elemental con los arcos coloreados de negro,
verde o rojo. Los negros —el arco de referencia entre ellos— mantienen
el sentido del ciclo, identificado por el sentido del arco de referencia; los
verdes están orientados en sentido contrario; y, por último, los arcos rojos
pueden estar orientados en cualquier sentido.

El arco u0 pertenece a un cociclo elemental formado por arcos negros,


verdes o no coloreados. Los arcos negros mantienen el sentido del arco de
referencia; los verdes están orientados en sentido contrario; y, por último,
los arcos no coloreados pueden estar orientados en cualquier sentido.

Demostración
Sea u0 = (t, s) el arco de referencia. La demostración es constructiva y se
basa en un proceso de etiquetado de vértices:

1. Etiquetar s: p(s) = s
El resto de los vértices no está etiquetado p(j) = 0 ∀j 6= s

2. Repetir este paso mientras se puedan etiquetar vértices:


Dados un vértice i etiquetado (p(i) 6= 0) y un vértice j no etiquetado
(p(j) = 0) de forma que ambos son adyacentes en G:
Etiquetar j, es decir p(j) = i si se verifica alguna de las condiciones si-
guientes:

u = (i, j) ∈ U y col(u) ∈ {N, R}


u = (j, i) ∈ U y col(u) ∈ {V, R}
Lema de coloración de arcos ORED 171

R R
i j i j

N V
i j i j

Figura 10.2: Las 4 posibilidades de etiquetar el vértice j a partir del vértice i:


p(j) = i

Las cuatro posibilidades para etiquetar un vértice j a partir de otro adya-


cente i, ya etiquetado previamente, se ilustran en la figura 10.2.
Después del proceso de etiquetado, hay dos opciones exhaustivas y exclu-
yentes:

p(t) 6= 0
Se tiene construido el ciclo de arcos negros, rojos o verdes al unir el arco
(t, s) con la cadena:

t − p(t) − p(p(t)) − · · · − s

p(t) = 0
El cociclo al que pertenece el arco u0 es w(A), siendo

A = {i ∈ V / p(i) 6= 0}

Este cociclo, por construcción, verifica las hipótesis del lema.

La demostración del lema de coloración implica un proceso de etiquetado de


vértices que se puede desarrollar con el siguiente algoritmo10.1 a partir de un
digrafo G = (V, U ), con una coloración

col = V → {N, V, R, 0}

y existiendo un arco u0 = (t, s) tal que col(u0 ) = N .


Este algoritmo se desarrolla a continuación.
ORED 172 Flujo en digrafos.

Algoritmo 10.1: [p, A] = LemaColor(G = (V, U ∪ (t, s)); {col(u), u ∈


U }; col(t, s) = N )
Entrada:
G = (V, U ) : Digrafo de entrada, s, t ∈ V ; (t, s) se añade a U si no existiera.
col : U → {N, V, R, 0}), col(t, s) = N .
Salida:
p : Vector que identifica una cadena que sale de s; si p(t) 6= 0, existe un
ciclo.
A : En el caso p(t) = 0, identifica el cociclo w(A)
Inicialización:
Se utiliza el conjunto A0 como conjunto de trabajo. El único nodo conectado
con s es el propio s.
A0 = {s}
p(s) = s p(j) = 0 ∀j ∈ V − A0
Proceso:
Se actualiza A con los nodos conectados con s.
repeat
A = A0
Regla de etiquetado con los arcos que salen de A ⊂ V .
for u = (i, j) ∈ w+ (A) do
if col(u) ∈ {N, R} then
p(j) = i
A0 = A0 ∪ {j}
end if
end for
Regla de etiquetado con los arcos que entran en A ⊂ V .
for u = (j, i) ∈ w− (A) do
if col(u) ∈ {V, R} then
p(j) = i
A0 = A0 ∪ {j}
end if
end for
until A0 = A
Si A0 = A es porque no se ha etiquetado ningún nodo
if p(t) 6= 0 then
El nodo t se ha etiquetado, equivalente a que t ∈ A.
return CICLO : t − p(t) − p(p(t)) − · · · − s − t
else
El nodo t no se ha etiquetado, equivalente a que t 6∈ A.
return COCICLO : w(A)
end if
Lema de coloración de arcos ORED 173

N(*)
b c
0
V
a R N
V
V
e d

Figura 10.3: Lema de coloración: ciclo

N(*)
b c
N
V
a V V
0
N
e d

Figura 10.4: Lema de coloración: cociclo

Sea el digrafo de la figura 10.3, considerando como arco de referencia u0 =


(b, c), es decir, t = b y s = c; coloreando los arcos según indica dicha figura, al
aplicar el lema de coloración, se llega a etiquetar el vértice t = b obteniendo el
ciclo:

b(= t) − e(= p(b)) − c(= p(e) = s) − b

Los arcos del ciclo son µ = {(e, b); (e, c); (b, c)}, donde

µ+ = {(e, b); (b, c)} µ− = {(e, c)}

siendo los arcos (e, b) y (b, c) negros y el arco (e, c) verde.


El mismo digrafo, considerando también u0 = (b, c), si se colorea de otra
forma, ver la figura 10.4, y se aplica el lema de coloración se obtiene el cociclo
w(A), siendo

A = {c, e} w+ (A) = {(c, d); (e, b)} w− (A) = {(b, c); (d, e); (a, e)}

siendo los arcos (c, d) y (e, b) verdes, los arcos (b, c) y (d, e) negros y el arco
(a, e) sin colorear.
ORED 174 Flujo en digrafos.

En los dos casos, todo es conforme con el lema de coloración.

Observación 10.1. Aunque el lema de coloración habla de ciclos y cociclos


elementales, en la demostración no se ha comprobado esta propiedad en ninguno
de los dos casos.
En el caso del ciclo, el ciclo es elemental, ya que no puede repetirse ningún
vértice al definir la secuencia t − p(t) − p(p(t)) − · · · − s − t por medio del vector
p(.): si hubiera un nodo k repetido en dicha secuencia implicarı́a que habrı́a dos
nodos diferentes asociados a p(k).
En el caso del cociclo, para que sea elemental, los subgrafos generados por
A y (V − A) deben ser conexos: el caso del subgrafo generado por A, al estar
asociado al vector p(.), es claramente conexo; en el caso del subgrafo generado
por (V − A), si no fuera conexo, serı́a porque habrı́a k ≥ 2 subconjuntos de
vértices conexos y disjuntos entre sı́ verificando

k
[
(V − A) = Bh Bh ∩ Bh0 = ∅ ∀h, h0 ∈ {1, 2, . . . , k} h 6= h0
h=1

y perteneciendo el vértice t a uno de ellos, por ejemplo, t ∈ B1 . El enunciado


del lema de coloración (el arco (t, s) pertenece a un cociclo elemental...) serı́a
válido sin más que observar que

k
[
(t, s) ∈ w(A Bh ) ⊂ w(A)
h=2

Sk
y el cociclo w(A h=2Bh ) tiene las propiedades del cociclo w(A) y es elemental,
Sk
ya que si el conjunto (A h=2 Bh ) no fuera conexo, no lo serı́a tampoco el grafo
original G.
Capı́tulo 11
Problema de Flujo Máximo.
Algoritmo de Ford-Fulkerson

Una vez modelizado un problema como un problema de flujo en un digrafo,


bien sea un flujo fı́sico o bien un flujo lógico, es natural plantearse cuál es la
máxima cantidad de flujo que se pueden mover entre dos vértices del digrafo.
Es el problema de flujo máximo.
En el digrafo asociado a un problema de flujo máximo, cada arco representará
un tramo que soporta las unidades que fluyen y está caracterizado por un lı́mite
o capacidad del arco. En otro caso, el problema no tendrı́a sentido al no estar
acotado el flujo por los arcos. Se introduce ası́ el concepto de red de transporte,
que valora cada arco por la capacidad del flujo que puede soportar.
A partir de un ejemplo, se introduce formalmente el problema de flujo máxi-
mo. Posteriormente se analizan las propiedades teóricas de la solución y se pro-
pone el algoritmo de Ford-Fulkerson para resolverlo.

11.1. Red de transporte. Flujo compatible


Se plantean dos ejemplos de flujo máximo; en el primero de ellos, las unidades
de flujo representan automóviles que se mueven por un conjunto de calles (los
arcos) y el flujo está limitado por la capacidad de dichas calles.

Ejemplo 11.1. La capacidad de tráfico de las calles se mide por el número


de automóviles que pueden circular por minuto. En una determinada zona —
representada en la figura 11.1— se especifican las calles por arcos y se desea
ORED 176 Problema de Flujo Máximo. Algoritmo de Ford-Fulkerson

(100)
s a

(100) (50) (75)


(100)
b t

Figura 11.1: Red de tráfico del Ejemplo 11.1

E1 T1

E2 T2

E3 T3

Figura 11.2: Representación del problema de asignación del Ejemplo 11.2

saber cuál es la cantidad máxima de automóviles que pueden circular entre las
zonas s y t.

En el segundo ejemplo, sin embargo, no hay movimiento fı́sico de unidades


de flujo, sino que una unidad de flujo que se mueve por un arco identifica una
relación lógica entre los extremos de dicho arco. El ejemplo plantea un problema
de asignación de un grupo de empleados a un conjunto de tareas, representado
como un grafo bipartito formado por los vértices asociados a los empleados y
las tareas y existe una arista empleado-tarea cuando ambos son compatibles.

Ejemplo 11.2. En una oficina hay tres empleados (E1,E2,E3) y tres tareas
(T1,T2,T3), cada una de las cuales requiere unos conocimientos especı́ficos que
no todos los empleados poseen. Cada empleado puede realizar alguna de las ta-
reas. En la figura 11.2 se representan los empleados y tareas por vértices y cada
arista que une un empleado y una tarea representa la compatibilidad de ambos.
Se desea saber cómo asignar las tareas a los empleados para tratar de realizarlas
todas.

Con el fin de modelizar convenientemente los problemas anteriores, se intro-


ducen los siguientes conceptos
Red de transporte. Flujo compatible ORED 177

Definición 11.1. Una red de transporte es el par (G = (V, U ); {cu , u ∈ U })


donde G es un digrafo sin bucles y cu es la capacidad del arco u ∈ U .

La capacidad de cada arco limita superiormente una cantidad que se asigna


a cada arco.

En el ejemplo 11.1 se distingue la capacidad de tráfico de una calle con el


tráfico que soporta realmente.

Se introduce ası́ el concepto de flujo compatible con la red de transporte:

Definición 11.2. Dada una red de transporte, se define un flujo compatible


como un vector de dimensión m = |U | f t = (f1 , . . . , fm ) verificando:

Ley de conservación de flujo

X X
fu − fu = 0 ∀i ∈ V
u∈w+ (i) u∈w− (i)

Compatibilidad del flujo

0 ≤ fu ≤ cu ∀u ∈ U

En el ejemplo 11.1 el único flujo compatible es el flujo trivial que asigna el


flujo 0 a cada arco. Esto es debido a que del vértice t no sale ningún arco y al
vértice s no llega ninguno.
Para evitar este problema cuando se trata de enviar flujo entre un par de
vértices fijados previamente, s, t ∈ V , se introduce un arco ficticio entre estos
dos vértices. El flujo del arco (t, s) devuelve a s todo el flujo que va desde s
a t por el digrafo G; al flujo f0 de este arco, que se etiqueta como arco 0, se
denomina valor del flujo.

Siguiendo con el ejemplo 11.1, añadiendo el arco 0 y ordenando el resto


de arcos a continuación según (t, s), (s, a), (s, b), (a, b), (a, t), (b, t) un flujo puede
ser f t = (125, 75, 50, 50, 25, 100)

Formalmente, dada una red de transporte y fijados dos vértices s y t, se


define un (s,t)-flujo como un flujo en la red ampliada con el arco ficticio (t, s)
con capacidad no limitada.
ORED 178 Problema de Flujo Máximo. Algoritmo de Ford-Fulkerson

(∞,125)
(100,75)
s a

(100,50) (50,50) (75,25)


(100,100)
b t

Figura 11.3: Red de tráfico ampliada del Ejemplo 11.1

La red ampliada para el ejemplo 11.1 y con los valores de este flujo serı́a
la representada en la figura 11.3. Se representa en cada arco su capacidad y su
flujo por el vector (cu , fu ).

Observación 11.1. No hay un acuerdo unánime en cuanto al concepto de


flujo en el problema de flujo máximo. Algunos autores asocian el concepto de
circulación al concepto de flujo, mientras que el concepto de (s,t)-flujo lo utilizan
en el caso en que se relaje la ley de conservación de flujo para los vértices s y
t, sin necesidad de introducir el arco de retorno (t, s).

El problema de flujo máximo es el siguiente:


Dada una red de transporte y fijados dos vértices s, t ∈ V , determinar un
(s,t)-flujo de forma que el flujo por el arco de retorno f0 sea máximo.

Claramente se ve que en el ejemplo 11.1, el flujo f no es máximo. El flujo


0t
f = (175, 75, 100, 0, 75, 100) sı́ es máximo.

Para plantear el problema del ejemplo 11.2 son precisas algunas modificacio-
nes adicionales.
En primer lugar, la representación natural de las compatibilidades empleado-
tarea se realiza con un grafo mientras que el problema de flujo máximo se plantea
en digrafos. Es suficiente dotar de un sentido ficticio a las aristas en el grafo
bipartito, por ejemplo, de los empleados a las tareas.
A continuación, y con el fin de plantear el problema como un problema de
flujo máximo, se introducen dos vértices ficticios s y t y arcos ficticios desde s a
Red de transporte. Flujo compatible ORED 179

(∞,3)

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


s E1 T1 t
(1,1) (1,1) (1,1)
(1,0)
(1,1) (1,1) (1,1)
E2 T2
(1,1)

(1,0)
E3 T3

Figura 11.4: Red ampliada y solución del problema de asignación del Ejem-
plo 11.2

los empleados y desde cada tarea a t. La red de transporte se completa asignando


a todos los arcos, incluidos los ficticios, una capacidad igual a 1.
El problema de flujo máximo entre los vértices s y t permite resolver el
problema planteado en el ejemplo 11.2 sin más que interpretar el flujo entre los
vértices empleados-tareas: un flujo 1 indica que se realiza la asignación, en caso
contrario el flujo es 0. La ley de conservación de flujo garantiza que ningún
empleado es asignado a más de una tarea y ninguna tarea es realizada por más
de un empleado.
La figura 11.4 representa la red de transporte ampliada y la solución que
identifica el flujo máximo, que determina las siguientes asignaciones:

(E1, T 2); (E2, T 3); (E3, T 1)

El esquema general de cualquier algoritmo de flujo es el siguiente: a partir


de un flujo inicial, que en el problema de flujo máximo puede ser el flujo trivial,
se busca otro flujo que se aproxime a la solución del problema planteado, y
se sigue buscando hasta llegar a ésta. Por los resultados teóricos del capı́tulo
anterior, en que se probaba que cualquier flujo es combinación lineal de ciclos, se
observa que la diferencia entre dos flujos es siempre una combinación de ciclos.
Por consiguiente, dado un flujo, se estudia si la red admite un ciclo por el que se
pueda mover al menos una unidad de flujo; se introduce ası́ un ciclo incremental,
o, en general, una cadena incremental como aquélla que permite una variación
de flujo (incremento o disminución) en los arcos que la componen.
ORED 180 Problema de Flujo Máximo. Algoritmo de Ford-Fulkerson

Definición 11.3. Dado un flujo compatible con la red de transporte, a partir de


un flujo compatible f se dice que µ[a, b] es una cadena incremental si verifica:

fu < cu ∀u ∈ µ+

fu > 0 ∀u ∈ µ−

Un ciclo incremental es una cadena incremental cerrada.

Se supone que la cadena incremental es una cadena simple.


En el problema de flujo máximo, el objetivo es incrementar el flujo por el
arco de retorno, por lo que se tratará de buscar una cadena incremental entre
los vértices s y t. Obviamente, cuanto más flujo se envı́e por esta cadena, mayor
incremento del valor de flujo f0 se obtiene. Es fundamental conocer el lı́mite de
flujo que acepta una cadena incremental.

Definición 11.4. Dada una cadena incremental µ[a, b], se define su capacidad
como la máxima cantidad de flujo que se puede añadir por dicha cadena. Se
denota por c(µ) y se determina según

c(µ) = M in{ mı́n (cu − fu ); mı́n fu }


u∈µ+ u∈µ−

Antes de plantear el problema de determinar estas cadenas incrementales


para obtener nuevos flujos, se estudia teóricamente el problema de flujo máximo.

11.1.1. Problema de flujo máximo en grafos no dirigidos


En el caso en que el problema de flujo se plantee en una red no dirigida, la
capacidad de una arista e = {a, b} ∈ E puede ser saturada en el sentido (a, b) o
en el sentido contrario (b, a).
Para evitar enviar flujo en los dos sentidos de forma que se verifique f(a,b) +
f(b,a) ≤ ce siendo ambos flujos positivos, hay que transformar el grafo en un
digrafo equivalente de forma que se evite el flujo en sentido inverso en un mismo
arco.
Esta transformación se basa en sustituir cada arista e = {a, b} ∈ E en un
conjunto de cinco arcos que ligan los vértices a y b con dos nuevos vértices a0 y
b0 según se indica en la figura 11.5
Flujo máximo y corte mı́nimo ORED 181

a’

a b a b

b’

Figura 11.5: Transformación de una red de flujo no dirigida en una red dirigida

11.2. Flujo máximo y corte mı́nimo


Intuitivamente, el máximo (s,t)-flujo debe saturar la capacidad de un con-
junto de arcos que separan s y t. Serı́a el cuello de botella que acota el flujo
máximo.
Matemáticamente, esta idea se concreta con el siguiente concepto

Definición 11.5. Dada una red de transporte, un corte que separa s y t o (s,t)-corte
es un conjunto de arcos w+ (A) verificando A ⊂ V y s ∈ A, t 6∈ A.

En el ejemplo 11.1 un corte podrı́a ser el conjunto w+ (A) = {(s, b); (a, b); (a, t)}
asociado a A = {s, a}.

Definición 11.6. Dada una red de transporte, se define la capacidad de un


(s,t)-corte como la suma de las capacidades de los arcos que lo componen:
X
c(w+ (A)) = cu
u ∈ w+ (A)

Continuando con el ejemplo 11.1, se observa que el corte w+ (A∗ ) = {(a, t); (b, t)}
es el (s,t)-corte de capacidad mı́nima:

c(w+ (A∗ )) = 75 + 100 = 175

y esta capacidad mı́nima coincide con el máximo (s,t)-flujo.

Este resultado, que se formaliza a continuación, se verifica siempre y asocia


el máximo (s,t)-flujo con el (s,t)-corte de capacidad mı́nima.
ORED 182 Problema de Flujo Máximo. Algoritmo de Ford-Fulkerson

Proposición 11.1. Dada una red de transporte (G = (V, U ); {cu , u ∈ U }) y


fijados los vértices s, t ∈ V , para cualquier (s,t)-flujo f se verifica que su valor
de flujo f0 está acotado por la capacidad de cualquier (s,t)-corte. Es decir
X
f0 ≤ cu ∀A ⊂ V s ∈ A, t 6∈ A
+
u ∈ w (A)

Demostración
Sea A ⊂ V verificando s ∈ A y t 6∈ A y sea f un (s,t)-flujo. Considerando el
arco de retorno (t, s) con ı́ndice 0, se verifica que el flujo en la red ampliada que
entra en A coincide con el que sale:
X X
f0 + fu = fu
− +
u ∈ w (A) u ∈ w (A)
u 6= 0

Al ser el flujo compatible, 0 ≤ fu ≤ cu ∀u ∈ U y, por consiguiente,


X X X
f0 = fu − fu ≤ cu = c(w+ (A))
u ∈ w+ (A) u ∈ w− (A) u ∈ w+ (A)
u 6= 0

De esta proposición se deduce el siguiente corolario


Corolario 11.1. Dada una red de transporte, si existe un (s,t)-flujo f compa-
tible y un (s,t)-corte w+ (A) verificando
X
f0 = cu
+
u ∈ w (A)

entonces f es un (s,t)-flujo máximo y w+ (A) es el (s,t)-corte de capacidad mı́ni-


ma.
La cuestión es si a partir del flujo máximo se deduce el corte de capacidad
mı́nima. El siguiente teorema demuestra que siempre es posible asociar al flu-
jo máximo entre dos vértices el corte de capacidad mı́nima que los separa y
coinciden el flujo máximo y la capacidad mı́nima.
Flujo máximo y corte mı́nimo ORED 183

Teorema 11.1. (Ford-Fulkerson) Dada una red de transporte, fijados dos


vértices s, t ∈ V , el (s,t)-flujo máximo coincide con la mı́nima capacidad de los
(s,t)-cortes.

Demostración
Sea f t = (f0 , f1 , . . . , fm ) el (s,t)-flujo máximo.
Todos los arcos de la red ampliada se colorean con las siguientes reglas:

col((t, s)) = N

col(u) = N , para todo u ∈ U tal que fu = 0

col(u) = V , para todo u ∈ U tal que fu = cu

col(u) = R, para todo u ∈ U tal que 0 < fu < cu

Aplicando el lema de coloración de arcos, se concluye que el arco de retorno,


considerado como arco de referencia, tiene una de las dos opciones:

(t, s) ∈ µ(N + , V − , R+ , R− )
Esta opción implicarı́a que se puede incrementar el flujo f0 :
La capacidad del ciclo µ verifica

c(µ) = M in{ mı́n+ (cu − fu ); mı́n− fu } > 0


u∈µ u∈µ

por la regla de coloración elegida.


Por consiguiente, esta opción no es compatible con la optimalidad del flujo
f al ser posible incrementar f0 en la cantidad c(µ) > 0.
Se da necesariamente, pues, la otra opción.

(t, s) ∈ θ(N − , V + )
Este cociclo θ tiene sólo arcos negros y verdes, al estar todos los arcos
coloreados. Sea θ = w(A) dicho cociclo, formado por arcos negros que
entran en A, w− (A), y arcos verdes que salen de A, w+ (A).
Por la regla de etiquetado de vértices del lema de coloración y por el
procedimiento de coloración de los arcos, se verifica que todos los arcos de
ORED 184 Problema de Flujo Máximo. Algoritmo de Ford-Fulkerson

w+ (A) son verdes y todos los arcos de w− (A) son negros, de forma que el
valor del flujo f0 verifica:
X X X X
f0 = fu − fu = cu − 0=
u ∈ w+ (A) u ∈ w− (A) u ∈ w+ (A) u ∈ w− (A)
u 6= 0 u 6= 0

X
= cu = c(w+ (A))
u ∈ w+ (A)

De esta forma, se ha determinado el (s,t)-corte:

w+ (A) A = {v ∈ V / v etiquetado}

cuya capacidad es mı́nima y coincide con el valor del (s,t)-flujo máximo.

Con el fin de ilustrar el lema de coloración y el teorema 11.1, se aplica la


regla de coloración indicada en la demostración del teorema para comprobar la
existencia de un ciclo y un cociclo para el arco de retorno en los flujos f y f 0
del ejemplo 11.1.
Para el flujo f , considerando como arco de referencia el arco de retorno, se
tiene el ciclo, dibujado con trazo más grueso en la figura 11.6, formado por los
arcos
{(t, s); (s, b); (a, b); (a, t)}

siendo (t, s) negro, (s, b) y (a, t) rojos y (a, b) verde.


Para el flujo f 0 , se obtiene el cociclo de arcos dibujados con trazo más grueso
en la figura 11.7, identificado por w(A), con A = {s, a, b} y de forma que los
arcos del cociclo son: w+ (A) = {(a, t); (b, t)}, arcos verdes, y w− (A) = {(t, s)}
arcos negros. También se ha destacado en la citada figura el cociclo por una
lı́nea recta que cruza todos sus arcos.

11.2.1. Algoritmo asociado al lema de coloración


A partir del lema de coloración, se propone el algoritmo 11.1 para resolver
el problema de flujo máximo entre los vértices s y t de una red de transporte:
Flujo máximo y corte mı́nimo ORED 185

(∞,125)
(100,75)
s a

(100,50) (50,50) (75,25)


(100,100)
b t

Figura 11.6: Red de tráfico coloreada del Ejemplo 11.1: ciclo

(∞,175)
(100,75)
s a

(100,100) (50,0) (75,75)


(100,100)
b t

Figura 11.7: Red de tráfico coloreada del Ejemplo 11.1: cociclo (solución óptima)
ORED 186 Problema de Flujo Máximo. Algoritmo de Ford-Fulkerson

(106 ) 2 (106 )

1 (1) 4
(106 ) (106 )

Figura 11.8: Red de tráfico con capacidades no homogéneas

11.3. Convergencia y complejidad del algoritmo de


Ford-Fulkerson
El análisis del algoritmo de Ford-Fulkerson debe distinguir los casos en que
las capacidades son magnitudes enteras del caso general:

Caso entero.
Considerando que la aplicación del lema de coloración tiene complejidad
O(m), la complejidad del algoritmo de Ford-Fulkerson es O(m · C), siendo
C el máximo valor de las capacidades de los arcos. Esto último se justifica
al aumentar al menos en una unidad el valor del flujo en cada iteración,
lo que se consigue al determinar un ciclo en la red ampliada.
Esta dificultad se manifiesta en la red de transporte de la figura 11.8. Una
mala elección del ciclo en cada iteración, por ejemplo identificando los
vértices de ı́ndice menor, provocarı́a el que se precisaran 106 iteraciones
hasta llegar al flujo máximo entre los nodos 1 y 4.
El que la complejidad de un algoritmo dependa de la magnitud de los datos
provoca su carácter exponencial, ya que —por definición de dimensión de
un ejemplo— los datos se almacenan un un número de bits que depende
del logaritmo de su magnitud, y la relación entre un número y su logaritmo
es exponencial.

Caso general.
En el caso en que las capacidades sean irracionales (el caso racional se
traslada fácilmente al caso entero), puede incluso no converger el algoritmo
de Ford-Fulkerson. Ésta es la situación del ejemplo 11.3 propuesto por Ford
y Fulkerson en 1962, que se detalla a continuación.
Convergencia y complejidad del algoritmo de Ford-Fulkerson
ORED 187

Algoritmo 11.1: [f ] = FluMaxColor(G = (V, U ∪ (t, s)), {cu u ∈ U } )


Entrada:
G = (V, U ) : Digrafo de entrada, s, t ∈ V ; (t, s) se añade a U si no existiera.
{cu , u ∈ U } : capacidades de los arcos de la red de transporte (c(t,s) = ∞).
Salida:
f : Flujo máximo de la red (f0 = f(t,s) es el valor que se envı́a desde s a t.
Inicialización:
El flujo inicial es el trivial, que es un flujo compatible.
f = 0 ∈ <m+1
Proceso:
loop
Regla de coloración de los arcos:
col(t, s) = N
col(u) = N ∀u ∈ U / fu = 0
col(u) = V ∀u ∈ U / fu = cu
col(u) = R ∀u ∈ U / 0 < fu < cu
[p, A] = LemaColor(G = (V, U ∪ (t, s)); {col(u), u ∈ U }; col(t, s) = N )
Se comprueba la salida del Lema de coloración: ciclo (p(t) 6= 0) o cociclo
(p(t) = 0)
if p(t) 6= 0 then
Mientras se etiquete t (p(t) 6= 0) se continua. En este caso, existe un
ciclo (incremental) al unir la cadena µ = µ[s, t] con el arco de retorno
(t, s).
Se envı́a el máximo flujo posible por el ciclo (c(µ)) por los arcos,
incrementando si son positivos y disminuyendo si son negativos.
c(µ) = M in{mı́nu∈µ+ {cu − fu }; mı́nu∈µ− {fu }}
fu = fu + c(µ) ∀u ∈ µ+
fu = fu − c(µ) ∀u ∈ µ−
else
En este caso, no se puede incrementar el valor del flujo pues se ha
llegado al máximo identificando el corte de capacidad máxima w+ (A).
Fin del algoritmo.
return f es el flujo máximo entre s y t.
end if
end loop
ORED 188 Problema de Flujo Máximo. Algoritmo de Ford-Fulkerson

x1 y1

x2 y2
s t
x3 y3

x4 y4

Figura 11.9: Red de transporte del Ejemplo 11.3

Ejemplo 11.3. Sea la red de transporte representada en la figura 11.9.


Todos las aristas representan arcos en los dos sentidos y sus capacidades
1
son 1−σ excepto los arcos siguientes:

cx1 ,y1 = 1 cx2 ,y2 = σ cx3 ,y3 = cx4 ,y4 = σ 2



5−1
siendo σ = 2 verificando la propiedad σ k = σ k+1 + σ k+2 para todo k.
En este ejemplo, el algoritmo de Ford-Fulkerson no converge a la solución
óptima.

En cualquier caso, el algoritmo de Ford-Fulkerson funciona aceptablemente


bien en los casos más habituales, con capacidades enteras y valores no excesi-
vamente grandes. En el caso general, sin embargo, hay algoritmos con mejores
propiedades teóricas, como los de Edmond y Karp o Goldberg y Tarjan, que se
estudiarán en el capı́tulo siguiente.
A continuación se detallan dos versiones del algoritmo de Ford-Fulkerson.

11.4. Algoritmo asociado al grafo incremental (*)


A continuación se introducen las ideas básicas del algoritmo de Ford-Fulkerson
para resolver el problema de flujo máximo. Partiendo de un flujo inicial —que
puede ser el flujo trivial— el algoritmo lo modifica de forma que el valor del
flujo f0 del nuevo flujo ası́ obtenido es mayor que el anterior. En cada una de
estas iteraciones se determina un camino que une los vértices s y t en un digrafo
que se asocia a cada flujo y que se denomina el grafo incremental. El algoritmo
termina cuando no se puede incrementar el valor del flujo.
Algoritmo asociado al grafo incremental (*) ORED 189

75
s 25 a
50 25
50 50 50

b t
100

Figura 11.10: Grafo incremental respecto del flujo f del Ejemplo 11.1(equivalente
al de la figura 11.6)

Definición 11.7. Planteado un problema de flujo máximo de s a t y dado un


flujo compatible f , se define el grafo incremental, que se denota por G(f ) al
digrafo G(f ) = (V, U (f )), donde el conjunto de arcos U (f ) se construye de la
siguiente forma:
(
u+ = (i, j) ∈ U (f ) si fu < cu
∀u = (i, j) ∈ U −
u = (j, i) ∈ U (f ) si fu > 0

En el grafo incremental asociado a un flujo, se reproduce el arco de la red sólo


cuando su flujo se pueda incrementar; se introduce el arco en sentido contrario
cuando se pueda reducir el flujo. Las dos opciones no son excluyentes, pudiendo
tener el grafo incremental arcos de sentido contrario uniendo dos vértices. El
arco de retorno no se incluye en el grafo incremental.
A cada arco de U (f ) se le asocia una cantidad que representa el flujo que
admite el arco en cuestión; esta capacidad será cu − fu cuando el arco permita
incremento de flujo y será fu cuando permita la disminución del mismo.

Siguiendo con el ejemplo 11.1, el grafo incremental asociado al flujo f serı́a


el indicado en la figura 11.10.
La clave del algoritmo radica en que el flujo f permite un incremento de
flujo en el valor del flujo f0 si, y sólo si, existe un camino µ[s, t] en el grafo
incremental G(f ).

En el grafo incremental G(f ) del ejemplo 11.1 existe un camino µ[s, t] =


{(s, b); (b, a); (a, t)}.

El mı́nimo de todas las capacidades residuales de los arcos de este camino


ORED 190 Problema de Flujo Máximo. Algoritmo de Ford-Fulkerson

75
s 25 a

100 75
50

b t
100

Figura 11.11: Grafo incremental del flujo f ’ del Ejemplo 11.1(equivalente al de


la figura 11.7): (solución óptima)

en el Grafo incremental es la capacidad de la cadena residual asociada en la red


de transporte. Se denota por ∆(µ[s, t]).

Siguiendo con el ejemplo 11.1,

∆(µ[s, t]) = M in{50, 50, 50} = 50

El nuevo flujo obtenido será f 0 , donde



 fu + ∆(µ[s, t]) si

 u+ ∈ µ[s, t]
fu0 = fu − ∆(µ[s, t]) si u− ∈ µ[s, t]

u 6∈ µ[s, t]

 f
u si

Es decir, los arcos del grafo incremental orientados positivamente, aquéllos


que mantienen el sentido de los arcos originales, incrementan el flujo; mientras
que los orientados negativamente, lo disminuyen.
t
El flujo f 0 = (125, 75, 100, 0, 75, 100) es el flujo máximo. Su grafo incremen-
tal es el indicado en la figura 11.11.
Obsérvese que en este digrafo no existe un camino que una los vértices s y
t.
Cuando no existe un camino entre s y t en el grafo incremental, es porque
el (s, t)-flujo f es máximo. El corte de capacidad mı́nima es w+ (A), siendo

A = {i ∈ V / ∃µ[s, i] camino en G(f) }

Una versión básica del algoritmo de Ford-Fulkerson basado en el grafo in-


cremental es la siguiente:
Algoritmo asociado al grafo incremental (*) ORED 191

Algoritmo 11.2: [f ] = FluMaxGraIncr(G = (V, U ∪ (t, s)), {cu u ∈ U } )


Entrada:
G = (V, U ) : Digrafo de entrada, s, t ∈ V ; (t, s) se añade a U si no existiera.
{cu , u ∈ U } : capacidades de los arcos de la red de transporte (c(t,s) = ∞).
Salida:
f : Flujo máximo de la red (f0 = f(t,s) es el valor que se envı́a desde s a t.
Inicialización:
El flujo inicial (h = 0) es el trivial, que es un flujo compatible.
h=0
f h = 0 ∈ <m+1
Proceso:
loop
Construcción del grafo incremental G(fh ) = (V, U (fh )):
∀u = (i, j) ∈ U :
Si fuh < cu : (i, j) ∈ U (f h ) y ch (i, j) = cu − fuh
Si fuh > 0 : (j, i) ∈ U (f h ) y ch (j, i) = fuh
Se comprueba si existe un camino en el grafo incremental.
if ∃ un camino µh [s, t] en G(f h ) then
En este caso, sı́ existe tal camino y se envı́a el máximo flujo posible,
incrementando o disminuyendo el flujo de cada arco del camino.
c(µh [s, t]) = mı́n(i,j)∈µh {ch (i, j)}
h+1
f(i,j) = fuh + c(µh [s, t]) si (i, j) ∈ µh [s, t] ∧ u = (i, j) ∈ U
h+1
f(j,i) = fuh − c(µh [s, t]) si (i, j) ∈ µh [s, t] ∧ u = (j, i) ∈ U
fuh+1 = fuh si (i, j) 6∈ µh [s, t] ∧ (j, i) 6∈ µh [s, t]
f0h+1 ≡ f(t,s)
h+1 h
= f(t,s) + c(µh [s, t])
h=h+1
else
En este caso, no se puede incrementar el valor del flujo pues se ha
llegado al máximo.
Fin del algoritmo.
return f = f h es el flujo máximo entre s y t; f0 es el valor del flujo.
end if
end loop
ORED 192 Problema de Flujo Máximo. Algoritmo de Ford-Fulkerson

Una versión más detallada del algoritmo debe incluir un procedimiento cons-
tructivo del camino µh [s, t] en el grafo incremental G(f h ). Con este objetivo se
introducen las etiquetas de los vértices p(j) = +i o p(j) = −i para cualquier
vértice j ∈ V cuando al vértice j se llega en G(f h ), el grafo incremental, por el
arco (i, j). Si el arco es positivo, se marca con el signo +, y si es negativo, es
decir, cuando es el arco (j, i) ∈ U se marca con el signo −.
Simultáneamente, se almacena en el vector ∆(j) el máximo flujo que puede
llegar a j desde s utilizando el camino en el grafo incremental marcado por el
vector p(.).
Inicialmente, todos los vértices están sin etiquetar excepto s, cuando un
vértice i está etiquetado y existe un j tal que (i, j) ∈ U (f h ), entonces:

Si (i, j) ∈ U y fij < cij :


(
p(j) = +i
∆(j) = M in{∆(i); cij − fij }

Si (j, i) ∈ U y fji > 0 :


(
p(j) = −i
∆(j) = M in{∆(i); fji }
El proceso termina cuando se etiqueta el vértice t, siendo ∆(t) la capaci-
dad residual del camino µh [s, t]. El camino µh [s, t] se identifica a partir de las
etiquetas:
s → |p(|..|p(t)|..|)| → . . . → |p(|p(t)|)| → |p(t)| → t

El algoritmo de Ford-Fulkerson con etiquetado de vértices serı́a el siguiente:

Ejemplo 11.4. Sean la red de transporte y el flujo compatible representados en


la figura 11.12.
El grafo incremental asociado es el representado en la figura 11.13.
El camino incremental

µ[s, t] = {(s, 1); (1, 3); (3, 2); (2, t)}

con arcos positivos y negativos:

µ+ [s, t] = {(s, 1); (2, t)} µ− [s, t] = {(1, 3); (3, 2)}
Algoritmo asociado al grafo incremental (*) ORED 193

Algoritmo 11.3: [f ] = FluMaxEtiq(G = (V, U ∪ (t, s)), {cu u ∈ U } )


Entrada: G = (V, U ), digrafo de entrada, y {cu , u ∈ U }, capacidades de los
arcos.
Salida: f , flujo máximo de la red.
Inicialización:
El flujo inicial (h = 0) es el trivial, que es un flujo compatible.
h = 0, f h = 0 ∈ <m+1
Proceso:
loop
Construcción del grafo incremental G(fh ) = (V, U (fh )):
∀u = (i, j) ∈ U :
Si fuh < cu : (i, j) ∈ U + (f h ) ; ch (i, j) = cu − fuh
Si fuh > 0 : (j, i) ∈ U − (f h ) ;ch (j, i) = fuh
Etiquetado de vértices en G(fh )):
p(s) = s, p(j) = 0 ∀j ∈ V − {s}
∆(j) = ∞ ∀j ∈ V
El proceso se repite hasta que no se puedan etiquetar más vértices.
repeat
etiq = 0
Sea (i, j) ∈ U + (f h ) ∪ U − (f h ) tal que p(i) 6= 0 y p(j) = 0
Etiquetado del vértice j, ∆ es el máximo flujo que se puede enviar
desde s a j, se distingue si el arco es positivo o negativo.
if (i, j) ∈ U + (f h ) then
p(j) = i
∆(j) = M in{∆(i); ch (i, j)}
etiq = 1
else
p(j) = −i
∆(j) = M in{∆(i); ch (j, i)}
etiq = 1
end if
until etiq = 0
if p(t) 6= 0 then
Admite incremento de flujo en la cantidad ∆ y se identifican los arcos
del camino incremental que va de s a t.
fuh+1 = fuh ∀u ∈ U ∪ {(t, s)}
j=t
while j 6= s do
if p(j) > 0 then
u = (p(j), j)
fuh+1 = fuh+1 + ∆(t)
else
u = (j, −p(j))
fuh+1 = fuh+1 − ∆(t)
end if
j = |p(j)|
end while
else
No se admite incremento de flujo en el grafo incremental. Fin del
algoritmo.
return f = f h es el flujo máximo entre s y t; f0 es el valor del flujo.
end if
h=h+1
end loop
ORED 194 Problema de Flujo Máximo. Algoritmo de Ford-Fulkerson

(5,2)
(6,0) 1 2

s (2,2) (1,1) (2,1)


(5,5)
(7,4)
3 t

Figura 11.12: Red de transporte y flujo inicial del Ejemplo 11.4

-
1 2
+
+
-
s - + -
-
-
3 t
+

Figura 11.13: Grafo incremental del Ejemplo 11.4

es identificada al marcar los vértices según indica la tabla

j p(j) ∆(j)
s s ∞
1 s 6
2 −3 1
3 −1 2
t 2 1

Al ser p(t) = 2 6= 0, el camino incremental se construye según:

t ← |p(t)| = 2 ← |p(2)| = 3 ← |p(3)| = 1 ← |p(1)| = s

La capacidad de la cadena incremental asociada al camino identificado es


∆(t), que es mayor que 0 si p(t) 6= 0. El flujo de los arcos de esta cadena
aumentan o disminuyen en esta cantidad ∆(t) para mantener la ley de conser-
vación de flujo.

Algunos problemas de flujo máximo se plantean en redes de transporte cuyos


arcos están originados en el desdoblamiento de las aristas de la red. En estos
Modelo de programación asociado ORED 195

casos, la definición del grafo incremental se complica al tener que considerar la


capacidad residual de cada arco como el flujo que admite el arco en el mismo
sentido mas el flujo que puede disminuir el arco en sentido contrario:
Sean, por ejemplo, dos arcos de sentido contrario u = (x, y) y u−1 = (y, x)
que se asocian a la arista {x, y} del grafo original, que tiene capacidad 5. Si
en una iteración concreta, el flujo de los arcos es fu = 3 y fu−1 = 0, el grafo
incremental tendrá dos arcos:
(x, y), con capacidad residual 2
(y, x), con capacidad residual 3 + 5 = 8

11.5. Modelo de programación asociado


En forma compacta, el problema de flujo máximo entre s y t serı́a


 M ax x0


 sujeto a : Ax =0
P


 x ≤c

x ≥0

donde xt = (x0 , x1 , . . . , xm ) especifica el flujo por los arcos del digrafo incluido
el arco ficticio (t, s), con flujo x0 ; c es el vector de las capacidades de los arcos del
digrafo, siendo c0 = ∞ la capacidad del arco (t, s) y A es la matriz de incidencia
del digrafo asociado a la red de transporte ampliada.

El primer grupo de restricciones, Ax = 0, exige que el vector x sea un flujo


al verificar la ley de conservación de flujo. Hay que observar que hay tantas
ecuaciones como vértices y cada una de ellas exige que la suma de los flujos de
los arcos que salen del vértice asociado menos la suma de los flujos de los arcos
que entran es igual a 0. El segundo grupo de restricciones, x ≤ c, junto con las
restricciones de no negatividad, x ≥ 0, impone la compatibilidad del flujo. Es
decir, cualquier solución factible del problema P es un flujo compatible.

El problema dual de P se construye a partir de las variables duales (wi , i ∈


V ), asociadas a cada una de las n ecuaciones de conservación de flujo, y las
variables (wij , (i, j) ∈ U ) asociadas a las m restricciones de capacidad del flujo
ORED 196 Problema de Flujo Máximo. Algoritmo de Ford-Fulkerson

de cada arco. Formalmente, introduciendo el vector de n + m componentes

wt = (w1 , . . . , wn , wu1 , . . . , wum )

el problema dual es

 M in

 (0t , ct )w
D (At , Im )w ≥ e0

≥ 0 ∀u ∈ U

 wu

siendo et0 = (1, 0, . . . , 0) un vector unitario de dimensión m + 1 y c el vector de


las capacidades de los arcos con m componentes y siendo Im una matriz con
m + 1 filas y m columnas siendo la primera fila de ceros y las últimas m filas la
matriz identidad Im .
Desarrollando el problema D en forma algebraica, se tiene:
 P

 M in (i,j)∈U cij wij


 wt −ws ≥1
D


 wi −wj +wij ≥ 0 ∀(i, j) ∈ U

wij ≥ 0 ∀(i, j) ∈ U

Conviene observar que la matriz (At , Im ) es totalmente unimodular, por


lo que la solución del problema D relajado continuamente será una solución
entera y se puede aplicar el algoritmo del simplex para llegar a ella. Como
se demostrará a continuación, cualquier corte que separa s y t es una solución
factible del problema D; en el caso de existencia de solución óptima del problema
de flujo máximo, existirá un valor máximo de flujo x0 que acota inferiormente la
función objetivo de cualquier solución factible del problema D, incluidas aquellas
soluciones asociadas a cortes que separan s y t. Como se puede encontrar una
solución factible (es lo que se demuestra a continuación) de un determinado
tipo, si ésta alcanza la cota inferior x0 se ha llegado a la solución óptima.

La relación dual de optimalidad del par de problemas duales (P, D) permite


asociar el flujo máximo con el corte mı́nimo. Esta relación se concreta al consi-
derar que cualquier corte que separa s y t se identifica con una solución factible
de D:
En efecto, cualquier corte está asociado a un subconjunto de vértices A ⊂ V
Modelo de programación asociado ORED 197

tal que s ∈ A y t 6∈ A. Las variables duales definidas por:

( (
1 i 6∈ A 1 u ∈ w+ (A)
wi = ∀i ∈ V wu = ∀u ∈ U
0 i∈A 0 u 6∈ w+ (A)

son soluciones factibles del problema D:

wt − ws = 1 − 0 = 1 ≥ 1

Para todo u = (i, j) ∈ U , y para cualquiera de los cuatro casos de per-


tenencia o no pertenencia de los vértices i, j al conjunto A, se verifica la
restricción wi − wj + wu ≥ 0; en efecto:

u = (i, j) wi wj wu wi − wj + wu
i∈A j∈A 0 0 0 0
i∈A j 6∈ A 0 1 1 0
i 6∈ A j∈A 1 0 0 1
i 6∈ A j 6∈ A 1 1 0 0

wu ≥ 0 ∀u ∈ U

Por otra parte, la función objetivo del problema D evalúa la capacidad de


cada corte.
En consecuencia, y por el teorema 11.1 de Ford-Fulkerson, que asocia el flujo
máximo a la capacidad mı́nima del corte que separa s y t, se ha conseguido una
solución factible de D (el corte de capacidad mı́nima) cuya función objetivo
alcanza la cota inferior del flujo máximo x0 , por lo que el óptimo de D identifica
el corte de capacidad mı́nima.

Considerando que la matriz de incidencia de la red ampliada del ejemplo 11.1


es
 
−1 1 1 0 0 0
 
 0 −1 0 0  1 1
A= 

 0 0 −1 −1 0 1 

1 0 0 0 −1 −1

el problemas de programación lineal P que modeliza el problema de flujo máximo


entre s y t es:
ORED 198 Problema de Flujo Máximo. Algoritmo de Ford-Fulkerson



 M ax x0

−x0



 +x1 +x2 =0





 −x1 +x3 +x4 =0




 −x2 −x3 +x5 =0

x0 −x4 −x5 =0




P x1 ≤ 100

≤ 100



 x2





 x3 ≤ 50




 x4 ≤ 75

x5 ≤ 100





xj ≥ 0 ∀j = 0, . . . , 5

Una solución óptima del problema P es

x̄0 = 175 x̄1 = 75 x̄2 = 100 x̄3 = 0 x̄4 = 75 x̄5 = 100

Asociando las variables duales ws , wa , wb , wt a cada una de las ecuaciones


de conservación de flujo de los vértices s, a, b, t respectivamente; y definiendo
las variables duales wu , con los ı́ndices u ∈ {1, . . . , 5} asociados a cada uno
de los arcos (s, a), (s, b), (a, b), (a, t), (b, t) respectivamente, se tiene planteado el
problema dual:


 M in 100w1 +··· +100w5

wt −ws ≥1





−wa ≥0



 ws +w1


 ws −wb +w2 ≥0
D


 wa −wb +w3 ≥0

wa −wt +w4 ≥0





wb −wt +w5 ≥0





≥ 0 ∀u ∈ {1, . . . , 5}

wu

Una solución óptima del problema D es

w̄s = w̄a = w̄b = 0 w̄t = 1 w̄1 = w̄2 = w̄3 = 0 w̄4 = 1 w̄5 = 1


Capı́tulo 12
Problema de Circulación

En algunos problemas que se pueden modelizar como flujos en redes inter-


vienen costes al penalizar el paso de las unidades de flujo por los arcos; serı́a
el caso, por ejemplo, del peaje de automóviles en tramos de autopistas, uso de
lı́neas de alta tensión en la red eléctrica, etc. El Problema de Circulación busca
el flujo de mı́nimo coste que se mueve por una red.
A diferencia del Problema de flujo fijo y coste mı́nimo, no se fija el número de
unidades que se mueven. Tampoco trata de maximizar el flujo entre dos vértices
concretos, que es el problema de flujo máximo. Incorpora, además, la posibili-
dad de limitar inferiormente el flujo en cada arco, de forma que no siempre se
garantiza la existencia de un flujo compatible; en este caso, debe determinar
cuál es el subconjunto de vértices que lo impide.
En consecuencia, el Problema de Circulación generaliza los problemas de
flujos vistos en capı́tulos anteriores. También el problema de camino mı́nimo se
puede plantear como un Problema de Circulación.
Se estudia el algoritmo de desviaciones, introducido por Fulkerson [19] en
1961, que está basado en las propiedades duales del problema de programación
lineal asociado y en el lema de coloración de arcos.

12.1. Planteamiento del problema


Formalmente, el problema es el siguiente:
Dado un digrafo G = (V, U ), donde cada arco u ∈ U tiene asociadas tres
magnitudes: un lı́mite inferior de flujo lu , un lı́mite superior de flujo o capacidad
ORED 200 Problema de Circulación

cu y un coste por unidad de flujo que pasa por dicho arco du , determinar el flujo
compatible con los vectores l, c ∈ IRm de forma que el flujo que circula por la
red tenga coste mı́nimo.

Se supone que el lı́mite inferior de flujo de cada arco es no negativo, es decir,


lu ≥ 0 ∀u ∈ U . Se excluye ası́ la posibilidad de flujos negativos.

Planteado como un problema de programación lineal, denotando por xu el


flujo del arco u ∈ U , se tiene
 P

 M in u∈U du xu

 P P

u∈w− (i) xu − u∈w+ (i) xu = 0 ∀i ∈ V
P


 xu ≥ lu ∀u ∈ U

xu ≤ cu ∀u ∈ U

Vectorialmente, el problema de programación lineal se puede modelizar como




 M in dt x


 −Ax =0
P


 x ≥l

x ≤c

siendo A la matriz de incidencia de la red. Se ha introducido el signo − en


las restricciones asociadas a la ley de conservación de flujo para simplificar la
notación en el desarrollo del capı́tulo.

Como ya se apuntó anteriormente, este problema generaliza los vistos en los


capı́tulos anteriores:

Problema de camino mı́nimo entre s y t en G = (V, U ) siendo {du , u ∈ U }


las longitudes de los arcos:
El problema de circulación considera como digrafo (V, U ∪ {(t, s)}) y las
magnitudes asociadas son:

• lts = 1
lu = 0 ∀u ∈ U
• cts = 1
cu = 1 ∀u ∈ U
Planteamiento del problema ORED 201

• dts = 0
du = du ∀u ∈ U

El flujo solución es un vector de 0’s y 1’s de forma que los arcos con flujo 1
identifican un camino en G que va desde s a t y que es cerrado por el arco
de retorno (t, s) añadido. De todos los posibles caminos en G que unen s
y t se elige el de menor coste.

Problema de flujo máximo entre s y t en G = (V, U ) siendo {cu , u ∈ U }


las capacidades de los arcos:
El problema de circulación considera como digrafo (V, U ∪ {(t, s)}) y las
magnitudes asociadas son:

• lts = 0
lu = 0 ∀u ∈ U
• cts = ∞
cu = cu ∀u ∈ U
• dts = −1
du = 0 ∀u ∈ U

El flujo solución es el flujo máximo desde s hasta t puesto que la función


objetivo intenta maximizar el valor del flujo, que es el flujo por el arco de
retorno añadido (t, s).

Problema de flujo fijo y coste mı́nimo en G = (V, U ), fijando en v el flujo


entre los vértices s y t; las capacidades de los arcos son {cu , u ∈ U } y los
costes {du , u ∈ U } :
El problema de circulación considera como digrafo (V, U ∪ {(t, s)}) y las
magnitudes asociadas son:

• lts = v
lu = 0 ∀u ∈ U
• cts = v
cu = cu ∀u ∈ U
• dts = 0
du = du ∀u ∈ U
ORED 202 Problema de Circulación

El flujo compatible solución mueve v unidades entre s y t, y es el de coste


mı́nimo.

Problema de flujo compatible en G = (V, U ), considerando como lı́mite


inferior {lu , u ∈ U } y como lı́mite superior {cu , u ∈ U } :
El problema de circulación considera como digrafo el digrafo original (V, U )
y las magnitudes asociadas son:

• lu = lu ∀u ∈ U
• cu = cu ∀u ∈ U
• Valores arbitrarios para du ∀u ∈ U

El flujo solución será un flujo compatible cualquiera, los diferentes valores


del vector d determinarán el flujo compatible.

Para ilustrar el problema se introduce el siguiente ejemplo

Ejemplo 12.1. Al transportar la energı́a eléctrica por una determinada comarca


se tiene la opción de elegir las lı́neas de alta tensión por donde debe circular. Los
tramos de las lı́neas de alta tensión se caracterizan por una intensidad mı́nima
y una intensidad máxima que especifican los lı́mites que no deben ser superados.
Cada tramo tiene asociado un coste unitario de forma que el coste total es la
suma de todos los flujos de los tramos multiplicados por sus costes asociados.
Modelizando cada tramo por un arco u ∈ U y denotando por lu , cu y du los
lı́mites inferior y superior del flujo y el coste de cada tramo se tiene el siguiente
digrafo con 6 arcos y 4 vértices:

u i j lu cu du
u1 1 2 2 5 1
u2 1 3 0 2 3
u3 2 3 1 3 2
u4 2 4 2 4 2
u5 3 4 1 3 4
u6 4 1 1 3 1

Los datos de la red se representan en la figura 12.1 asignando a cada arco el


vector (cu , fu , lu ; du ).
Planteamiento del problema ORED 203

1 4
(3,,1;1)
(5,,2;1) (4,,2;2)

(2,,0;3) 2 (3,,1;4)

(3,,1;2)

Figura 12.1: Red del ejemplo 12.1

El problema de programación lineal P queda de la siguiente forma

M in x12 +3x13 +2x23 +2x24 +4x34 +x41


−x12 −x13 +x41 =0
x12 −x23 −x24 =0
+x13 +x23 −x34 =0
+x24 +x34 −x41 =0
x12 ≥2
x13 ≥0
x23 ≥1
x24 ≥1
x34 ≥1
x41 ≥1
x12 ≤5
x13 ≤2
x23 ≤3
x24 ≤4
x34 ≤3
x41 ≤3
ORED 204 Problema de Circulación

12.2. Condiciones de optimalidad. Flujo y tensión


de un arco
Planteando el problema P de programación lineal en forma canónica, se
tienen la forma vectorial:



 M in dt x

−Ax =0




P x ≥l

−x ≥ −c






 x ≥0

o la forma algebraica:
 P

 M in u∈U du xu

 P P

u∈w− (i) xu − u∈w+ (i) xu = 0 ∀i ∈ V
P


 xu ≥ lu ∀u ∈ U

−xu ≥ −cu ∀u ∈ U

Asociando a los tres grupos de restricciones del problema P las variables


duales wi , λu y γu respectivamente, se plantea el problema dual:
 P P
 M ax

 u∈U lu λu − u∈U cu γu
D wj − wi + λu − γu ≤ du ∀u = (i, j) ∈ U

≥ 0 ∀u ∈ U

 λu , γu

El problema dual asociado al ejemplo 12.1 es el siguiente:

M ax 2λ12 +...+ λ41 −5γ12 −...− 3γ41


−w1 +w2 +λ12 −γ12 ≤1
−w1 +w3 +λ13 −γ13 ≤3
−w2 +w3 +λ23 −γ23 ≤2
−w2 +w4 +λ24 −γ24 ≤2
−w3 +w4 +λ34 −γ34 ≤4
w1 −w4 +λ41 −γ41 ≤1
λu , γu ≥ 0 ∀u
Condiciones de optimalidad. Flujo y tensión de un arco ORED 205

A la diferencia de las variables duales wj − wi asociadas a los extremos de


cada arco u = (i, j) ∈ U se denomina tensión del arco y se denota por:

tu ≡ wj − wi ∀u = (i, j) ∈ U

El teorema de las holguras complementarias proporciona condiciones necesa-


rias y suficientes para las soluciones óptimas del par de problemas duales (P, D),
que se concretan en las siguientes implicaciones:

xu > 0 =⇒ wj − wi + λu − γu = du ∀u = (i, j) ∈ U

λu > 0 =⇒ xu = lu ∀u ∈ U

γu > 0 =⇒ xu = cu ∀u ∈ U

A partir de estas implicaciones, y considerando las tres posibilidades para el


valor del flujo óptimo xu del arco u ∈ U , se deducen las siguientes igualdades al
imponer que lu < cu :

xu = lu =⇒ γu = 0
En caso contrario, es decir si γu > 0, se deducirı́a que xu = cu .
Al ser γu = 0, por la restricción asociada al problema dual, y al ser λu ≥ 0,
se concluye que
tu = wj − wi ≤ du

xu = cu =⇒ λu = 0
Se demuestra de forma análoga al caso anterior.
Al ser xu > 0, por ser cu > lu ≥ 0, se deduce que tu + λu − γu = du . Al
verificarse λu = 0 y ser γu ≥ 0, se obtiene

tu ≥ du

(
λu = 0
lu < xu < cu =⇒
γu = 0
Al ser xu > lu ≥ 0, por la condición de holgura complementaria asociada
a la variable xu > 0, se obtiene que tu + λu − γu = du . Considerando,
ORED 206 Problema de Circulación

además, que λu = γu = 0, se concluye

tu = du

Se han deducido ası́ las especificaciones de las soluciones óptimas del par de
problemas duales (P, D) para cualquier arco u ∈ U verificando que lu < cu :



 x u = lu =⇒ tu ≤ du
∀u = (i, j) ∈ U : lu < xu < cu =⇒ tu = du

=⇒ tu ≥ du

 x u = cu

Cuando el arco u ∈ U verifique lu = cu no se deduce nada, pudiendo ser su


tensión tu menor, igual o mayor que du .

En el ejemplo 12.1, las soluciones óptimas del par de problemas duales (P, D)
son las siguientes:
xt = (3, 0, 1, 2, 1, 3)

wt = (1, 2, 0, 0)

λt = (0, 4, 4, 4, 4, 0)

γ t = (0, 0, 0, 0, 0, 0)

La tabla de los valores óptimos de flujo y tensión, comparados con los lı́mites
de flujo y coste, son los siguientes

u = (i, j) xu lu cu tu du
(1, 2) 3 2 5 1 1
(1, 3) 0 0 2 −1 3
(2, 3) 1 1 3 −2 2
(2, 4) 2 2 4 −2 2
(3, 4) 1 1 3 0 4
(4, 1) 3 1 3 1 1

Se observa que se verifican las especificaciones de optimalidad deducidas an-


teriormente.
Diagrama de especificaciones ORED 207

12.3. Diagrama de especificaciones


El algoritmo de desviaciones, conocido en la literatura como out of kilter,
resuelve el problema de circulación a partir de las condiciones de optimalidad
deducidas anteriormente.
En la sección anterior se ha visto que la variable de decisión del problema P
es (xu , u ∈ U ); la variable de decisión del problema dual D es (wi , i ∈ V ), a partir
de estas últimas se ha definido para cada arco la variable tensión (tu , u ∈ U ),
siendo tu = wj − wi , con u = (i, j) ∈ U .
En la medida en que las variables (xu , tu ) asociadas a cada uno de los arcos de
la red u ∈ U no se desvı́en —de ahı́ el nombre del algoritmo— de las condiciones
de optimalidad, introducidas en la sección anterior como especificaciones, se
habrá llegado al óptimo; en caso contrario, hay que aproximar los valores de
dichas variables a dichas condiciones.
El análisis de las desviaciones determinadas anteriormente se realiza de una
forma fácil e intuitiva a partir de la representación en IR2 de cada arco u ∈ U al
considerar en el eje de las abscisas el valor del flujo xu y en el eje de ordenadas
la tensión del arco. Al marcar en la abscisa los valores lu y cu y en la ordenada
du se observa que las condiciones de optimalidad dibujan una lı́nea quebrada
en la que debe estar incluida la representación del par (xu , tu ) para la solución
óptima de cada uno de los problemas P y D.
La figura 12.2 representa el diagrama de especificaciones para un arco de la
red dirigida u ∈ U , se distingue el caso en que lu < cu del caso lu = cu :

tu tu

du

lu cu xu lu = cu xu

lu < cu lu = cu

Figura 12.2: Diagrama de especificaciones

El algoritmo de desviaciones trata de forzar los flujos y tensiones de todos los


ORED 208 Problema de Circulación

arcos para que el par flujo-tensión de todos ellos pertenezca a la lı́nea quebrada
de cada uno de los diagramas de especificaiones.
El algoritmo parte de un flujo inicial no necesariamente compatible, definido
con la única restricción de verificar la ley de conservación de flujo; por lo que
siempre vale el flujo trivial f = 0. La tensión inicial de cada arco se determina
a partir de los valores arbitrarios con los que se pueden inicializar las variables
duales wi para todos los vértices i ∈ V ; también vale la inicialización trivial
wi = 0 ∀i ∈ V .
El algoritmo, mediante modificaciones de flujo por medio de combinaciones
lineales de ciclos, mantiene la ley de conservación de flujo para cualquier flujo
intermedio xu ; por otra parte, si termina el algoritmo con la pertenencia del
par (xu , tu ) a la lı́nea quebrada para cualquier arco u ∈ U , se mantiene la
compatibilidad del flujo x. Se ha obtenido ası́ una solución factible del problema
P.
Para garantizar la factibilidad de la solución del problema dual D, que no
está asegurada con la inicialización wi = 0 para todo vértice i ∈ V , hay que
llegar al final del algoritmo, cuando (xu , tu ) pertenece a la lı́nea quebrada para
cualquier u ∈ U . En efecto, en ese momento, se construye la solución factible
del problema D de la siguiente forma, dependiendo del valor de xu :

x u = lu
En este caso, γu = 0 y al verificarse la condición tu ≤ du , se propone la
variable dual λu = du − tu ≥ 0 para verificar la restricción del problema
D asociada a u ∈ U .

xu ∈ (lu , cu )
En este caso, λu = γu = 0 y al ser tu = du , se verifican las restricciones
de D asociadas a u ∈ U .

xu = cu
Se propone λu = 0 y al ser tu ≥ du , se elige γu = tu − du ≥ 0 para verificar
las restricciones de D.

Es decir, al garantizar las especificaciones para todos los arcos, se han deter-
minado dos soluciones factibles del par de problemas duales (P, D) que, junto
a las condiciones de holgura complementaria, identifican las soluciones óptimas
de ambos problemas.
Esquema del algoritmo de desviaciones ORED 209

El problema a resolver se reduce a determinar un procedimiento que garanti-


ce la pertenencia de todos los pares (xu , tu ) a la correspondiente lı́nea quebrada.
El objetivo del algoritmo de desviaciones se detalla en la siguiente sección.

12.4. Esquema del algoritmo de desviaciones


Hay que distinguir los 7 tipos de arcos en función de la posición relativa de su
flujo y tensión respecto de la lı́nea quebrada en el diagrama de especificaciones.
Para cada uno de los tipos, representados en la figura 12.3, se indican las
direcciones en sentido horizontal y vertical que aproximan o mantienen la re-
presentación del arco por su valor de flujo y tensión a la lı́nea quebrada.

tu

6
• •3

4
• • •
2 5

xu

•1 •
7

Figura 12.3: Tipos de arco y movimientos válidos

De los 7 tipos de arcos, 5 de ellos, los tipos 1 − 5, están incluidos en la


lı́nea quebrada, se dice entonces que están dentro de especificación. Los arcos
de estos tipos son óptimos y el algoritmo los mantendrá dentro de la lı́nea; los
puede mover —siempre dentro de la lı́nea— llegando incluso a modificar su tipo.
Los tipos 6 y 7 identifican arcos que no son óptimos, se dice entonces que
están fuera de especificación o desviados. El algoritmo tratará de acercarlos a
la lı́nea.
Los movimientos válidos son de dos tipos: horizontales, aumentando o dis-
minuyendo el flujo, y verticales, aumentando o disminuyendo la tensión. En la
ORED 210 Problema de Circulación

siguiente tabla se caracterizan los 7 tipos de arcos comparando su flujo xu con


los lı́mites lu y cu y su tensión tu con el coste asociado al arco du . Para todos ellos
se identifican los movimientos válidos para el flujo y la tensión, especificando +
cuando sea un incremento y − cuando sea una disminución.

Tipo Flujo Tensión Variación de Flujo Variación de Tensión


1 x u = lu tu < du ±
2 lu < xu < cu tu = du ±
3 xu = cu tu > du ±
4 x u = lu tu = du + -
5 xu = cu tu = du - +
6 xu < cu tu > du + -
xu < lu tu ≤ du + -
7 xu > lu tu < du - +
xu > cu tu ≥ du - +

El algoritmo termina cuando no hay ningún arco desviado, es decir, cuando


todos ellos pertenecen a alguno de los 5 primeros tipos. En caso contrario, existe
un arco desviado, que es del tipo 6 o 7, y a partir de dicho arco, que será el
arco negro de referencia para aplicar el lema de coloración, que se detallará en
la siguiente sección.

Observación 12.1. En lo que resta del capı́tulo, se supondrá que el arco fuera
de especificación es del tipo 6. Si fuera del tipo 7 habrı́a que modificar sustan-
cialmente el algoritmo.
La elección del tipo 6 no es arbitraria, ya que si se inicializa el algoritmo
con xu = 0 ∀u ∈ U y wi = 0 ∀i ∈ V , entonces la tensión de todos los arcos
es nula y todos los arcos que están fuera de especificación son del tipo 6 si se
supone que lu ≥ 0 ∀u ∈ U .

12.5. Regla de coloración. Procedimientos asocia-


dos.
Para definir la regla de coloración de arcos adecuada, hay que considerar
que el lema de coloración tiene dos opciones para el arco de referencia, del tipo
6: o bien pertenece a un ciclo o pertenece a un cociclo. La idea fundamental
es conseguir un aumento de flujo en el arco de referencia cuando pertenezca a
Regla de coloración. Procedimientos asociados. ORED 211

un ciclo. Por supuesto que los arcos del ciclo orientados positivamente deben
permitir también incremento de flujo mientras que los orientados negativamente
se asocian a disminuciones de flujo. La modificación de flujo en los arcos del ciclo
ası́ determinado garantiza la ley de conservación de flujo.
Considerando que los movimientos horizontales positivos en el diagrama de
desviación identifican incrementos de flujo en el arco correspondiente, se colo-
rearán de negro aquellos arcos que no puedan disminuir su flujo, de verde los
que no puedan aumentarlo y de rojo los que tengan holgura en los dos sentidos.
Los arcos que no permitan incremento ni disminución de flujo no se colorearán.
Por consiguiente, una vez determinado un arco del tipo 6 fuera de especifi-
cación como arco negro de referencia, el resto de los arcos se colorean siguiendo
la siguiente regla:

Arcos Negros : Tipos 4 y 6

Arcos Verdes : Tipos 5 y 7

Arcos Rojos : Tipo 2

Arcos sin colorear : Tipos 1 y 3

A partir de esta coloración, si el arco de referencia pertenece a un ciclo, éste


estará formado por arcos N , V y R y en los positivos se puede incrementar el
flujo, incluyendo al propio arco de referencia, mientras que en los negativos se
puede disminuir, por lo que los arcos del ciclo se acercan a las especificaciones
de optimalidad.
Con detalle se ve este procedimiento en la siguiente subsección. El otro pro-
cedimiento será la modificación de la tensión, que se verá después.

12.5.1. Modificación del flujo


Sea µ el ciclo identificado por el lema de coloración de arcos y sean µ+ y µ−
los conjuntos de arcos orientados positiva y negativamente; el arco de referencia
(tipo 6) pertenece a µ+ siendo de los tipos 2, 4 y 6 los arcos de µ+ y de los tipos
2, 5 y 7 los arcos de µ− . Los arcos de tipo 1 ó 3 no pueden pertenecer al ciclo.
ORED 212 Problema de Circulación

La modificación del flujo es la siguiente:



 xu + 

 u ∈ µ+
∀u ∈ U xu = xu −  u ∈ µ−

u 6∈ µ

 x
u

donde
 = mı́n{1 , 2 , 3 , 4 }

es el máximo valor permitido que evita que la representación en el diagrama de


especificaciones de alguno de los arcos del ciclo se pase de la derecha de la lı́nea
quebrada a la izquierda (al aumentar el flujo en µ+ ) o se pase de la derecha a
la izquierda (al disminuir el flujo en µ− ); en ambos casos, y dependiendo de si
están o no por encima del valor tu = du se tienen los cuatro casos siguientes:

u ∈ µ+ , tu ≥ du . Tipos 2, 4 y 6:

1 = mı́n{(cu − xu ) / u ∈ µ+ , tu ≥ du }

u ∈ µ+ , tu < du . Tipo 6:

2 = mı́n{(lu − xu ) / u ∈ µ+ , tu < du }

u ∈ µ− , tu > du . Tipo 7:

3 = mı́n{(xu − cu ) / u ∈ µ− , tu > du }

u ∈ µ− , tu ≤ du . Tipos 2, 5 y 7:

4 = mı́n{(xu − lu ) / u ∈ µ− , tu ≤ du }

Si alguno de estos conjuntos es vacı́o, se asigna el valor ∞ al parámetro i


asociado. En cualquier caso, el valor de  siempre será finito; el arco de referencia
garantiza que al menos 1 ó 2 sea finito. El arco o arcos que alcanzan el valor
 se denominan crı́ticos y cambian de tipo.

Continuando con el ejemplo 12.1, y suponiendo la inicialización:


Regla de coloración. Procedimientos asociados. ORED 213

wi = 0 ∀i ∈ V =⇒ tu = 0 ∀u ∈ U
xu = 0 ∀u ∈ U
se representan todos los arcos por el punto (0, 0) en cada uno de los diagramas
de desviación de la figura 12.4.

tu tu tu

• xu • xu • xu

u = (1, 2) u = (1, 3) u = (2, 3)


tu tu tu

• xu • xu • xu

u = (2, 4) u = (3, 4) u = (4, 1)

Figura 12.4: Desarrollo del ejemplo 12.1, flujo inicial

De los seis arcos, sólo uno de ellos está dentro de especificación, es el arco
(1, 3), que es del tipo 1. El resto, (1, 2); (2, 3); (2, 4); (3, 4); (4, 1) están fuera de
especificación y son todos del tipo 6.
Se escoge un arco fuera de especificación como arco de referencia, por ejem-
plo, el arco (1, 2).
Se colorean de negro los cinco arcos del tipo 6 y no se colorea el arco del tipo
1; ver esta coloración en la figura 12.5(a).
Por el lema de coloración se etiquetan los vértices 2, 4 y 1 y se identifica ası́
un ciclo formado por arcos negros:

{(1, 2); (2, 4); (4, 1)}

por el que se incrementa el flujo. El ciclo ası́ definido depende del etiquetado de
los vértices, no es único.
De forma gráfica, ver figura 12.4, el máximo flujo que permite el ciclo
ORED 214 Problema de Circulación

1 4 1 4
N 0

N N N N

0 2 N 0 2 N

N N

3 3

(a) (b)

Figura 12.5: Ejemplo 12.1: primera (a) y segunda (b) coloraciones; ciclo y cociclo

acercándose a la lı́nea quebrada en los tres diagramas de los arcos (1, 2), (2, 4) y
(4, 1) y sin sobrepasarla, es 1. El lı́mite lo impone el arco (4, 1), que es el único
arco crı́tico y que cambia de tipo, pasando de 6 a 1.
Formalmente, se verifica que 1 = 3 = 4 = ∞, mientras que

2 = mı́n{2 − 0, 2 − 0, 1 − 0} = 1

alcanzando este mı́nimo en el arco (4, 1).


Se modifica el flujo en el ciclo en 1 unidad, como todos los arcos son positivos,
se consigue ası́ un aumento obteniendo:

x12 = 1 x24 = 1 x41 = 1

El resto de los flujos de los arcos y todos los potenciales siguen siendo nulos.
El diagrama de especificaciones de estos tres arcos ha variado, obsérvese que
el arco crı́tico (4, 1) ha cambiado de tipo, puesto que ahora es del tipo 1; el
resto de arcos mantienen el mismo tipo que antes y habiendo, en consecuencia,
algún arco fuera de especificación. Los nuevos diagramas de especificaciones se
representan en la figura 12.6.
Se elige otra vez el arco (1, 2) como arco negro de referencia y al colorear el
resto de arcos son todos negros excepto (1, 3) y (4, 1) que se quedan sin colorear.
Ver esta coloración en la figura 12.5(b).
Al etiquetar, por el lema de coloración, los vértices 2, 3 y 4, se observa que el
Regla de coloración. Procedimientos asociados. ORED 215

tu tu tu

• xu • xu • xu

u = (1, 2) u = (1, 3) u = (2, 3)


tu tu tu

• xu • xu • xu

u = (2, 4) u = (3, 4) u = (4, 1)

Figura 12.6: Desarrollo del ejemplo 12.1, flujo primero

vértice 1 no se ha podido etiquetar, se ha identificado ası́ un cociclo w(A), siendo


A = {2, 3, 4}. Los arcos del cociclo están resaltados en la figura 12.5(b). El arco
(1, 2), según estipula el lema de coloración de arcos, pertenece a un cociclo.

12.5.2. Modificación de la tensión


En el caso en que el arco de referencia pertenezca a un cociclo, los movimien-
tos en el diagrama de especificaciones se consiguen modificando la tensión de
los arcos de dicho cociclo: aumentándola en w+ (A) y disminuyéndola en w− (A).
Éste es el segundo procedimiento que se introduce en esta sección.
La idea, al igual que en el caso del ciclo, es acercar para todos los arcos la
representación del diagrama de especificaciones a las condiciones de optimalidad;
esto es cierto al menos para el arco de referencia, aunque conviene observar
que acercar a la optimalidad no implica incluirla en la lı́nea quebrada. Sólo se
garantiza, al igual que en el caso del ciclo, que uno de los arcos del cociclo, el
arco crı́tico, cambiará de tipo de arco.
Sea w(A) el cociclo al que pertenece el arco de referencia. El conjunto A ⊂ V
está formado por los vértices marcados al tratar de llegar al extremo inicial
del arco de referencia siguiendo el lema de coloración. Los conjuntos w+ (A) y
ORED 216 Problema de Circulación

w− (A) distinguen los arcos orientados desde A hacia V − A o en sentido inverso


respectivamente. Por el lema de coloración, en w− (A) está incluido el arco de
referencia, que es N y del tipo 6; el resto de arcos de w− (A) sólo pueden ser de
tipo 1, 3, 4 ó 6; los arcos de w+ (A) sólo pueden ser de tipo 1, 3, 5 ó 7. Los arcos
de tipo 2 no pueden pertenecer al cociclo.
La modificación de la tensión de un arco especificada anteriormente se con-
sigue modificando la variable dual asociada a uno de sus extremos, ya que
tu = wj − wi si u = (i, j) ∈ U ; en concreto, para aumentar la tensión de los
arcos de w+ (A), y disminuirla en w− (A), se incrementa el valor de la variable
dual de los vértices no incluidos en A:
(
wi = wi + δ i 6∈ A
∀i ∈ V
wi = wi i∈A

donde

δ = mı́n{δ1 , δ2 }

es el máximo valor permitido que evita que la representación en el diagrama


de especificaciones de un arco de w− (A) baje por debajo de la lı́nea horizontal
de la lı́nea quebrada o que la representación en el diagrama de especificaciones
de un arco de w+ (A) suba por encima de la lı́nea horizontal de dicha lı́nea.
Obviamente, si la representación del arco de w− (A) está a la izquierda del valor
lu o si la representación del arco de w+ (A) está a la derecha del valor cu , ambos
topes no existen y el correspondiente valor serı́a ∞, serı́a el caso en que no
existan arcos en ninguno de los conjuntos siguientes:

δ1 = mı́n{tu − du / u ∈ w− (A), tu > du , xu ≥ lu }

δ2 = mı́n{du − tu / u ∈ w+ (A), tu < du , xu ≤ cu }

La regla de modificación de tensión hay que aplicarla mientras δ < ∞,


puesto que, a diferencia de la regla de modificación de flujo, podrı́a ocurrir que
δ1 = δ2 = ∞. Este caso está relacionado con la no existencia de flujo compatible
para la red en cuestión y se estudia en la sección 12.6.

Continuando con el desarrollo del ejemplo 12.1, los arcos del cociclo w(A),
Regla de coloración. Procedimientos asociados. ORED 217

con A = {2, 3, 4}, son:


w+ (A) = {(4, 1)}
w− (A) = {(1, 2); (1, 3)}
Se observa que al incrementar la variable dual asociada a los vértices de
V − A, en este caso, al aumentar w1 , aumenta la tensión de los arcos de w+ (A)
y disminuye la tensión de los arcos de w− (A).
Gráficamente, ver los diagramas de la figura 12.6, la tensión de los arcos
(1, 2) y (1, 3), ambos de tipo 6, no está limitada en su disminución; por tanto,
analı́ticamente, se obtendrı́a que δ1 = ∞ ya que {u ∈ w− (A) / tu > du , xu ≥
lu } = ∅.
Por otra parte, el único arco (4, 1) ∈ w+ (A), sı́ tiene limitado el incremento
de tensión, puesto que si aumenta más de 1 se saldrı́a de la lı́nea quebrada, en
este caso, el conjunto {u ∈ w+ (A), tu < du , xu ≤ cu } = {(4, 1)} 6= ∅ y se puede
determinar δ2 = mı́n{du − tu / u ∈ w+ (A), tu < du , xu ≤ cu } = 1.
Se verifica entonces que

δ = mı́n{δ1 , δ2 } = mı́n{∞, 1} = 1

siendo (4, 1) el arco crı́tico el que determina el incremento de la variable dual


de los vértices de V − A.
Por consiguiente, considerando como incremento de la variable w1 el valor
δ = 1, se obtiene:
w1 = 1 w2 = 0 w3 = 0 w4 = 0
Las tensiones de los arcos, ahora modificadas en los arcos del cociclo, y los
valores de flujo de los arcos:
x12 = 1 x13 = 0 x23 = 0 x24 = 1 x34 = 0 x41 = 1
determinan los siguientes diagramas de especificaciones de la figura 12.7:
El cambio fundamental que se ha provocado es el cambio del tipo del arco
crı́tico, (4, 1), que pasa del tipo 1 al tipo 4, y se coloreará de negro.

12.5.3. Esquema básico del algoritmo de desviaciones


La reiteración de la regla de coloración y del lema de coloración en función de
los cambios que se van produciendo en el diagrama de especificaciones, ası́ como
las correspondientes modificaciones de flujo (cuando hay un ciclo) y tensión
(cuando hay un cociclo) permiten acercar la representación de todos los arcos en
ORED 218 Problema de Circulación

tu tu tu

xu xu xu

• •
u = (1, 2) u = (1, 3) u = (2, 3)
tu tu tu


• xu • xu xu

u = (2, 4) u = (3, 4) u = (4, 1)

Figura 12.7: Desarrollo del ejemplo 12.1, flujo segundo

el diagrama de especificaciones a la lı́nea quebrada (condiciones de optimalidad).


El algoritmo termina cuando no existe ningún arco que pertenezca a los tipos
6 ó 7.

Continuando con el desarrollo del ejemplo 12.1, eligiendo de nuevo como


arco de referencia el arco (1, 2), de tipo 6, y aplicando el lema de coloración de
arcos, se etiquetan los vértices 2, 4 y 1. Se obtiene ası́ el mismo ciclo que antes,
por el que se puede incrementar 1 unidad de flujo y se obtiene el flujo
x12 = 2 x13 = 0 x23 = 0 x24 = 2 x34 = 0 x41 = 2
Este flujo, junto con las tensiones —que no varı́an respecto a la iteración
anterior— determina los siguientes diagramas en la figura 12.8.
No todos los arcos están dentro de especificación, concretamente hay dos
arcos del tipo 6: (2, 3) y (3, 4). Eligiendo (2, 3) como arco de referencia negro,
se identifica un cociclo con los vértices etiquetados A = {3, 4, 1}.
Incrementando la tensión en el arco de w+ (A) = {(1, 2)}, con lı́mite 2 y
disminuyendo la tensión en los arcos de w− (A) = {(2, 3); (2, 4)}, sin lı́mite
ninguno de ellos, se obtienen los nuevos valores de las variables duales:
w1 = 1 w2 = 2 w3 = 0 w4 = 0
y los nuevos diagramas de especificaciones son los de la figura 12.9.
Regla de coloración. Procedimientos asociados. ORED 219

tu tu tu

xu xu xu

• •
u = (1, 2) u = (1, 3) u = (2, 3)
tu tu tu


• xu • xu xu

u = (2, 4) u = (3, 4) u = (4, 1)

Figura 12.8: Desarrollo del ejemplo 12.1, flujo tercero

tu tu tu


xu xu xu


u = (1, 2) u = (1, 3) u = (2, 3)
tu tu tu


xu xu xu


u = (2, 4) u = (3, 4) u = (4, 1)

Figura 12.9: Desarrollo del ejemplo 12.1, flujo cuarto


ORED 220 Problema de Circulación

Considerando de nuevo como arco de referencia el arco (2, 3), se obtiene el


ciclo
{(2, 3); (3, 4); (4, 1); (1, 2)}

que admite una unidad de flujo y se consiguen ası́ los siguientes flujos
x12 = 3 x13 = 0 x23 = 1 x24 = 2 x34 = 1 x41 = 3
Los correspondientes diagramas de especificaciones son los de la figura 12.10.

tu tu tu


xu xu xu


u = (1, 2) u = (1, 3) u = (2, 3)
tu tu tu


xu xu xu


u = (2, 4) u = (3, 4) u = (4, 1)

Figura 12.10: Desarrollo del ejemplo 12.1, flujo óptimo

Se puede observar que todas las representaciones de los arcos en el diagrama


de especificaciones están incluidas en la lı́nea quebrada correspondiente. Se ha
llegado, por tanto, a la solución óptima del problema P , cuyas variables son los
flujos anteriores:

x1,2 = 3 x1,3 = 0 x2,3 = 1 x2,4 = 2 x3,4 = 1 x4,1 = 3

También se han obtenido las variables óptimas {wi , i ∈ V } del problema dual
D, que toman los valores
w1 = 1 w2 = 2 w3 = 0 w4 = 0
No existencia de flujo compatible ORED 221

(1,,0;1)
1 2

(3,,2;3) (2,,1;2)

Figura 12.11: Red del ejemplo 12.2

12.6. No existencia de flujo compatible


Al introducir el problema de circulación ya se comentó que al imponer un
lı́mite inferior de flujo para los arcos se podrı́a impedir la existencia de un flujo
compatible. Serı́a el caso indicado en el siguiente ejemplo

Ejemplo 12.2. Sea la red representada en la figura 12.11 con 3 vértices y 3


arcos definida según
u i j lu cu du
u1 1 2 0 1 1
u2 2 3 1 2 2
u3 3 1 2 3 3

Se ve que no admite ningún flujo compatible, puesto que en el nodo 1 debe


entrar más flujo que el que puede salir.
Partiendo de la inicialización trivial:
w1 = w2 = w3 = 0
x12 = x23 = x31 = 0
en la figura 12.12 se representa el diagrama de especificaciones para los tres
arcos y la coloración correspondiente. El arco de referencia, negro, es el arco
(2, 3).
Siguiendo los procedimientos descritos, se identificar el cociclo w(A), siendo
A = {1, 3}, la tensión en el arco (1, 2) ∈ w+ (A) se puede incrementar como
mucho 1 unidad, la tensión del arco (2, 3) ∈ w− (A) no tiene lı́mite en la dismi-
nución, por lo que se modifica w2 = 1. En la figura 12.13 se representa el nuevo
diagrama de especificaciones para los tres arcos y la coloración correspondiente.
El arco de referencia, negro, sigue siendo el arco (2, 3); siguiendo el algorit-
ORED 222 Problema de Circulación

tu tu tu
0
1 2

N N
• xu • xu • xu
3

u = (1, 2) u = (2, 3) u = (3, 1)

Figura 12.12: Ejemplo 12.2, diagramas y coloración inicial

tu tu tu
N
1 2

• N N
xu xu • xu
• 3

u = (1, 2) u = (2, 3) u = (3, 1)

Figura 12.13: Ejemplo 12.2, diagramas y coloración de la iteración 2

mo, hay que modifica el flujo en los arcos del ciclo {(2, 3); (3, 1); (1, 2)}, al ser
todos positivos hay que determinar el máximo flujo que se puede incrementar en
ellos siendo, (ver el diagrama de la figura 12.13) 1 para los arcos (1, 2) y (2, 3)
y 2 para el arco (3, 1); el mı́nimo es 1 y se obtienen los siguientes valores:
w1 = 0 w2 = 1 w3 = 0
x12 = x23 = x31 = 1
que tiene asociados los siguientes diagramas de especificaciones de la figura 12.14:

tu tu tu
V
1 2

• N 0
xu xu • xu
• 3

u = (1, 2) u = (2, 3) u = (3, 1)

Figura 12.14: Ejemplo 12.2, diagramas y coloración de la iteración 3

El arco de referencia ahora es el arco (3, 1), mientras que el arco (1, 2) es de
color verde al ser del tipo 5 y el arco (2, 3) está sin colorear al ser de tipo 1. Se
identifica ası́ el cociclo w(A) asociado a A = {1}.
Al intentar aumentar la tensión de los arcos de w+ (A) = {(1, 2)} y dis-
minuir la de los arcos de w− (A) = {(3, 1)} se observa que no existe lı́mite.
No existencia de flujo compatible ORED 223

Matemáticamente, los valores de δ1 y δ2 toman el valor ∞.


En esta situación, como se demostrará en el caso general, se puede afirmar
que no existe flujo compatible con las restricciones de la red.

La detección de no existencia de flujo compatible se realiza al aplicar la regla


de modificación de la tensión, según se recoge en la siguiente proposición

Proposición 12.1. Cuando el arco de referencia pertenece a un cociclo w(A)


verificando

{u ∈ w− (A) / tu > du , xu ≥ lu } ∪ {u ∈ w+ (A) / tu < du , xu ≤ cu } = ∅

entonces la red asociada no admite ningún flujo compatible con las restricciones
impuestas.

Demostración
El cociclo w(A) tiene las siguientes propiedades:

Los arcos de w+ (A) son verdes (5 ó 7) o sin colorear (1 ó 3), pero, por
hipótesis,
{u ∈ w+ (A) / tu < du , xu ≤ cu } = ∅

y se verifica que
∀u ∈ w+ (A) =⇒ xu ≥ cu

Los arcos de w− (A) son negros (4 ó 6) o sin colorear (1 ó 3), pero, por
hipótesis,
{u ∈ w− (A) / tu > du , xu ≥ lu } = ∅

y se verifica que
∀u ∈ w− (A) =⇒ xu ≤ lu

siendo la desigualdad estricta para el arco de referencia que es del tipo 6.

Por consiguiente, se ha encontrado un cociclo w(A) verificando


X X X X
0= xu − xu > cu − lu
u∈w+ (A) u∈w− (A) u∈w+ (A) u∈w− (A)

que contradice la propiedad que verifica cualquier flujo compatible:


ORED 224 Problema de Circulación

X X X X
∀B ⊂ V 0= xu − xu ≤ cu − lu
u∈w+ (B) u∈w− (B) u∈w+ (B) u∈w− (B)

12.7. Algoritmo de desviaciones, pseudo-código (*)


El algoritmo de desviaciones, que es el que se está estudiando en este capı́tulo,
resuelve el problema de circulación, y tiene dos salidas posibles:

Solución óptima
El algoritmo devuelve el valor óptimo de flujo x ∈ <m que alcanza el
mı́nimo coste. Es el caso del ejemplo 12.1.

No existencia de solución factible


En este caso, el algoritmo identifica un conjunto de nodos A ⊂ V que
provoca la incompatibilidad del flujo, al ser inferior el flujo máximo de
salida permitido de dicho conjunto al flujo mı́nimo que debe entrar en A.
Es el caso del ejemplo 12.2.

Observación 12.2. Al ser un problema de programación lineal, faltarı́a la op-


ción de Solución no acotada, pero esta opción no se contempla en el problema de
circulación al estar acotado inferior y superiormente el flujo en todos los arcos.

Todos los desarrollos de las secciones anteriores se concretan en el pseudo-


código del algoritmo de desviaciones, algoritmo 12.6, que se detalla al final de
esta sección. Necesita de las siguientes funciones y los correspondientes pseudo-
códigos y en el orden siguiente:

1. Algoritmo 12.1, asignación del tipo de arco.


Después de la inicialización de los vectores de flujo xu = 0 ∀u ∈ U y de
potencial wi = 0 ∀i ∈ V , que implica este último que la tensión de todos
los arcos sea nula tu = 0 ∀u ∈ U , se asocia el tipo a cada uno de los arcos.
El tipo de arco depende de la representación del par (xu , tu ) de cada arco
u en el diagrama de especificaciones según se detalló en la Figura 12.3.
Algoritmo de desviaciones, pseudo-código (*) ORED 225

Se puede suponer, el algoritmo ası́ lo hace, que el tipo de arco fuera de


especificación (tipos 6 ó 7) será siempre del tipo 6, que es lo natural si el
anterior par se inicializa en el origen de coordenadas para todos los arcos
(xu , tu ) = (0, 0) ∀u ∈ U , y el flujo mı́nimo que debe soportar un arco es
siempre mayor o igual que 0, es decir, lu ≥ 0 ∀u ∈ U .

Algoritmo 12.1: [tipo] = DesviacionesTipo({U ; l, c, x; d, t} )


 
{xu = lu < cu ∧ tu < du }
1 si ∨


{xu = lu = cu ∧ tu = du }




2 si lu < xu < cu ∧ tu = du




3 si xu = cu ∧ tu > du




4 si xu = lu ∧ tu = du

∀u ∈ U : tipo(u) =

 5 si xu= cu ∧ tu = du
{xu < cu ∧ tu > du }


6 si ∨


 {xu < lu ∧ tu ≤ du }




{xu > lu ∧ tu < du }


7 si ∨


{xu > cu ∧ tu ≥ du }

2. Algoritmo 12.2, coloreado de los arcos.


A partir del tipo de cada arco, se colorean los arcos como negros (N),
verdes (V), rojos (R) o sin colorear (0).

Algoritmo 12.2: [col] = DesviacionesColor(tipo )




 N si tipo(u) ∈ {4, 6}
V si tipo(u) ∈ {5, 7}

col(u) =

 R si tipo(u) ∈ {2}
0 si tipo(u) ∈ {1, 3}

3. Algoritmo 12.3, etiquetado de los vértices según el lema de coloración.


Una vez coloreado el digrafo, y considerando como arco de referencia el
arco (t, s), que es negro, se aplica el lema de coloración (ver Lema 10.1)
para etiquetar el máximo número de nodos del digrafo. Un nodo i ∈ V
quedará etiquetado si p(i) 6= 0 y el valor de p(i) ∈ V indica el nodo desde el
que se etiqueta i bien a través del arco (i, p(i)) o a través del arco (p(i), i).
ORED 226 Problema de Circulación

Algoritmo 12.3: [p] = DesviacionesEtiqueta(s ∈ V ; {G = (V, U ); col} )


p(s) = s (etiquetado)
p(i) = 0 ∀i ∈ V − {s} (no etiquetados)
repeat
for u = (i, j) ∈ U do
if p(i) 6= 0 ∧ p(j) = 0 ∧ col(u) ∈ {N, R} then
p(j) = i
end if
if p(i) = 0 ∧ p(j) 6= 0 ∧ col(u) ∈ {V, R} then
p(i) = j
end if
end for
until no se etiqueten nuevos vértices

4. Algoritmo 12.4, modificación del flujo si se ha encontrado un ciclo incre-


mental.
En el caso en que el nodo t ∈ V haya sido etiquetado (p(t) 6= 0) se identifica
el ciclo incremental siguiendo la secuencia t−p(t)−· · · hasta llegar al nodo
s, después se cierra el ciclo con el arco (t, s).
En este ciclo incremental se determina el máximo flujo que se puede mover
en cada arco. Se distinguen los arcos positivos —que están orientados en el
mismo sentido que el arco (t, s)— de los negativos —en sentido contrario;
en los primeros se puede incrementar el flujo hasta llegar al lı́mite superior
de flujo cu y en los segundos se puede disminuir siempre que sea inferior
al lı́mite inferior de flujo lu . El máximo flujo que se puede mover por el
ciclo es el mı́nimo de los lı́mites anteriores para los arcos que componen
dicho ciclo, es la capacidad del ciclo.
Posteriormente, se incrementa en dicha capacidad el flujo de los arcos
positivos, se disminuye en la misma cantidad el flujo de los arcos negativos,
y no se modifica el flujo en los arcos que no pertenecen al ciclo.
La variación de flujo está asociada a movimientos horizontales en el dia-
grama de especificaciones: hacia la derecha en el caso de arcos positivos y
hacia la izquierda en el caso de arcos negativos. Nunca se pasa de un lado
de la lı́nea quebrada al otro; además, una vez que un arco pertenece a la
lı́nea quebrada (tipos 1, 2, . . . , 5) nunca abandonará dicha lı́nea, aunque sı́
puede cambiar el tipo, por ejemplo, para un arco cuyo diagrama se sitúe
Algoritmo de desviaciones, pseudo-código (*) ORED 227

en el centro de la parte horizontal de la lı́nea quebrada (tipo 2 y color R)


se puede incrementar el flujo para que sea tipo 5 y color V o se puede
disminuir el flujo para que sea tipo 4 y color N .
En el caso de los movimientos horizontales siempre existe un lı́mite, pues la
lı́nea quebrada divide en dos el espacio <2 del diagrama de especificaciones
y los arcos se mueven hacia dicha lı́nea sin pasarla.

Algoritmo 12.4: [x] = DesviacionesFlujo(s, t ∈


V ; {(V, U ); l, c, d; p; (x, t)} )
Identificación del ciclo µ
i=t
while i 6= s do
if (p(i), i) ∈ U then
El arco (p(i), i) ∈ µ+
µ+ = µ+ ∪ (p(i), i)
else
El arco (i, p(i)) ∈ µ−
µ− = µ− ∪ (i, p(i))
end if
i = p(i)
end while
Se añade el arco (t, s) ∈ µ+ para cerrar el ciclo µ
µ+ = µ+ ∪ (t, s)
Determinación de la capacidad del ciclo µ
1 = mı́n{cu − xu : u ∈ µ+ ∧ tu ≥ du }
2 = mı́n{lu − xu : u ∈ µ+ ∧ tu < du }
3 = mı́n{xu − cu : u ∈ µ− ∧ tu > du }
4 = mı́n{xu − lu : u ∈ µ− ∧ tu ≤ du }
c(µ) = mı́n{1 , 2 , 3 , 4 }
Modificación del flujo en el ciclo µ
xu = xu + c(µ) ∀u ∈ µ+
xu = xu − c(µ) ∀u ∈ µ−

5. Algoritmo 12.5, modificación del potencial si no se ha encontrado un ciclo


incremental.
En el caso en que el nodo t ∈ V no haya sido etiquetado (p(t) = 0) se
identifica el cociclo w(A) asociado al conjunto A = {i ∈ V , p(i) 6= 0}.
La variación de potencial está asociada a movimientos verticales en el
diagrama de especificaciones: hacia arriba en los arcos de w+ (A) y hacia
ORED 228 Problema de Circulación

abajo en los arcos de w− (A). Estos movimientos se consiguen aumentando


el potencial de los nodos del complementario de A, es decir V − A = {i ∈
V , p(i) = 0}.
En el caso de los movimientos verticales no siempre existe un lı́mite, hay
cuatro zonas distinguibles respecto de estos movimientos verticales (ver
figura 12.15 en las que se puede dividir el espacio del diagrama de especi-
ficaciones:
tu tu
C

du
A B A B

lu D cu xu lu = cu xu

lu < cu lu = cu

Figura 12.15: Zonas de variación de tensión.

Zonas A y B
La componente xu < lu en la zona A y xu > cu en la zona B. No hay
lı́mite tanto en el incremento como en la disminución de la tensión.
Zona C
La componente xu ∈ [lu , cu ] y la componente tu > du . Hay lı́mite en
la disminución de la tensión, no hay lı́mite en el incremento.
Zona D
La componente xu ∈ [lu , cu ] y la componente tu < du . Hay lı́mite en
el incremento de la tensión, no hay lı́mite en la disminución.

El lı́mite (δ) de flujo será finito sólo si hay arcos de w+ (A) en la zona D
o arcos de w− (A) en la zona C; la variación del potencial en V − A será
el mı́nimo de dichos lı́mites; en caso contrario, δ = ∞ y se detecta la no
existencia de flujo compatible.
Para mayor claridad del algoritmo de desviaciones y ver claramente esta
última opción terminal, la operación de modificación del potencial y la
Algoritmo de desviaciones, pseudo-código (*) ORED 229

correspondiente variación de la tensión de los arcos de w(A) se ha sacado


de este algoritmo 12.5 y se ha incorporado en el propio algoritmo 12.6 que
llama a las anteriores funciones:

Algoritmo 12.5: [δ, A] = DesviacionesPotencial({(V, U ); l, c, d; p; (x, t)})


Identificación del cociclo w(A)
A = {i ∈ V : p(i) 6= 0}
Inicialización de δ, el incremento de potencial
δ=∞
for u = (i, j) ∈ U do
if p(i) 6= 0 ∧ p(j) = 0 then
El arco u ∈ w+ (A)
if tu < du ∧ xu ≤ cu then
δ = min{δ, du − tu }
end if
end if
if p(i) = 0 ∧ p(j) 6= 0 then
El arco u ∈ w− (A)
if tu > du ∧ xu ≥ lu then
δ = min{δ, tu − du }
end if
end if
end for

A continuación se detalla el pseudo código con el algoritmo 12.6 que llama


a las anteriores funciones:

La complejidad del algoritmo de desviaciones es no polinomial, puesto que


el número de veces que se aplica el lema de coloración para modificar el flujo o
la tensión de los arcos depende del vector de capacidades c. Es un razonamiento
análogo al realizado en el algoritmo de Ford-Fulkerson para el problema de flujo
máximo.
ORED 230 Problema de Circulación

Algoritmo 12.6: [x, w, t, A] = Desviaciones({G = (V, U ); l, c; d} )


Inicialización
Sea x = 0 un flujo compatible y w = 0 un potencial iniciales
Sea tu = wj − wi ∀u = (i, j) ∈ U la tensión inicial de cada arco
loop
Asignación de tipo para los arcos
[tipo] = DesviacionesTipo({U ; l, c, x; d, t} )
if {u ∈ U : tipo(u) ∈ {6, 7}} = ∅ then
return (x, flujo óptimo; t, tensión óptima; w, potencial óptimo).
else
Sea u0 = (t, s) ∈ U tal que tipo(u0 ) ∈ {6, 7} (se supone 6)
Coloración de arcos
[col] = DesviacionesColor(tipo )
Etiquetado de nodos
[p] = DesviacionesEtiqueta(s ∈ V ; {G = (V, U ); col})
Modificación de los diagramas
if p(t) 6= 0 then
Modificación del flujo de los arcos
[x] = DesviacionesFlujo(s, t ∈ V ; {G = (V, U ); l, c, d; p; (x, t)} )
else
Modificación del potencial de los nodos y tensión de los arcos
[δ, A] = DesviacionesPotencial({G = (V, U ); l, c, d; p; (x, t)})
if δ < ∞ then
Se puede modificar el potencial de los nodos i 6∈ A
wi = wi + δ ∀i ∈ V − A
Se actualiza la tensión de los arcos u ∈ U
tu = wj − wi ∀u = (i, j) ∈ U
else
No existe flujo compatible en el conjunto A
return (A conjunto incompatible)
end if
end if
end if
end loop
Capı́tulo 13
Problema de emparejamiento
máximo en grafos bipartitos

En el problema de asignación de trabajadores-máquinas, analizado como


un problema de flujo máximo, se trataba de maximizar el número de estas
asignaciones considerando que ninguna máquina podı́a estar asignada a más de
un trabajador y ningún trabajador podı́a trabajar con más de una máquina.
Realmente, al considerar el grafo no dirigido que relaciona los trabajadores
y las máquinas compatibles, las asignaciones son aristas con la propiedad de no
existir dos aristas adyacentes. Se trata, según se analizará posteriormente, de
determinar el emparejamiento de máximo cardinal en un grafo bipartito.
Se introduce el algoritmo de Edmonds para determinar el emparejamiento
de máximo cardinal en un grafo bipartito. Posteriormente se estudiarán los
aspectos combinatorios del problema de programación asociado justificando ası́
el algoritmo.

13.1. Problema de emparejamiento máximo


Definición 13.1. Dado un grafo no dirigido G = (V, E), un emparejamiento
es un subconjunto K ⊂ E que no contiene dos aristas adyacentes, es decir, con
un extremo en común.

Un emparejamiento trivial es el conjunto vacı́o K = ∅.

Ejemplo 13.1. Sea el grafo con 6 vértices, V = {1, 2, 3, 4, 5, 6}, y 5 aristas,


ORED 232 Problema de emparejamiento máximo en grafos bipartitos

1 2 3

a b c d e

4 5 6

Figura 13.1: Grafo bipartito del ejemplo 13.1

E = {a, b, c, d, e} representado en la figura 13.1.


Ejemplos de emparejamientos no vacı́os de este grafo son los siguientes:

K 1 = {a} K 2 = {b} K 3 = {a, d}

El subconjunto K = {a, b} no es un emparejamiento por ser adyacentes las


aristas a y b.

Definición 13.2. Se dice que un vértice x ∈ V está saturado por el empareja-


miento K si existe una arista {x, y} ∈ K.
En caso contrario, se dice que el vértice está expuesto o no saturado.

En el ejemplo 13.1, los vértices {1, 2, 4, 5} están saturados por el empareja-


miento K 3 , mientras que los vértices {3, 6} están expuestos.

Dado un emparejamiento K ⊂ E, cualquier subconjunto F ⊂ K es también


un emparejamiento.

En el ejemplo 13.1, el subconjunto K 4 = {d} ⊂ K 3 es también un empare-


jamiento.

En algunas situaciones, el problema es determinar el emparejamiento de


máximo cardinal; es el caso, por ejemplo, del problema de asignación, en el que
interesa maximizar el número de pares trabajador-máquina.
Tiene sentido, pues, plantearse el Problema de emparejamiento máximo o
Problema de emparejamiento de máximo cardinal : Dado un grafo G = (V, E),
determinar el emparejamiento K ∗ ⊂ E de máximo cardinal.

Definición 13.3. Se dice que un emparejamiento es perfecto si satura todos los


vértices. Obviamente, un emparejamiento perfecto es el de máximo cardinal.
Problema de emparejamiento máximo ORED 233

En el ejemplo 13.1, el emparejamiento K 3 es el de máximo cardinal, aunque


no es perfecto.

A continuación se estudian las condiciones teóricas que permitirán determi-


nar el emparejamiento de máximo cardinal

13.1.1. Cadena alternante


Definición 13.4. Dados un grafo G = (V, E) y un emparejamiento K ⊂ E, se
define una cadena alternante como una cadena en la que las aristas pertenecen
y no pertenecen alternativamente al emparejamiento.

Dado el grafo G del ejemplo 13.1, a partir del emparejamiento K 2 = {b} se


pueden definir las siguientes cadenas alternantes:

µ1 = {a} µ2 = {a, b} µ3 = {a, b, d} µ4 = {b}

Si los extremos de la cadena son no saturados por el emparejamiento, y


distintos, se puede conseguir un emparejamiento con una arista más. Tiene
sentido, pues, introducir la siguiente definición:

Definición 13.5. Una cadena alternante µ[x, y], con x 6= y, se dice incremental
si sus extremos x e y son no saturados por el emparejamiento K.
Una cadena incremental siempre tiene un número impar de aristas superando
en uno el número de aristas que no pertenecen al emparejamiento al número de
aristas del emparejamiento.

De las cadenas incrementales asociadas al ejemplo 13.1 especificadas ante-


riormente, la única que es incremental es µ3 . Los extremos de esta cadena son
4 y 2, que son no saturados o expuestos.

El término de cadena incremental se justifica por la posibilidad de aumen-


tar el cardinal del emparejamiento subyacente añadiendo una arista más. Esta
operación se denomina transferencia.
La transferencia en una cadena incremental µ[x, y] respecto del empareja-
miento K consiste en permutar la pertenencia y no pertenencia de las aristas
de la cadena a dicho emparejamiento. Ası́ se consigue una arista más para K.
ORED 234 Problema de emparejamiento máximo en grafos bipartitos

Formalmente, dado un emparejamiento K y una cadena incremental µ[x, y]


respecto del mismo, la transferencia se puede definir como la diferencia simétrica
entre la cadena y el emparejamiento:

K 0 = K 4 µ[x, y]

con la propiedad de ser


|K 0 | = |K| + 1

Conviene recordar que la diferencia simétrica de dos conjuntos A 4 B es


el conjunto de elementos que pertenecen exclusivamente a uno solo de los dos
conjuntos:
A 4 B ≡ {x ∈ A ∪ B / x 6∈ A ∩ B}

Dados el emparejamiento K 2 y la cadena incremental µ3 , la transferencia


permite obtener el emparejamiento

K 3 = K 2 4 µ3

A continuación se introduce un lema relacionado con las aristas de dos empa-


rejamientos. Este lema se utilizará posteriormente para demostrar una proposi-
ción que caracteriza la optimalidad de un emparejamiento de máximo cardinal.

Lema 13.1. Dados dos emparejamientos K1 y K2 en un grafo simple G =


(V, E), al considerar el grafo parcial G0 = (V, K1 4 K2 ) se verifica que todas sus
componentes conexas son de alguno de los tres tipos:

Vértice aislado

Ciclo elemental alternante (con aristas de K1 y K2 alternativamente).


Un ciclo alternante tiene necesariamente un número par de aristas.

Cadena elemental alternante.


Una cadena alternante puede tener un número par o impar de aristas.

Demostración
Por las propiedades de un emparejamiento, que no puede tener aristas ad-
yacentes, y por construcción del grafo parcial G0 , se concluye que el grado de
Problema de emparejamiento máximo ORED 235

1 2 3 4 5

6 7 8 9 10

Figura 13.2: Grafo bipartito del ejemplo 13.2

cualquier vértice en G0 no puede ser superior a dos; es decir,

dG0 (x) ≤ 2 ∀x ∈ V

Se dan, en consecuencia, las siguientes opciones:

dG0 (x) = 0
En este caso, x o bien está saturado por una arista que pertenece si-
multáneamente a K1 y K2 o bien no está saturado por ninguno de los
emparejamientos. El vértice x es un vértice aislado y corresponderı́a al
primero de los tipos de componentes conexas.

dG0 (x) = 1
En este caso, x está saturado por un único emparejamiento, K1 ó K2 , y
el vértice x será el extremo de una cadena alternante y pertenecerá a una
componente conexa del tercer tipo.

dG0 (x) = 2
En este caso, x está saturado por una arista de cada emparejamiento. El
vértice x es un vértice intermedio de un ciclo o de una cadena y pertenece,
por consiguiente, a una componente conexa del tipo 2 ó 3 respectivamente.

A continuación, se introduce otro grafo para ilustrar este lema.

Ejemplo 13.2. Sea el grafo de la figura 13.2, que tiene 10 vértices y 13 aristas.
Sean los emparejamientos

K1 = {{2, 7}; {3, 8}; {5, 10}} K2 = {{3, 10}; {5, 8}}
ORED 236 Problema de emparejamiento máximo en grafos bipartitos

cuyas aristas están coloreadas en azul y rojo respectivamente. Operando los dos
emparejamientos según el lema 13.1, se tiene:

K1 4 K2 = {{2, 7}; {3, 8}; {5, 10}; {3, 10}; {5, 8}}

El grafo parcial G0 = (V, K1 4 K2 ) tiene dos componentes conexas, una de


ellas es un ciclo alternante par y la otra es una cadena alternante impar formada
por una arista.

Este lema permite demostrar la siguiente proposición.

Proposición 13.1. Dado un grafo G = (V, E), un emparejamiento K ⊂ E es


de máximo cardinal si, y sólo si, no existe ninguna cadena incremental respecto
de K.

Demostración

⇒ En caso contrario, mediante una transferencia, se consigue un empareja-


miento K 0 con una arista más.

⇐ Sea K el emparejamiento para el que no existe una cadena incremental.


Si K 0 es el emparejamiento máximo, al considerar el grafo parcial G0 =
(V, K 4K 0 ) del lema 13.1, se concluye que no pueden existir en G0 cadenas
alternantes impares:

• La cadena impar no puede tener más aristas de K 0 que de K, puesto


que serı́a una cadena incremental respecto de K que, por definición,
no admite cadenas incrementales.
• Tampoco puede tener la cadena impar un número mayor de aristas
de K que de K 0 , puesto que serı́a entonces una cadena incremental
respecto de K 0 , y al realizar una transferencia se obtendrı́a un empa-
rejamiento con más aristas que las de K 0 ; lo que es imposible al ser
K 0 de máximo cardinal.

Por consiguiente, al ser todas las cadenas alternantes pares, ambos empa-
rejamientos deben tener el mismo cardinal, |K| = |K 0 |, concluyendo ası́
que K es también de máximo cardinal.


Problema de emparejamiento máximo ORED 237

Para los emparejamientos K1 y K2 del ejemplo 13.2, se puede observar que


en G0 hay una cadena alternante impar con una arista más de K1 que de K2
mientras que no hay ninguna con más aristas de K2 que de K1 .

El emparejamiento de máximo cardinal se construye a partir de un empa-


rejamiento conocido, que puede ser en cualquier caso el emparejamiento trivial
K = ∅. Dado K, se determina alguna cadena alternante incremental, se realiza
una transferencia para obtener un emparejamiento con una arista más. Este
proceso se repite mientras existan cadenas alternantes incrementales; en caso
contrario, se ha determinado el emparejamiento de máximo cardinal.
Para construir las cadenas alternantes incrementales se utilizan los árboles
alternantes, que se estudian a continuación.

13.1.2. Árbol alternante


Dado un emparejamiento y un vértice expuesto, se trata de encontrar una
cadena incremental impar que parta de dicho vértice. Los vértices x ∈ V satura-
dos por el emparejamiento se identificarán por sat(x) = 1; los vértices expuestos
o no saturados verificarán sat(x) = 0.
Con este objetivo, y a partir de cada uno de los emparejamientos que se irán
determinando, se construye un conjunto de árboles alternantes inconexos, que
se puede definir como un bosque alternante.
Conviene observar que a partir de un emparejamiento en un grafo, bipartito
o no, siempre se puede construir un grafo bipartito a partir del grafo parcial que
resulta de seleccionar las aristas del emparejamiento.
A continuación se introduce el concepto de árbol alternante.

Definición 13.6. Dados un grafo G = (V, E) y un emparejamiento K ⊂ E, un


árbol alternante es un subgrafo parcial H = (W, T ), con W ⊂ V y T ⊂ E con
las siguientes propiedades:

1. H es un árbol.

2. Existe un vértice r ∈ W , que se denomina raı́z del árbol alternante, y que


es un vértice expuesto respecto del emparejamiento K.

3. Cualquier cadena elemental que une un vértice w ∈ W con la raı́z r es


una cadena alternante.
ORED 238 Problema de emparejamiento máximo en grafos bipartitos

e d
3 5 2

c a
6 1 4

Figura 13.3: Bosque alternante del ejemplo 13.1

1 7 2 8 3 9

10 5

Figura 13.4: Árbol alternante del ejemplo 13.2

Por comodidad de notación, se identificará cada árbol alternante por su raı́z,


de forma que se denotará por H(r) = (W (r), T (r)).

En el ejemplo 13.1, a partir del emparejamiento K 3 se construye el bosque


alternante de la figura 13.3.

Para el ejemplo 13.2, y dado el emparejamiento K1 , se obtiene el árbol al-


ternante representado en la figura 13.4.

Sea R ⊂ V el conjunto de las raı́ces del bosque alternante que se construye en


el grafo G = (V, E) a partir de un emparejamiento K ⊂ E. El bosque alternante
se caracteriza por el vector p.
Cada raı́z r ∈ R de un árbol alternante H(r) = (W (r), T (r)) se identifica
por p(r) = r. La única cadena alternante que une cualquier vértice w ∈ W (r)
del árbol con su raı́z r es:

w ←→ p(w) ←→ p(p(w)) ←→ · · · ←→ p(· · · (p(w)) · · · ) ←→ r

EL vector asociado a los árboles alternantes del ejemplo 13.1, es:


Problema de emparejamiento máximo ORED 239

p(1) = 6 p(2) = 5 p(3) = 3 p(4) = 1 p(5) = 3 p(6) = 6

Este bosque alternante tiene dos componentes conexas identificadas por el


conjunto de raı́ces R = {3, 6}:

H(3) = (W (3), T (3)) W (3) = {2, 3, 5} T (3) = {{3, 5}; {2, 5}}

H(6) = (W (6), T (6)) W (6) = {1, 4, 6} T (6) = {{6, 1}; {1, 4}}

Hay que observar que no existen cadenas incrementales, por lo que el empa-
rejamiento es de máximo cardinal.

El vector asociado al ejemplo 13.2 es:

p(1) = 1 p(2) = 7 p(3) = 8 p(4) = 0 p(5) = 10 p(6) = 3 p(7) = 1 p(8) = 2 p(9) = 3 p(10) = 3

Se identifican aquı́ dos cadenas incrementales asociadas a los vértices ex-


puestos 6 y 9:

6 ←→ p(6) = 3 ←→ p(3) = 8 ←→ p(8) = 2 ←→ p(2) = 7 ←→ p(7) = 1

9 ←→ p(9) = 3 ←→ p(3) = 8 ←→ p(8) = 2 ←→ p(2) = 7 ←→ p(7) = 1

La transferencia por la cadena incremental que sale del vértice 6, por ejemplo,
permitirı́a obtener el emparejamiento

K10 = {{6, 3}; {8, 2}; {7, 1}; {5, 10}}

que tiene una arista más que K1 .

La construcción de un árbol alternante asociado a un emparejamiento consta


básicamente de los siguientes pasos:

1. Inicializar el árbol.
ORED 240 Problema de emparejamiento máximo en grafos bipartitos

Se identifica como raı́z un vértice expuesto para dicho emparejamiento. En


el caso que no existan vértices expuestos, el emparejamiento es perfecto y,
por tanto, es de máximo cardinal.
Si r es la raı́z, se especifica p(r) = r; el resto de vértices no están en el
árbol inicialmente, por lo que se especifica p(x) = 0 ∀x 6= r.
El árbol alternante depende del emparejamiento, de forma que cada vez
que se modifica éste, hay que volver a inicializar el árbol alternante.

Para el ejemplo 13.2 y con el emparejamiento K1 , el árbol alternante se


inicia con el vértice expuesto 1.

p(1) = 1 p(j) = 0 ∀j = 2, 3, . . . , 10

2. Vértices pares e impares.


Con el fin de determinar las cadenas incrementales entre las cadenas alter-
nantes que unen vértices expuestos con la raı́z, se distinguen los vértices
del árbol como vértices pares (incluida la raı́z) y vértices impares. Los
vértices de las cadenas alternantes del árbol son alternativamente pares e
impares. Esta caracterı́stica se denotará por

car(v) ∈ {P, I} ∀v ∈ V

y permitirá identificar una cadena incremental al existir un vértice impar


x ∈ W expuesto, es decir, car(x) = I y sat(x) = 0.
Por otra parte, al ser un grafo bipartito, la caracterı́stica de par o impar
permite clasificar los vértices en uno de los dos subconjuntos. No existen
aristas uniendo vértices pares ni vértices impares.

En la situación descrita del ejemplo 13.2 y con el emparejamiento K1 ,


identificado el árbol alternante de la última figura con el vector:

p(1) = 1 p(2) = 7 p(3) = 8 p(4) = 0 p(5) = 10

p(6) = 3 p(7) = 1 p(8) = 2 p(9) = 3 p(10) = 3


Problema de emparejamiento máximo ORED 241

el vector car es el siguiente:

car(1) = P car(2) = P car(3) = P car(4) = 0 car(5) = P

car(6) = I car(7) = I car(8) = I car(9) = I car(10) = I

La cadena incremental que une los vértices 1 y 6 se identifica al ser


sat(1) = sat(6) = 0, car(1) = P y car(6) = I.

3. Inclusión de vértices y aristas en el árbol.


Dado un vértice x del árbol y otro y que no está, es decir, verificando
p(x) 6= 0, p(y) = 0, si se añade la arista {x, y} ∈ E al árbol, se especifica
como p(y) = x.
El proceso de asignar el vector p(y) = x se denomina etiquetado del vértice
y ∈ V y dependiendo del carácter, par o impar, del vértice x implica las
siguientes operaciones:

a) car(x) = P
Se añaden al árbol todas las aristas {x, y} que inciden en el vértice x
siempre que el vértice y no esté incluido en el árbol, es decir, p(y) = 0.
Se etiqueta el vértice y (p(y) = x) como impar (car(y) = I).
Para el ejemplo 13.2 y con el emparejamiento K1 , al ser car(1) = P
y verificar p(1) 6= 0 y p(7) = 0, se añaden el vértice 7 y la arista
{1, 7} por medio de p(7) = 1.
b) car(x) = I
Hay que distinguir dos casos:
1) sat(x) = 0
El vértice x está expuesto y se ha identificado la cadena incre-
mental hasta el vértice r:

x − − − p(x) − − − p(p(x)) − − − · · · − − − r

Hay que hacer una transferencia para construir un empareja-


miento con una arista más.
ORED 242 Problema de emparejamiento máximo en grafos bipartitos

1 1 7 1 7 2

1 7 2 8 3 6

1 7 2 8 3 6

Figura 13.5: Evolución del árbol alternante del ejemplo 13.2 a partir de K1

2) sat(x) = 1
Si el vértice x está saturado, hay que añadir la arista del empare-
jamiento {x, y} ∈ K al árbol, y se etiqueta el vértice y (p(y) = x)
como par (car(y) = P ).

4. Sondeo de vértices.
Para controlar el proceso de construcción del árbol alternante, se distin-
guirá un vértice como examinado o sondeado cuando está saturado por
K o bien todos sus vértices adyacentes han sido etiquetados. Se denota
ex(x) = 0 si el vértice x ∈ V no ha sido examinado; cuando está exami-
nado, entonces ex(x) = 1.
Fijado un vértice x del árbol, si car(x) = P , se sondea una vez hayan sido
añadidas todas las aristas incidentes a x; si car(x) = I y está saturado
(en caso contrario, hay que realizar una transferencia), el vértice x queda
sondeado al añadir la arista del emparejamiento que lo satura.
El sondeo de los vértices del árbol alternante H(r) se gestiona con el
conjunto N SA(r), que identifica los vértices pendientes del árbol no son-
deados. Inicialmente, N SA(r) = {r} y el proceso de construcción termina
cuando N SA(r) = ∅.

En el ejemplo 13.2 y con el emparejamiento K1 , una vez añadidas todas


las aristas incidentes en 1, se termina el sondeo indicando ex(1) = 1.
Después de añadir el vértice 7, se tiene inicialmente ex(7) = 0.

La figura 13.5 ilustra el proceso de construcción del árbol alternante del ejem-
plo 13.2 con el emparejamiento K1 hasta obtener mediante transferencia el em-
parejamiento K10 .
Algoritmo de Edmonds ORED 243

Aunque los grafos vistos en los ejemplos son bipartitos, las ideas expuestas
anteriormente son válidas para grafos generales.
Se estudia primero un algoritmo que determina el emparejamiento de máxi-
mo cardinal para grafos bipartitos. El algoritmo para grafos generales necesita
una modificación y se estudia posteriormente.

13.2. Algoritmo de Edmonds


Sea G = (V, E) el grafo bipartito, el algoritmo 13.1 detalla el pseudocódigo
del algoritmo de Edmonds para el problema de emparejamiento máximo.

Aplicando el algoritmo al grafo del ejemplo 13.1 con el emparejamiento K =


{b} = {{1, 5}}, se tiene

v p(v) ex(v) sat(v) car(v)


1 0 0 1
2 0 0 0
3 0 0 0
4 0 0 0
5 0 0 1
6 0 0 0

R = {2, 3, 4, 6} =
6 ∅
Se elige como raı́z r = 2 y N SA(2) = {2}:

v p(v) ex(v) sat(v) car(v)


1 0 0 1
2 2 0 0 P
3 0 0 0
4 0 0 0
5 0 0 1
6 0 0 0

y se tiene ası́ como árbol alternante el vértice 2.


Al seleccionar x = 2 como vértice de N SA(2), se adjunta como vértice impar
el único adyacente no incluido en el árbol, el vértice 5, quedando la tabla:
ORED 244 Problema de emparejamiento máximo en grafos bipartitos

v p(v) ex(v) sat(v) car(v)


1 0 0 1
2 2 1 0 P
3 0 0 0
4 0 0 0
5 2 0 1 I
6 0 0 0

y el árbol alternante formado por la arista {2, 5} representado al principio de la


figura 13.6.
El conjunto N SA(2) = {5} y al elegir x = 5, por ser un vértice impar y
estar saturado, se tiene:

v p(v) ex(v) sat(v) car(v)


1 5 0 1 P
2 2 1 0 P
3 0 0 0
4 0 0 0
5 2 1 1 I
6 0 0 0

y se tiene ası́ como árbol alternante el representado en la figura 13.6.


Ahora, el conjunto N SA(2) = {1} y se adjuntan los vértices 4 y 6 al árbol
alternante para obtener el representado en la figura 13.6.
que permiten identificar la cadena alternante y obtener el nuevo emparejamiento

K = {{1, 4}; {2, 5}}

Al ser N SA(2) = ∅ y R = {3, 6} =


6 ∅, se sigue el algoritmo con la tabla:
Algoritmo de Edmonds ORED 245

2 5

2 5 1

2 5 1

2 5 1

Figura 13.6: Evolución del árbol alternante del ejemplo 13.1

v p(v) ex(v) sat(v) car(v)


1 0 0 1
2 0 0 1
3 0 0 0
4 0 0 1
5 0 0 1
6 0 0 0

Aplicando el algoritmo, y eligiendo r = 3 se obtiene:

v p(v) ex(v) sat(v) car(v)


1 0 0 1
2 5 1 1 P
3 3 1 0 P
4 0 0 1
5 3 1 1 I
6 0 0 0

y completar el árbol alternante (N SA(3) = ∅). No obstante, al ser R = {6} =


6 ∅,
hay que elegir como raı́z de otro árbol alternante al vértice 6, para concluir con la
estructura de dos árboles alternantes inconexos representados en la figura 13.3.
ORED 246 Problema de emparejamiento máximo en grafos bipartitos

Se consigue ası́, al ser N SA(6) = R = ∅ el emparejamiento de máximo


cardinal K.

13.3. Aspectos combinatorios del Problema (*)


A continuación se demuestra que el algoritmo determina el emparejamiento
de máximo cardinal en el grafo bipartito G = (V, E). La demostración se basa
en el planteamiento del problema de emparejamiento de máximo cardinal y su
dual.
El problema de emparejamiento de máximo cardinal en un grafo se puede
plantear como un problema de programación matemática a partir de las varia-
bles binarias xe , que indican si la arista e ∈ E pertenece (xe = 1) o no (xe = 0)
al emparejamiento K ⊂ E. El modelo es el siguiente:
 P
 M ax xe

 e∈E
P
P0 e∈w(v) xe ≤ 1 ∀v ∈ V

xe ∈ {0, 1} ∀e ∈ E

Este problema de programación binaria se puede convertir en uno equivalen-


te de programación continua añadiendo las restricciones asociadas a todos los
conjuntos impares

X⊂V |X| ≥ 3(impar)

 P

 M ax e∈E xe

 P

e∈w(v) xe ≤ 1 ∀v ∈ V
P
b |X|
P


 e∈E(X) xe ≤ 2 c ∀X ∈ V |X| ≥ 3(impar)

xe ≥ 0 ∀e ∈ E

siendo E(X) el conjunto de aristas del subgrafo de G generado por X ⊂ V . La


explicación de esta acotación es la siguiente: el subgrafo generado por cualquier
subconjunto de 2 · k + 1 vértices, con k entero positivo, no puede tener más de
k aristas de un emparejamiento.

Asociando las variables duales πv , ∀v ∈ V e yX , para todos los conjuntos


impares X ⊂ V , se puede plantear el problema dual
Aspectos combinatorios del Problema (*) ORED 247

1 2 3 7

a b c d e f

4 5 6 8

Figura 13.7: Grafo bipartito y emparejamiento K ∗ del ejemplo 13.3

e d
3 5 2

c a
6 1 4

Figura 13.8: Bosque alternante asociado al emparejamiento K ∗ del ejemplo 13.3

|X|
 P P
M in v∈V πv + X b 2 cyX



 P P

v / e∈w(v) πv + X / e∈E(X) yX ≥ 1 ∀e ∈ E
D


 πv ≥ 0 ∀v ∈ V

yX ≥ 0 ∀X ⊂ V |X| ≥ 3(impar)

Ejemplo 13.3. Sea el grafo de la figura 13.7, que tiene 8 vértices y 8 aristas.
Un emparejamiento (no el único) de máximo cardinal es K ∗ = {a, d, f }. Los
dos árboles asociados con tres vértices cada uno de ellos y los dos vértices, 7 y
8, que no están en ninguno de ellos se representan en la figura 13.8.
El vector p de los dos árboles alternantes es

p(1) = 6 p(2) = 5 p(3) = 3 p(4) = 1 p(5) = 3 p(6) = 6 p(7) = 0 p(8) = 0

A continuación se demuestra que el algoritmo de emparejamiento de máximo


cardinal en grafos bipartitos determina una solución óptima. La demostración
se ilustrará con el ejemplo 13.3.
ORED 248 Problema de emparejamiento máximo en grafos bipartitos

Proposición 13.2. Cuando el algoritmo termina, el emparejamiento K obte-


nido es el de máximo cardinal.

Demostración
Para demostrar que el emparejamiento K obtenido es el óptimo, hay que
determinar una solución del problema dual D cuya función objetivo sea igual al
cardinal del emparejamiento K.
La variable dual anula todas las variables del tipo yX , siendo X ⊂ V los
conjuntos de cardinal impar mayor o igual que 3. El número de estos conjun-
tos crece exponencialmente con el cardinal de V , por lo que supone una gran
simplificación.
La variable dual identificará un subconjunto W ⊂ V de forma que πv =
1 ∀v ∈ W y πv = 0 ∀v 6∈ W . A continuación se determina el conjunto W .
Cuando el algoritmo termina, el conjunto de vértices queda particionado en
s subconjuntos:

V = ∪si=1 Vi

donde s − 1 es el número de árboles alternantes:

Ti = (Vi , Ei ) i ∈ {1, . . . , s − 1}

y el conjunto de vértices no etiquetados es:

Vs = {v ∈ V / p(v) = 0}

En el ejemplo 13.3, s = 3, T1 y T2 son los dos árboles alternantes con vértices


{2, 3, 5} y {1, 4, 6} respectivamente y V3 = {7, 8}.

La condición de terminación es

{x ∈ V / sat(x) = 0 ∧ p(x) = 0} = ∅

Cuando el número de vértices no saturados sea 0 ó 1, el emparejamiento es


de máximo cardinal. Se supondrá, pues, el caso en que

|{x ∈ V / sat(x) = 0}| ≥ 2


Aspectos combinatorios del Problema (*) ORED 249

De esta forma, s ≥ 3 y hay, al menos dos árboles alternantes. Ésta es la


situación del ejemplo 13.3.

La condición de terminación del algoritmo asegura que

sat(v) = 1 ∀v ∈ Vs

y se puede asegurar que en el subgrafo generado por Vs , el emparejamiento K


induce un emparejamiento perfecto. Sean Vs1 y Vs2 los subconjuntos de vértices
que resultan al considerar el grafo bipartito.
En cada uno de los s−1 árboles alternantes, los vértices están caracterizados
como vértices pares o impares. Sean

ViI = {v ∈ Vi / car(v) = I} ∀i ∈ {1, . . . , s − 1}

En el ejemplo 13.3 se tiene:

V1I = {5} V2I = {1} V31 = {7} V32 = {8}

El conjunto W que identifica una solución factible del problema D es

s−1 I
W = ∪i=1 Vi ∪ Vs1

En el ejemplo 13.3 se obtendrı́a:

W = {5, 1, 7}

Para demostrar que esta elección del conjunto W es correcta, es suficiente con
verificar que la variable πw = 1 ∀w ∈ W es una solución factible del problema
D, y esto es cierto si se comprueba que para cualquier arista e ∈ E existe un
elemento w ∈ W incidente en dicha arista. Se distinguen ası́ dos casos para las
aristas en función de la partición de vértices que determina el algoritmo y los
diferentes árboles alternantes:

La arista e ∈ ∪s−1
i=1 Ei
ORED 250 Problema de emparejamiento máximo en grafos bipartitos

Como cualquier arista de alguno de los árboles alternantes tiene un extre-


mo par y el otro impar, la propiedad solicitada es obvia.
s−1
La arista e 6∈ ∪i=1 Ei
Esta arista nunca puede unir vértices pares dentro de un mismo árbol
alternante, puesto que el grafo es bipartito y no puede haber ciclos impares.
Tampoco podrı́a unir vértices pares de diferentes árboles alternantes, pues-
to que el algoritmo habrı́a juntado los dos árboles en un único árbol.
Por la misma razón, esta arista no podrı́a unir un vértice par de un árbol
alternante con un vértice de Vs sin etiquetar.

Por consiguiente, la variable πw = 1 ∀w ∈ W es una solución factible del


problema dual D. Para ver que es óptima, es suficiente comprobar que su valor
en la función objetivo, que es |W |, coincide con |K|:

|ViI | = |Ei ∩ K| ∀i ∈ {1, . . . , s − 1}

|Vs1 | = |Es ∩ K|

de forma que

s
X
|W | = |Ei ∩ K| = |K|
i=1


Aspectos combinatorios del Problema (*) ORED 251

Algoritmo 13.1: [K] = EmpBipEdmonds(G = (V, E), K)


Entrada: G = (V, E), grafo de entrada; K ⊂ E, emparejamiento inicial.
Salida: K ⊂ E, emparejamiento de máximo cardinal.
Inicialización:

1 v saturado por K
sat(v) = ∀v ∈ V ;
0 v no saturado por K
p(v) = 0, car(v) = 0 ∀v ∈ V ; El árbol alternante inicial vacı́o
R ≡ {v ∈ V / sat(v) = 0, p(v) = 0} ; Posibles raı́ces del árbol
Proceso:
while |R| ≥ 2 do
Sea r ∈ R: p(r) = r, car(r) = P, N SA(r) = {r}; La raı́z r es par
Sea R = R − {r}; Se elimina r del conjunto R
repeat
Sea x ∈ N SA(r); Se elige un vértice para sondear
Sea N SA(r) = N SA(r) − {x}; Se elimina de los vértices a sondear
if car(x) = P then
Si x es par, se añaden al árbol todos sus nodos adyacentes
while ∃y ∈ {v ∈ V / p(v) = 0, {x, v} ∈ E} do
p(y) = x, car(y) = I, N SA(r) = N SA(r) ∪ {y};
end while
else
x impar, se distingue si está o no saturado por K
if sat(x) = 1 then
x saturado, se une al árbol la arista del emparejamiento
Sea {x, y} ∈ K: p(y) = x, car(y) = P , N SA(r) = N SA(r) ∪ {y};
else
x no saturado, la cadena incremental es: x - p(x) - p(p(x)) - ... - r
sat(r) = 1 , sat(x) = 1; Se saturan los extremos de la cadena
R = R − {x}; x ya no puede ser raı́z de otro árbol
repeat
K = K ∪ {p(x), x}; Se añade a K la arista
x = p(x); Se avanza por la cadena hacia la raı́z
if x 6= p(x) then
K = K − {p(x), x}; Se quita de K la arista
x = p(x); Se avanza por la cadena hacia la raı́z
end if
until x 6= r
N SA(r) = ∅; Al llegar a la raı́z, ya no se sondean nodos
end if
if N SA(r) = ∅ then
p(v) = 0, car(v) = 0 ∀v ∈ V ; Se borra el árbol alternante
end if
end if
until N SA(r) = ∅
end while
return K es emparejamiento máximo
ORED 252 Problema de emparejamiento máximo en grafos bipartitos
Capı́tulo 14
Problemas de
Emparejamiento y
Recubrimiento

A partir del Problema de emparejamiento de máximo cardinal en grafos


bipartitos es natural plantearse el mismo problema en grafos generales.
Posteriormente se estudiará el problema de recubrimiento, que determina
un subconjunto de aristas de forma que cualquier vértice sea adyacente como
mı́nimo a una de las aristas del subconjunto. Están relacionados los problemas
de emparejamiento máximo y el de recubrimiento mı́nimo.
Termina el capı́tulo con el problema de emparejamiento de máximo peso a
partir de una red no dirigida.

14.1. Problema de emparejamiento máximo en gra-


fos generales
Dado un grafo no necesariamente bipartito, se puede plantear el Problema de
emparejamiento de máximo cardinal. Serı́a la situación que se planteó durante
la II Guerra Mundial al configurar las dotaciones de los aviones biplaza de la
RAF a partir de los pilotos de distintas nacionalidades y que, por consiguiente,
hablaban distintos idiomas.
El algoritmo de Edmonds para emparejamientos en grafos bipartitos falla en
ORED 254 Problemas de Emparejamiento y Recubrimiento

2 4

Figura 14.1: Grafo y emparejamiento del ejemplo 14.1

el caso general. La existencia de ciclos impares marca la diferencia entre un grafo


bipartito y uno que no lo es. El siguiente ejemplo ilustra la no aplicabilidad del
algoritmo visto en el capı́tulo 13.

Ejemplo 14.1. Sea el emparejamiento K = {{2, 3}} del grafo de la figura 14.1.
Al aplicar el algoritmo anterior, válido sólo para grafos bipartitos, el vector
p determina la tabla:

v p(v) ex(v) sat(v) car(v)


1 1 1 0 P
2 1 1 1 I
3 2 1 1 P
4 4 1 0 P

que está asociada a un bosque alternante con dos componentes, una formada
por los vértices {1, 2, 3} y la otra por el vértice aislado 4:

p(1) = 1 p(2) = 1 p(3) = 1 p(4) = 4

impidiendo la detección de la cadena incremental

1 ←→ 3 ←→ 2 ←→ 4

que incrementarı́a en uno el cardinal del emparejamiento para obtener el empa-


rejamiento de máximo cardinal

K ∗ = {{1, 3}; {2, 4}}

El algoritmo de grafos bipartitos no se puede aplicar cuando existan ciclos


impares, es decir, con un número impar de aristas. Hay que recordar que un
Problema de emparejamiento máximo en grafos generales ORED 255

grafo bipartito se caracteriza por no tener ciclos impares.


El algoritmo que determina el emparejamiento de máximo cardinal en gra-
fos generales se basa también en la construcción de un bosque alternante que
identifique las cadenas incrementales. Es fundamental, para evitar la situación
descrita en el ejemplo 14.1, detectar los ciclos impares.

14.1.1. Detección de ciclos impares


Cuando se detecta un ciclo impar puede interesar determinar el empareja-
miento que deja un vértice expuesto y el resto saturado. Con este fin, se in-
troducirá la contracción de los vértices del ciclo impar en un único vértice. La
contracción de un grafo ya se introdujo al estudiar el problema de la arbores-
cencia de mı́nimo peso en el capı́tulo 7.

En el ejemplo 14.1, se contraerı́a el ciclo impar µ = {1, 2, 3} como el vértice


5 y se tendrı́a el grafo contraı́do G/µ = (V = {4, 5}; E = {4, 5}) con dos vértices
y una arista.
El emparejamiento de máximo cardinal es la arista {4, 5} y al expandir el gra-
fo contraı́do, se transforma en la arista {4, 2}, por lo que hay que dejar expuesto
el vértice 2 en el ciclo impar, y considerar dentro del ciclo el emparejamiento
máximo formado por la arista {1, 3}, que al unirse a la arista anterior, permite
obtener el emparejamiento máximo.

Las sucesivas contracciones reducen el grafo original y la determinación del


emparejamiento máximo se va trasladando a las sucesivas —en sentido inverso—
expansiones dejando expuesto el vértice del ciclo que esté saturado en el grafo
anterior.
Para distinguir los vértices originales de los que se van creando con las suce-
sivas contracciones, se supondrá que nc es el número de vértices originales más
los que se van creando por las sucesivas contracciones. Inicialmente, nc = n y
los vértices comprimidos al finalizar este proceso serán {n + 1, n + 2, . . . nc}.

La contracción del grafo se realiza cuando se detecta un ciclo impar en el


árbol alternante caracterizado por el vector p. Recordando la caracterización de
un grafo bipartito por la inexistencia de ciclos impares y la interpretación del
vector car introducido en el capı́tulo 13, se concluye que en un árbol alternante
ORED 256 Problemas de Emparejamiento y Recubrimiento

existirá un ciclo impar cuando exista una arista {x, y} uniendo dos vértices que
sean ambos pares o impares.
En efecto, siempre existe un antecesor común a los vértices x e y en el árbol
H(r), la raı́z r es dicho antecesor. En el caso en que haya varios, se elige el
primero de los antecesores, sea r0 dicho vértice.
Con el fin de dar prioridad a la búsqueda de cadenas incrementales y aumen-
tar ası́ el cardinal del emparejamiento actual, sólo se construirán ciclos impares
cuando los vértices x e y, unidos por una arista, sean pares: car(x) = car(y) = P .
Por construcción del árbol alternante H(r), dicho vértice r0 debe ser par,
puesto que sólo los vértices pares pueden tener más de un sucesor. Al ser r0
par, cualquier cadena del árbol alternante µ[r0 , x], análogamente para µ[r0 , y],
tiene un número par de aristas al ser car(x) = car(y) = P . Se concluye ası́ que
siempre se define un ciclo impar en el árbol H(r) y, por inclusión, en el grafo G
al añadir la arista {x, y}.

El proceso de contracción, identificado por el procedimiento Contrac(y, x, p),


se basa en recorrer en dirección a la raı́z r el árbol alternante asociado a p desde
los vértices x e y hasta llegar al vértice r0 .
En el proceso de contracción de un ciclo impar µ, desaparecen los vértices
y aristas de dicho ciclo, ası́ como las aristas que unen vértices del ciclo que
estuvieran en el emparejamiento K del grafo antes de la contracción.
El procedimiento es el siguiente:

El vértice contraı́do nc no está saturado para permitir que sea saturado en


el grafo contraı́do. En el caso en que se sature el vértice contraı́do, la arista
incidente en dicho vértice del emparejamiento se traducirá en una arista del
grafo original que satura uno de los vértices del ciclo impar asociado. El resto
de vértices del ciclo se satura por las aristas del ciclo. Éste es el proceso de
expansión de cada vértice contraı́do.
Una vez determinado el emparejamiento de máximo cardinal K en el grafo
G, que puede ser el resultado de sucesivas contracciones, hay que recuperar el
emparejamiento del grafo original. El procedimiento asociado, Expandir(G, K),
se realiza expandiendo los vértices en orden inverso a su contracción, es decir,
primero nc, luego nc − 1, hasta llegar al primer vértice contraı́do n + 1.
El procedimiento es el siguiente:
Problema de emparejamiento máximo en grafos generales ORED 257

Algoritmo 14.1: [K, nc] = EmpM axContrac(x, y, G = (V, E), K ⊂


E, nc)
Sea r0 el primer nodo antecesor común a x e y;
nc = nc + 1;
Se construye el ciclo impar:
µnc = {x, p(x), p(p(x)), . . . , r0 } ∪ {y, p(y), p(p(y)), . . . , r0 } ∪ {x, y};
Actualización del grafo G:
V = V − µnc ∪ {nc};
E = E − {{i, j} ∈ E / i, j ∈ µnc } ∪ {{nc, j}, {i, j} ∈ E / i ∈ µnc , j 6∈ µnc };
Actualización del emparejamiento K:
K = K/µnc = K − {{i, j} ∈ K, i, j ∈ µnc };
Actualización del vector p:
p(v) = nc ∀v ∈ V / p(v) ∈ µnc ;
car(nc) = P ;
ex(nc) = 0;
sat(nc) = 0;
p(nc) = p(r0 );
if r0 = r then
r = nc;
p(r) = r;
end if

Algoritmo 14.2: [K] = EmpM axExpandir(G = (V, E); K ⊂ E, nc)


for v = nc, n + 1, −1 do
Sea µv el conjunto de vértices comprimidos en v;
Sea {v, x} ∈ K ⊂ E la arista que satura v;
Actualización de G = (V, E) = G ∗ µv al expandir µv ;
Añadir a K las aristas de µv que dejan sin saturar el vértice y ∈ µv tal
que {x, y} ∈ E;
end for
ORED 258 Problemas de Emparejamiento y Recubrimiento

a c
1 2 4

d
e f

6 g 5

Figura 14.2: Grafo del ejemplo 14.2

14.1.2. Algoritmo de Edmonds (*)


El algoritmo de Edmonds visto para emparejamientos en grafos bipartitos se
puede aplicar a grafos generales si se incorpora la detección de ciclos impares, su
contracción y posterior expansión. Se puede conseguir una complejidad O(n3 ).
En lugar de utilizar como emparejamiento inicial el vacı́o, se puede construir
uno inicialmente sin más que recorrer todos los vértices expuestos y añadir al
emparejamiento aquella arista que vaya a otro vértice expuesto. Es un algoritmo
voraz en el sentido de no existir dos vértices expuestos unidos por una arista.

14.2. Problema de mı́nimo recubrimiento


De forma análoga al concepto de emparejamiento, que es un subconjunto de
aristas con la propiedad de no haber aristas adyacentes, se introduce el concepto
de recubrimiento como otro subconjunto de aristas con la propiedad de ser todos
los vértices incidentes en, al menos, alguna de las aristas seleccionadas.

Definición 14.1. Dado un grafo G = (V, E), un recubrimiento es un subcon-


junto de aristas F ⊂ E de forma que cualquier vértice del grafo es incidente en
alguna arista de F .

Siempre que no haya vértices aislados, siempre existirá un recubrimiento,


que será el propio conjunto E.

Ejemplo 14.2. Sea el grafo representado en la figura 14.2.


Los siguientes conjuntos son recubrimientos:
Problema de mı́nimo recubrimiento ORED 259

F 1 = {a, b, c, d, e, f, g} = E F 2 = {a, b, c, d, e, f } F 3 = {a, b, c, g}

Obviamente, si F ⊂ E es un recubrimiento, entonces cualquier conjunto de


aristas F 0 verificando F ⊂ F 0 también lo es. El problema es determinar un
conjunto minimal de aristas que sea un recubrimiento.

Dado un grafo G = (V, E), el Problema de Mı́nimo Recubrimiento consiste


en determinar un recubrimiento F ⊂ E de mı́nimo cardinal.

Entre los recubrimientos definidos para el ejemplo 14.2, el de mı́nimo cardi-


nal es F 3

A continuación se estudia la relación que existe entre este problema y el de


emparejamiento de máximo cardinal.
Teorema 14.1. Dado un grafo simple G = (V, E) con n vértices, un empa-
rejamiento K0 de máximo cardinal y un recubrimiento de mı́nimo cardinal F0
verifican
|K0 | + |F0 | = n

Además, de un emparejamiento máximo se obtiene un recubrimiento de mı́ni-


mo cardinal y viceversa.
Demostración
A partir del emparejamiento K0 se obtiene el siguiente recubrimiento

F1 = K0 ∪ {ey = {y, ∗} ∈ E / sat(y) = 0}

añadiendo una arista incidente a cada uno de los vértices no saturados por K0 .
Por construcción, F1 es un recubrimiento y su cardinal verifica

|F1 | = |K0 | + (n − 2|K0 |) = n − |K0 |

porque se añade exactamente una arista por cada vértice no saturado; en caso
contrario, no serı́a K0 el emparejamiento de máximo cardinal.
En sentido contrario, a partir del recubrimiento de mı́nimo cardinal F0 se
construye el emparejamiento K1 al quitar sucesivamente aquellas aristas que
son adyacentes.
ORED 260 Problemas de Emparejamiento y Recubrimiento

En el recubrimiento F0 no puede haber cadenas de 3 o más aristas, puesto


que en caso contrario se podrı́a obtener un recubrimiento menor quitando la
arista intermedia. De este modo, cada arista que se quita añade sólo un vértice
no saturado para el emparejamiento que se está construyendo, se concluye ası́
que el número de aristas quitadas de F0 para construir K1 es:

|F0 | − |K1 | = n − 2|K1 | ⇐⇒ |F0 | = n − |K1 |

El subconjunto de aristas K1 verifica, al ser K0 un emparejamiento de máxi-


mo cardinal, la siguiente propiedad:

|K1 | ≤ |K0 |

de forma que

|F1 | = n − |K0 | ≤ n − |K1 | = |F0 |

y se demuestra ası́ que F1 es un recubrimiento de mı́nimo cardinal también.

Análogamente se demostrarı́a que K1 es un emparejamiento de máximo car-


dinal, ya que
|F1 | ≥ |F0 |

lo que implica
|K1 | = n − |F0 | ≥ n − |F1 | = |K0 |

y K1 también es un emparejamiento máximo.

Con la notación del teorema 14.1, se definen los siguientes subconjuntos de


aristas en el grafo del ejemplo 14.2:

K0 = {e, f } =⇒ F1 = {e, f, a, b}

F0 = {a, b, c, g} =⇒ K1 = {a, g}
Problema de emparejamiento de máximo peso (*) ORED 261

(4) (1)
2 3 4

(5) (8) (2)

(3)
5 1

Figura 14.3: Red del ejemplo 14.3

El teorema 14.1 permite construir un recubrimiento de mı́nimo cardinal a


partir del emparejamiento de máximo cardinal:

F1 = K0 ∪ {ey = {y, ∗} ∈ E / sat(y) = 0}

14.3. Problema de emparejamiento de máximo pe-


so (*)
Cuando las aristas del grafo G = (V, E) tienen asignada una valoración
o peso {d(e) / e ∈ E}, se define una red no dirigida (G, d) y tiene sentido
introducir la siguiente definición:

Definición 14.2. Dado un emparejamiento K ⊂ E en red no dirigida (G, d),


se define el peso de un emparejamiento como la suma de los pesos de sus aristas

X
d(K) = de
e∈K

Ejemplo 14.3. Sea la red no dirigida de la figura 14.3.


Se definen los siguientes emparejamientos indicando su peso:

K 1 = {{1, 4}; {3, 5}} d(K 1 ) = 7

K 2 = {{1, 5}; {3, 4}} d(K 2 ) = 4

K 3 = {{1, 3}} d(K 3 ) = 8

El Problema de emparejamiento de máximo peso consiste en determinar un


ORED 262 Problemas de Emparejamiento y Recubrimiento

emparejamiento K ∗ verificando

d(K ∗ ) = máx d(K)


K

El emparejamiento de máximo cardinal es el caso particular de este problema


cuando los pesos de las aristas son todos positivos e iguales. En el caso general,
las soluciones a ambos problemas son diferentes.

En el ejemplo 14.3, el emparejamiento de máximo peso es K 3 , que tiene sólo


una arista.

Para obtener resultados análogos a los del problema de emparejamiento de


máximo cardinal, hay que analizar las cadenas alternantes según su peso.

14.3.1. Coste reducido de cadena alternante


Dado un emparejamiento K en una red no dirigida (G, d), la existencia de
una cadena incremental sólo garantiza el incremento del cardinal del empare-
jamiento, pero no su peso. Es preciso, pues, valorar las cadenas incrementales
de forma que permitan el incremento del peso del emparejamiento asociado al
efectuar una transferencia.
No es necesario, sin embargo, que la cadena alternante sea incremental, pues-
to que no interesa que aumente el cardinal del emparejamiento, sino su peso.

Definición 14.3. Dada una red no dirigida (G, d) y un emparejamiento K, el


coste reducido de una cadena alternante L se define según

δ(L) = d(L ∩ K c ) − d(L ∩ K)

siendo K c = E − K
El coste reducido δ(L) representa el incremento de peso al realizar una trans-
ferencia por la cadena alternante L.

Para garantizar la optimalidad de un emparejamiento se tiene el siguiente


resultado

Proposición 14.1. En una red no dirigida (G, d), un emparejamiento K es de


máximo peso si, y sólo si, no admite una cadena alternante con coste reducido
estrictamente positivo.
Problema de emparejamiento de máximo peso (*) ORED 263

Demostración

⇒ Si existiera la cadena L verificando δ(L) > 0, es suficiente realizar una


transferencia para obtener un emparejamiento con peso mayor.

⇐ Sea K el emparejamiento verificando las hipótesis. Si K 0 es el empareja-


miento de máximo peso, se construye el grafo parcial G0 = (V, K 4 K 0 ) y
al aplicar el lema 13.1 se concluye que d(K) = d(K 0 ) y, por consiguiente,
K es un emparejamiento de máximo peso.

En la red no dirigida del ejemplo 14.3, y dado el emparejamiento K 1 , de peso


d(K 1 ) = 7, se definen las siguientes cadenas alternantes, los costes reducidos,
los emparejamientos obtenidos por las transferencias en dichas cadenas y los
pesos de estos emparejamientos:

L δ(L) K(L) d(K(L))


{1, 4, 3, 5, 1} −3 {3, 4}; {1, 5} 4
{1, 4, 3, 5} −6 {3, 4} 1
{4, 1, 3, 5} 1 {1, 3} 8

14.3.2. Algoritmo
Con el fin de obtener un emparejamiento de máximo peso, se introduce la
secuencia de emparejamientos {K1 , K2 , . . . , Kp , . . .} que denotan los empareja-
mientos de máximo peso con 1, 2, . . . , p, . . . aristas respectivamente.
El algoritmo que construye el emparejamiento de máximo peso se basará en el
siguiente teorema, que obtiene sucesivamente los emparejamientos {K1 , K2 , . . . , Kp , . . .}.

Teorema 14.2. Dados una red no dirigida (G, d) y Kp , el emparejamiento de


máximo peso con p aristas, si L es una cadena alternante incremental (une vérti-
ces no saturados por Kp ) y es la de coste reducido máximo, se verifica entonces
L
que Kp+1 , obtenido a partir de la transferencia por L, es el emparejamiento de
máximo peso con p + 1 aristas.

Demostración
ORED 264 Problemas de Emparejamiento y Recubrimiento

Por construcción, el coste reducido de L verifica

L
δ(L) = d(Kp+1 ) − d(Kp )

L
Si Kp+1 no fuera el emparejamiento de máximo peso entre los que tienen
p + 1 aristas, es porque existe un emparejamiento de mayor peso. Sea Kp+1 el
emparejamiento de máximo peso con p+1 aristas y con peso mayor estrictamente
L
que Kp+1 :
L
d(Kp+1 ) > d(Kp+1 )

Al construir el grafo parcial G0 = (V, Kp+1 4 Kp ) y aplicar el lema 13.1, se


obtienen tres tipos de componentes conexas:

1. Vértices aislados

2. Ciclos elementales alternantes


Sea µ uno de estos ciclos, su coste reducido

δ(µ) = d(µ ∩ Kp ) − d(µ ∩ Kpc )

debe ser nulo, ya que si δ(µ) 6= 0, se podrı́a obtener un emparejamiento


con mayor peso estrictamente que Kp con p aristas o mayor que Kp+1 con
p + 1 aristas.
Cualquiera de estos ciclos define el mismo número de aristas de Kp que
de Kp+1 .

3. Cadenas alternantes pares o impares


A las cadenas alternantes pares se les aplica el razonamiento anterior para
concluir que su coste reducido debe ser nulo.
Para las cadenas alternantes impares, al ser |Kp+1 | = |Kp | + 1, si se dis-
tinguen las que son incrementales respecto Kp+1 como {A1 , . . . , At } y las
incrementales respecto Kp como {B1 , . . . , Bs }. Al tener Kp y Kp+1 respec-
tivamente p y p + 1 aristas, se debe verificar necesariamente que s = t + 1.
Considerando cualquier par de cadenas alternantes Ai y Bj , con i ∈
{1, . . . , t} y j ∈ {1, . . . , s}, realizando una transferencia en ambas res-
pecto del emparejamiento Kp para obtener los nuevos emparejamientos
Kp0 y Kp+1
0
, que mantienen el mismo número de aristas al realizar esta
Problema de emparejamiento de máximo peso (*) ORED 265

doble transferencia, se se verifica que el coste reducido de ambas cadenas


δ(Ai ) y δ(Bj ) debe ser nulo, puesto que en caso contrario se obtendrı́a un
nuevo emparejamiento Kp0 o Kp+1
0
con peso mayor que el óptimo. Esta
propiedad es cierta para cualquier par i, j elegido.
Se concluye ası́ que el coste reducido de todas las cadenas alternantes
impares es el mismo:

δ p ≡ δ(A1 ) = · · · = δ(At ) = δ(B1 ) = · · · = δ(Bs )

Por ser Kp+1 y Kp los emparejamientos de máximo peso con p + 1 y p


aristas respectivamente, se verifica que

δ p = d(Kp+1 ) − d(Kp ) > d(Kp+1


L
) − d(Kp ) = δ(L)

y aquı́ está la contradicción, puesto que L era la cadena alternante respecto


Kp con coste reducido máximo y se ha encontrado otra con coste redu-
L
cido mayor. Por consiguiente, d(Kp+1 ) = d(Kp+1 ) y el emparejamiento
obtenido por transferencia es de máximo peso.

Basándose en este teorema, y a partir de un emparejamiento trivial K0 = ∅,


se obtiene la secuencia de emparejamientos

K0 , K1 , . . . , Kp , . . .

siendo el emparejamiento de máximo peso Kp con la propiedad de que la cadena


incremental de máximo coste reducido L verifique δ(L) < 0.

Este algoritmo es poco eficiente, puesto que se basa en la determinación de


todas las cadenas alternantes.

Aplicando este procedimiento a la red no dirigida del ejemplo 14.3, se obtiene:

1. K0 = ∅, d(K0 ) = 0
Las cadenas incrementales, todas las aristas, y sus costes reducidos son :
ORED 266 Problemas de Emparejamiento y Recubrimiento

L δ(L)
{1, 4} 2
{1, 3} 8
{1, 5} 3
{2, 3} 4
{3, 4} 1
{3, 5} 5

Se elige la cadena {1, 3} y la transferencia asociada permite obtener el


siguiente emparejamiento de máximo peso entre los que tienen una arista
K1 = {{1, 3}}.
Se ha incrementado el peso respecto del emparejamiento anterior al ser el
coste reducido positivo.

2. K1 = {{1, 3}}, d(K1 ) = 8


Las cadenas incrementales y sus costes reducidos son :

L δ(L)
{4, 1, 3, 5} −1
{4, 1, 3, 2} −2
{4, 3, 1, 5} −4

Se elige la cadena {4, 1, 3, 5} por ser la de mayor coste reducido y la trans-


ferencia asociada permite obtener el siguiente emparejamiento de máximo
peso entre los que tienen dos aristas K2 = {{1, 4}; {3, 5}}.
Se ha disminuido el peso respecto del emparejamiento anterior al ser el
coste reducido negativo. El emparejamiento de máximo peso es, pues, K1 .

Observación 14.1. Para determinar el emparejamiento de mı́nimo peso es


suficiente con determinar la cadena incremental de coste reducido mı́nimo en el
algoritmo anterior.
Capı́tulo 15
Problemas de rutas en grafos

Como introducción a la Teorı́a de Grafos siempre se cita el problema de


los puentes de Königsberg, planteado por Euler. Este problema busca una
cadena en un multigrafo verificando ciertas propiedades, concretamente que
utilice todas las aristas una sola vez; se denomina Problema del ciclo eule-
riano y se incluye dentro de una categorı́a de problemas de grafos denominados
Problemas de rutas. Otros problemas de rutas que se analizarán son el del ciclo
hamiltoniano, el problema del cartero chino y el problema del viajante.
La estructura que subyace en estos problemas es la de grafo o multigrafo. Las
restricciones de los recorridos se refieren a las aristas, ciclos eulerianos y proble-
ma del cartero chino, o a los vértices visitados, ciclo hamiltoniano y problema
del viajante. En este último problema y en el del cartero chino, los grafos aso-
ciados están valuados, se trabaja con redes no dirigidas, y se trata de minimizar
la longitud total del recorrido.
Adicionalmente, y basándose en la relación entre los problemas del ciclo ha-
miltoniano y el del viajante, se introducirán algunos conceptos relacionados con
la complejidad de los problemas: clase P, N P y N P-completa; estos conceptos
completan la introducción a la complejidad algorı́tmica vista en la sección 1.3.

15.1. Cadena y ciclo euleriano


Definición 15.1. Dado un multigrafo G = (V, E), una cadena euleriana es una
cadena que contiene todas las aristas sin repetir ninguna.
Si los extremos de la cadena euleriana coinciden se define un ciclo euleriano.
ORED 268 Problemas de rutas en grafos

El problema de los puentes de Königsberg, introducido en el capı́tulo 1, se


plantea entonces como la búsqueda de un ciclo euleriano. Euler demostró que
no habı́a solución a partir del siguiente teorema.

Teorema 15.1. Un multigrafo conexo G = (V, E) contiene una cadena eule-


riana (ciclo euleriano) si y sólo si el número de vértices con grado impar es 2
(0).

Demostración

⇒ Si existe una cadena euleriana, los vértices con grado impar son los extre-
mos. En el caso del ciclo, no hay vértices con grado impar. Es suficiente
con ir sumando el grado al recorrer la cadena o el ciclo eulerianos.

⇐ La demostración de esta implicación se hace por inducción en el número de


aristas. Se supone que hay 2 vértices con grado impar; el caso sin vértices
con grado impar se incluye en el anterior sin más que considerar una arista
y considerar sus extremos con grado impar al quitarla, posteriormente se
cierra el ciclo al añadir dicha arista.

• Si hay 1 arista, la cadena euleriana es la propia arista.


• Se supone cierta la hipótesis para menos de m aristas
• Si el grafo tiene m aristas:
Sean a, b ∈ V los dos vértices con grado impar. Al ser dG (a) impar, al
menos hay una arista incidente en a; esta arista será la primera de la
cadena euleriana. El otro extremo de la arista tiene dos posibilidades:
o coincide con el vértice b o es distinto de b. Si es distinto, al tener
grado par, existe otra arista distinta de la utilizada que sale, dicha
arista es la siguiente en la cadena euleriana.
Este esquema se repite hasta llegar al vértice b, puesto que el multi-
grafo es conexo.
Cuando se llega al vértice b, se utiliza la hipótesis de inducción en
cada una de las componentes conexas del grafo parcial que resulta al
suprimir las aristas de la cadena µ[a, b] construida. Al tener menos de
m aristas, todos los vértices del grafo parcial tienen grado par y existe
un ciclo euleriano que recorre todas las aristas de cada componente
conexa.
Cadena y ciclo euleriano ORED 269

Al ser el multigrafo conexo, se unen a la cadena µ[a, b] todos estos


ciclos y se tiene ası́ construida la cadena euleriana.

Definición 15.2. Un multigrafo en las condiciones del teorema 15.1 se dice


que es un grafo euleriano.

El multigrafo de los puentes de Königsberg no es euleriano

A continuación se detalla el algoritmo que permite construir una cadena


euleriana.

15.1.1. Algoritmo
La cadena euleriana del multigrafo G = (V, E), con n vértices y m aris-
tas, que construye el algoritmo se identifica a partir de un vector con m + 1
componentes:

σ(m + 1) ∈ {1, . . . , m} es la primera arista.

σ(e) ∈ {1, . . . , m} es la arista que sigue a la arista e ∈ {1, . . . , m}.

σ(e) = −1 si e ∈ {1, . . . , m} es la última arista de la cadena

Se supone que los vértices con grado impar son a, b ∈ V .

El algoritmo depende de la estructura asociada al multigrafo. Las aristas


incidentes a cada vértice se identifican por

w(i) = {e = {i, ∗} ∈ E} ∀i ∈ V

Para evitar que una arista sea utilizada más de una vez al construir la cadena
euleriana, cada movimiento por la arista e{i, j} desde i hasta j se traduce en
la eliminación de la arista e de los conjuntos w(i) y w(j). El algoritmo termina
cuando w(i) = ∅ ∀i ∈ V .

El vector φ(i) identifica la última arista utilizada para llegar al vértice i.


Inicialmente, para el vértice inicial a, se verifica φ(a) = m + 1, que es el ı́ndice
de la arista ficticia inicial, y φ(i) = 0 ∀i 6= a.
ORED 270 Problemas de rutas en grafos

µ
e = φ(i) σ(e)
i k
pre pos

Figura 15.1: Sucesión de aristas e inclusión de ciclos

a b

4
1 3 2
e
6
d c
5

Figura 15.2: Multigrafo euleriano del ejemplo 15.1

La variable nro ar identifica el número de aristas utilizadas en la cadena.

Los ı́ndices de aristas pre, pos ∈ {−1, 1, . . . , m + 1} permiten añadir un ciclo


euleriano a la cadena µ[a, b] siguiendo el proceso de construcción de la cadena
euleriana del teorema 15.1.

Gráficamente, la sucesión de aristas de la cadena euleriana que construye


el algoritmo, ası́ como el enlace de ciclos con la cadena µ[a, b] para completar
todas las aristas se ilustran en la figura 15.1.
El algoritmo que determina la cadena euleriana que une los vértices a y b
con grado impar en un grafo euleriano es el siguiente:

La complejidad de este algoritmo es O(m), puesto que cada arista es visitada


a lo sumo dos veces, una desde cada extremo.

Ejemplo 15.1. Sea el multigrafo de la figura 15.2, que es euleriano al ser el


grado de todos los vértices par.
Al ser todos los vértices de grado par, se elimina una arista, por ejemplo
la {a, b} para fijar los vértices a y b con grado impar de la demostración del
teorema. Automáticamente, se tiene m = 6 y se construye una tabla que permite
visualizar la aplicación del algoritmo 15.1 a este ejemplo:
Cadena y ciclo euleriano ORED 271

Algoritmo 15.1: [σ] = CadEuleriana(G = (V, E); a, b; {w(i) ⊂ E / i ∈


V })
Entrada:
G = (V, E), grafo de entrada, E = {1, 2, . . . , m};
a, b ∈ V , nodos a conectar por la cadena euleriana.
w(i) ⊂ E, aristas incidentes en cada nodo i ∈ V .
Salida:
σ(1 : m + 1), cadena euleriana:
{e1 = σ(m + 1), e2 = σ(e1 ), · · · , em = σ(em−1 )} (σ(em ) = −1)
Inicialización:
σ(e) = 0 ∀e ∈ {1, . . . , m + 1};
nro ar es el número de aristas de la cadena.
nro ar = 0;
φ(i) es arista de la cadena que llega a i, m + 1 es la arista previa al vértice a.
φ(a) = m + 1, φ(i) = 0 ∀i 6= a;
pre es la arista previa a la actual, pos es la siguiente a la última (se utiliza
para enlazar ciclos con una cadena previa).
pre = m + 1 pos = −1;
En principio, hay que ir desde i hasta t, permite añadir ciclos
posteriormente.
i=a t = b;
Proceso:
while w(i) 6= ∅ do
e arista no utilizada que sale de i y va a j, se elimina como arista
incidente en ambos nodos para no repetirla
Sea e = {i, j} ∈ w(i) : w(i) = w(i) − {e}; w(j) = w(j) − {e};
A j se llega por la arista e, se va construyendo la cadena euleriana con σ y
se aumenta en 1 su tamaño.
φ(j) = e; σ(pre) = e; nro ar = nro ar + 1;
Se actualiza el nodo actual i por j, ¿se ha llegado al destino t?.
i = j;
if i 6= t then
En caso negativo, se avanza.
pre = e;
else
En caso positivo, se ha terminado si nro ar = m.
σ(e) = pos;
if nro ar = m then
return Solución óptima.
else
Si nro ar < m se añade un ciclo en un nodo k incidente en la cadena
y del que salga alguna arista no visitada.
Sea k ∈ V tal que w(k) 6= ∅ y φ(k) 6= 0;
Hay que ir desde k hasta k y luego se enlaza con la cadena obtenida
antes.
i = k;
t = k;
pre = φ(i);
pos = σ(pre);
end if
end if
end while
ORED 272 Problemas de rutas en grafos

Iter 0 1 2 3 4 5 6
w(a) 1 ∅
w(b) 2, 3, 4 2, 3, 4 2, 4 4 4 4 ∅
w(c) 2, 5 2, 5 2, 5 5 ∅
w(d) 1, 3, 5, 6 3, 5, 6 5, 6 5, 6 6 ∅
w(e) 4, 6 4, 6 4, 6 4, 6 4, 6 4 ∅
φ(a) 7
φ(b) 0 0 3 3 3 3 4
φ(c) 0 0 0 2
φ(d) 0 1 1 1 5
φ(e) 0 0 0 0 0 6
σ(1) 0 0 3
σ(2) 0 0 0 0 5
σ(3) 0 0 −1 2
σ(4) 0 0 0 0 0 0 −1
σ(5) 0 0 0 0 0 6
σ(6) 0 0 0 0 0 0 4
σ(7) 0 1
nro ar 0 1 2 3 4 5 6
e 0 1 3 2 5 6 4
i a a d b c d e
j 0 d b c d e b
t b b b b b b b
pre 7 1 3 2 5 6
pos −1 −1 −1 −1 −1 −1 −1
k b

Como conclusión, la cadena euleriana enlazando a con b se deduce de los


valores de σ:
Problema del cartero chino ORED 273

e∈E σ(e)
1 3
2 5
3 2
4 −1
5 6
6 4
7 1

Considerando que σ(7) = 1 es la arista inicial y 4 es la última arista al


verificar que σ(4) = −1, se tiene construida la cadena euleriana que une a con
b:

σ(7) = 1 ↔ σ(1) = 3 ↔ σ(3) = 2 ↔ σ(2) = 5 ↔ σ(5) = 6 ↔ σ(6) = 4

El ciclo euleriano se completarı́a uniendo la arista {a, b} a la cadena eule-


riana anterior.

15.2. Problema del cartero chino


En una red no dirigida, si existe un ciclo euleriano, éste será el recorrido de
menor longitud total si las longitudes son positivas. En caso contrario, cuando
el grafo no sea euleriano, tiene sentido plantearse cuál será el recorrido que,
visitando todas las aristas, tenga una longitud total mı́nima.
Este serı́a, por ejemplo, el problema de los carteros o de los vigilantes de la
O.R.A.. Formalmente, el problema serı́a el siguiente:

Dado un multigrafo conexo valuado (G, d) verificando d(e) ≥ 0 ∀e ∈ E,


a partir de dos vértices a, b ∈ V , el Problema del cartero chino consiste en de-
terminar una cadena µ[a, b] que incluyendo todas las aristas del grafo, tenga
longitud total mı́nima.

Se puede suponer sin pérdida de generalidad que a = b, puesto que en caso


contrario, bastarı́a añadir una arista {a, b} de longitud 0 al grafo.
Obviamente, el problema tiene sentido cuando el grafo no es euleriano, puesto
que en este caso la solución es el ciclo euleriano. Es decir, se supone que hay más
ORED 274 Problemas de rutas en grafos

4 4
i b f

3 3 5
3 6
a e c

2 3 2
6 4 g
h d

Figura 15.3: Multigrafo del ejemplo 15.2

de 2 vértices con grado impar. Conviene recordar que siempre hay un número
par de vértices con grado impar.

Ejemplo 15.2. Sea el siguiente multigrafo valuado de la figura 15.3.

La solución del problema del cartero chino consiste en duplicar algunas aris-
tas del grafo original para convertirlo en un grafo euleriano. La cuestión es
qué aristas hay que duplicar. Al conjunto de estas aristas repetidas o copias
se le denomina E 0 , un subconjunto de E, de forma que el multigrafo asociado
Gb = (V, E ∪ E 0 ) es euleriano.

Sea V1 ⊂ V el conjunto de vértices con grado impar de G = (V, E); sea


n1 = |V1 | el número (par) de dichos vértices. La solución del problema del
cartero chino se construye añadiendo cadenas uniendo los vértices de V1 con
mı́nima longitud total.

En el Ejemplo 15.2, se tiene:

V1 = {a, b, c, d} n1 = 4

A partir del grafo valuado (G, d) se construye el clan valuado de orden n1 ,


(Kn1 , eµ ), definido por el conjunto de vértices V1 y donde la longitud de cada
arista es la mı́nima longitud en el grafo G de una cadena uniendo los extremos
de dicha arista.

El clan K4 del ejemplo 15.2 es el representado en figura 15.4.

No es difı́cil demostrar el siguiente procedimiento para resolver el problema


del cartero chino para el grafo valuado (G, d):
Problema del cartero chino ORED 275

6 9

a 9 c
6

6 6
d

Figura 15.4: Clan K4 del ejemplo 15.2

1. Determinar el conjunto V1 de vértices con grado impar de G. Se verifica


que n1 = |V1 | es un número par.

2. Determinar en (G, d) la cadena de mı́nima longitud µ[x, y] que une los


vértices x e y ∀x, y ∈ V1 . Sea dxy = d(µ[x, y]) esta mı́nima longitud.

3. En el grafo completo asociado al conjunto de vértices V1 se asocia a cada


arista {x, y} la distancia dxy ∀x, y ∈ V1 .

4. Determinar en este grafo valuado completo el emparejamiento de mı́nima


n1
distancia con 2 aristas. Sea K ∗ dicho emparejamiento.

5. Se construye el conjunto de copias de aristas


[
E0 = {e ∈ µ[x, y] ⊂ E}
{x,y}∈K ∗

6. La solución del problema del cartero chino es el ciclo euleriano en el grafo


b = (V, E ∪ E 0 )
G

n1
En el Ejemplo 15.2, el emparejamiento con 2 = 2 aristas de mı́nimo peso
es

K2∗ = {{a, b}; {c, d}}

de forma que las aristas que se repiten son las de las cadenas µ[a, b] y µ[c, d]
en K4 que alcanzan las distancias mı́nimas, 6 en ambos casos. El multigrafo
b = (V, E ∪ E 0 ) es el representado en la figura 15.5.
euleriano G
ORED 276 Problemas de rutas en grafos

4 4
i b f

3 3 5
3 6
a e c

2 3 2
6 4 g
h d

Figura 15.5: Multigrafo del ejemplo 15.2

15.3. Ciclo hamiltoniano


Si en lugar de restringir el recorrido en un grafo a visitar todas las aristas
se obliga a visitar todos los vértices sin repetir ninguno, se plantea entonces la
determinación del ciclo o cadena hamiltonianos. El nombre tiene su origen en el
matemático inglés Hamilton, que planteó en 1859 el problema de viajar por el
mundo visitando 20 ciudades sin repetir ninguna y regresar al punto de partida.

Definición 15.3. Dado un grafo conexo G = (V, E) con n vértices, una cadena
hamiltoniana es una cadena con n − 1 aristas que visita todos los vértices.

Definición 15.4. En un grafo conexo G = (V, E) con n vértices, un ciclo


hamiltoniano es un ciclo con n aristas que visita todos los vértices.

Definición 15.5. Un grafo es hamiltoniano si contiene un ciclo hamiltoniano.

En la actualidad, no se conocen condiciones que sean simultáneamente nece-


sarias y suficientes para la existencia de un ciclo hamiltoniano. A continuación
se estudia un tipo de conectividad que es exigida para que un grafo sea hamil-
toniano.

Definición 15.6. Dado un grafo conexo G = (V, E), se dice que A ⊂ V es un


conjunto de corte si el subgrafo generado por V − A es no conexo.

Definición 15.7. Un grafo es k-conexo si, y sólo si, es conexo, |V | ≥ k + 1 y


no contiene ningún conjunto de corte con menos de k vértices.

El grafo representado en la figura 15.6 es 2-conexo pero no 3-conexo, ya que


el conjunto A = {1, 5} es un conjunto de corte.

La condición necesaria para que un grafo sea hamiltoniano es la siguiente.


Ciclo hamiltoniano ORED 277

1 3 5

Figura 15.6: Grafo no hamiltoniano

Proposición 15.1. Si un grafo es hamiltoniano, entonces es 2-conexo.

Demostración
Si no es 2-conexo, existe un conjunto de corte que es un vértice y no puede
haber un ciclo hamiltoniano.

La 2-conexión no garantiza la existencia de un ciclo hamiltoniano, como


puede verse en el grafo anterior, por lo que la condición necesaria no es suficiente.
Basándose en que el clan de orden n, Kn es hamiltoniano, puesto que cual-
quier permutación de n elementos define un ciclo hamiltoniano, se introduce
la siguiente operación en un grafo que permitirá posteriormente identificar una
condición suficiente para que un grafo sea hamiltoniano.

Definición 15.8. Dado un grafo G = (V, E) con n vértices, si existen dos


vértices s, t ∈ V verificando dG (s) + dG (t) ≥ n, entonces se puede definir un
nuevo grafo
G + (s, t) ≡ (V, E ∪ {s, t})

Esta definición tiene la siguiente propiedad

Proposición 15.2. Si G + (s, t) es hamiltoniano, entonces G es hamiltoniano.

Demostración
Sea µ = (x1 , . . . , xn ) el ciclo hamiltoniano incluido en G + (s, t). Si este ciclo
no contiene la arista {s, t}, ya está demostrada la proposición.
En caso contrario, es decir, si el ciclo µ contiene la arista {s, t}, sea L =
µ − {s, t} la cadena abierta con extremos s y t, es decir, x1 = s y xn = t.
ORED 278 Problemas de rutas en grafos

A continuación se ve que existe un vértice intermedio xi , con 2 ≤ i ≤ n − 2


tal que s es adyacente a xi+1 y t es adyacente a xi .
En efecto, se definen los subconjuntos de vértices:
At = {xi / {t, xi } ∈ E, 2 ≤ i ≤ n − 2}
As = {xi / {s, xi+1 } ∈ E, 2 ≤ i ≤ n − 2}
Como s y t no son adyacentes en G, al no contar las aristas {t, xn−1 } y
{s, x2 }, y por la hipótesis de la proposición, se verifica

|At | + |As | = dG (s) + dG (t) − 2 ≥ n − 2

Como en el conjunto {x2 , . . . , xn−2 } hay n − 3 vértices, se verifica necesaria-


mente que existe un xi ∈ At ∩ As .
Se puede construir un ciclo hamiltoniano en el grafo original G, es decir sin
utilizar la arista {s, t} sin más que eliminar la arista {xi , xi+1 } y sustituirla por
las aristas {s, xi+1 } y {t, xi }.

Tiene sentido, pues, la siguiente definición

Definición 15.9. Dado un grafo G = (V, E), se denomina [G]n la clausura de


G que se obtiene al añadir las aristas verificando dG (s) + dG (t) ≥ n

De la proposición 15.2 se deduce el siguiente

Corolario 15.1. Si [G]n es hamiltoniano, entonces el grafo original G es ha-


miltoniano.

Este corolario se aplica si se consigue que [G]n = Kn , porque en este caso


la determinación del ciclo hamiltoniano es trivial. La sustitución de las aristas
añadidas se realiza como en la demostración de la proposición 15.2 en forma
inversa a como se fueron añadiendo.

15.4. Problema del viajante


Dado el grafo valuado (G, d), si a cada ciclo hamiltoniano se le asocia la lon-
gitud total del recorrido como la suma de las distancias de las aristas seleccio-
nadas, tiene sentido plantearse el siguiente problema denominado Problema del
Viajante:
Problema del viajante ORED 279

Determinar en un grafo valuado (G, d) el ciclo hamiltoniano de menor dis-


tancia total.

Este problema, al margen de las aplicaciones prácticas que tiene, es de gran


importancia dentro de la Investigación Operativa y de la Computación, puesto
que es el ejemplo tı́pico de problema computacionalmente difı́cil de resolver, es
un problema NP-fuerte. Se ha demostrado que para dimensiones suficientemente
grandes, no es posible determinar la solución exacta en un tiempo razonable.
A continuación se introducen tres algoritmos que resuelven de forma aproxi-
mada el Problema del Viajante. Al no garantizar la optimalidad de la solución
se dice que son algoritmos aproximados o heurı́sticas.

15.4.1. Algoritmo de la ciudad más cercana


La idea de este algoritmo es, una vez fijada la primera ciudad del recorrido,
ir a la más cercana no visitada previamente; repetir este proceso hasta visitar
todas las ciudades para enlazar la última visitada con la inicial.
Si en un problema del viajante todas las ciudades están conectadas, se carac-
teriza por la matriz cuadrada de tamaño n×n de las distancias: D = (di,j ), i, j ∈
V.
El algoritmo es el siguiente:

15.4.2. Algoritmo de Lin-Kernighan


A partir de una solución inicial, que se puede ver como una permutación de
n elementos, y que puede ser la calculada con el algoritmo voraz anterior, se
analizan los posibles cambios entre 2 elementos de dicha permutación para ver
si mejoran la solución inicial; en caso afirmativo, seleccionar la mejor solución
obtenida a partir de la inicial.
Sea µ la solución inicial:

µ = (x1 , . . . , xi , xi+1 , . . . , xj−1 , xj , xj+1 , . . . , xn ) xr ∈ {1, . . . , n} ∀r ∈ {1, . . . , n}

se define el cambio entre los elementos i-ésimo y j-ésimo, con i < j, como

µij = (x1 , . . . , xi , xj , xj−1 , . . . , xi+1 , xj+1 , . . . , xn )


ORED 280 Problemas de rutas en grafos

Algoritmo 15.2: [µ, d] = T SP V oraz(G = (V, E); {D = (di,j ), i, j ∈ V })


Entrada:
G = (V = {1, . . . , n}, E), grafo de entrada, D, matriz de distancias.;
Salida:
µ, solución del TSP: µ = (x1 , x2 , . . . , xn ), permutación de (1, 2, . . . , n).
d, distancia total del circuito.
Inicialización:
s ∈ {1, . . . , n} es la ciudad inicial.
ind = 1 xind = s;
Para no repetir la ciudad s.
W = V − {s};
d = 0;
i = s;
while W 6= ∅ do
Se busca la ciudad de W más próxima a i.
Sea j ∈ W tal que dij = mı́nk∈W {dik };
Se añade el tramo {i, j} al circuito.
ind = ind + 1;
xind = j;
d = d + dij ;
W = W − {j};
i = j;
end while
Se conecta la última ciudad con la primera s.
d = d + dis ;
µ = (x1 , x2 , . . . , xn )
Problema del viajante ORED 281

x1 x1
xn x2 xn x2

xj+1 xj+1

xj xj
xi xi
xj−1 xj−1
xi+1 xi+1

Figura 15.7: Cambio en el algoritmo de Lin

La interpretación gráfica de la obtención de la solución µij a partir de µ se


ilustra en la figura 15.7.

Si d(µ) representa la distancia total asociada a la solución µ:

n−1
X
d(µ) = dxi xi+1 + dxn x1
i=1

el algoritmo es el siguiente:

Ejemplo 15.3. Sea el Problema del Viajante con 5 vértices y matriz de distan-
cias:
 
0 2 6 4 20
 

 2 0 5 6 7 

D= 6 5 0 8 9 
 
 

 4 6 8 0 9 

20 7 9 9 0

Aplicando el algoritmo bioptimal, se tiene:


La solución inicial, partiendo del vértice s = 1, es

µ = (1, 2, 3, 4, 5) d(µ) = 44

Los nuevos recorridos obtenidos en la fase de proceso son:


ORED 282 Problemas de rutas en grafos

Algoritmo 15.3: [µ, d] = T SP LK(G = (V, E); {D = (di,j ), i, j ∈ V })


Entrada:
G = (V = {1, . . . , n}, E), grafo de entrada, D, matriz de distancias.
Salida:
µ, solución del TSP: µ = (x1 , x2 , . . . , xn ), permutación de (1, 2, . . . , n).
d, distancia total del circuito obtenido.
Inicialización:
µ es la solución inicial obtenida con un algoritmo voraz; d0 es la distancia
asociada.
[µ, d0 ] = T SP V oraz(G = (V, E); {D = (di,j ), i, j ∈ V });
Proceso:
d será la menor distancia entre todos los vecinos µij .
d = d0
i = 1;
while i ≤ n − 2 do
j = i + 2;
while j ≤ n do
µi,j es el circuito cambiando el par (i, j) respecto de µ
dij = d(µij );
if dij < d then
d = dij ;
i∗ = i;
j∗ = j
end if
j = j + 1;
end while
i = i + 1;
end while
∗ ∗
¿Mejora la mejor solución vecinal µi j la inicial µ?
if d < d0 then
∗ ∗
µ = µi j ;
end if
Problema del viajante ORED 283

i j µij d(µij )
1 3 (1, 3, 2, 4, 5) 46
1 4 (1, 4, 3, 2, 5) 44
1 5 (1, 5, 4, 3, 2) 44
2 4 (1, 2, 4, 3, 5) 45
2 5 (1, 2, 5, 4, 3) 35
3 5 (1, 2, 3, 5, 4) 29

En consecuencia, la solución propuesta es

µ = (1, 2, 3, 5, 4) d(µ) = 29

En este caso se ha obtenido la solución óptima, aunque en general no se


puede garantizar. Conviene observar que se han analizado, aparte de la solución
4!
inicial, 6 permutaciones de las 2 = 12 posibles.

En un Problema del viajante con n vértices, el algoritmo bioptimal analiza


Pn−2
sólo una función cuadrática respecto de n, concretamente j=1 j(n − j − 1)
(n−1)!
frente al total de 2 posibles soluciones. Esto justifica el carácter de algoritmo
aproximado.

15.4.3. Algoritmo de Christofides


Este algoritmo se basa en el árbol soporte de peso mı́nimo y consiste en los
siguientes pasos:

1. Determinar el árbol soporte de mı́nimo peso H = (V, T )

2. Sean V1 ⊂ V el conjunto de vértices de H con grado impar

3. Determinar en el subgrafo G(V1 ) de G el emparejamiento perfecto de mı́ni-


mo peso. Sea K ∗ dicho emparejamiento.

4. Añadir a H las aristas de K ∗ para obtener el grafo euleriano H 0 = (V, T ∪


K ∗ ). Si estas aristas son de H, se tiene entonces un multigrafo al repetirlas.

5. Determinar un ciclo euleriano en H 0 .


ORED 284 Problemas de rutas en grafos

3
(5)
(5)
(2) (6) 2 3
1 2 5
(4) (6) (7) (8) (9)

4 5
4 (9)
H = (V, T ) G(V1 )

Figura 15.8: Algoritmo de Christofides, ejemplo 15.3

6. Fijar un vértice inicial arbitrario y construir un ciclo hamiltoniano a partir


del ciclo euleriano sin más que pasar al siguiente vértice cuando se llegue
a un vértice ya visitado hasta volver al vértice inicial.

Aplicando el algoritmo de Christofides al ejemplo 15.3, se tiene:

1. El árbol soporte de peso mı́nimo es H, ver figura adjunta.

2. V1 = {2, 3, 4, 5}

3. El emparejamiento K ∗ de mı́nimo peso en el subgrafo G(V1 ) generado por


V1 , ver figura 15.8, es {{2, 3}; {4, 5}}.

4. El ciclo euleriano en el grafo ampliado con K ∗ es el representado en la


figura 15.9.

5. El ciclo hamiltoniano construido a partir del ciclo euleriano es, conside-


rando como vértice inicial el 1, es (1, 4, 5, 2, 3), con distancia total 31, que
no es el óptimo.

15.5. Introducción a la complejidad de los proble-


mas
En la sección 1.3 se introdujo el concepto de complejidad de los algoritmos
para comparar los distintos algoritmos que pueden resolver un mismo proble-
ma; se vio ası́ la complejidad lineal, cuadrática, en general polinomial y se vio
también que habı́a algoritmos no polinomiales.
Introducción a la complejidad de los problemas ORED 285

3 3

1 2 5 1 2 5

4 4
Ciclo euleriano Ciclo hamiltoniano

Figura 15.9: Algoritmo de Christofides, ejemplo 15.3

En esta sección se introducirá el concepto de complejidad de los proble-


mas, introduciendo primero la clase P y, posteriormente, las clases N P y N P-
completa. La introducción de esta última se basa en la relación entre problemas
y se introducirá este concepto a partir de los problemas del ciclo hamiltoniano
y el problema del viajante analizados previamente en este capı́tulo.

15.5.1. Problemas de decisión. Clase P


Aunque el objeto de estudio serán los problemas de optimización combinato-
ria, a efectos de introducir los conceptos relativos a la complejidad algorı́tmica,
es preciso tratar un tipo especial de problemas, son los problemas de decisión,
que a continuación se definen formalmente.

Definición 15.10. Un problema es una cuestión planteada que debe ser resuel-
ta. El problema se caracteriza por:

Un conjunto de parámetros relacionados.

Propiedades de la respuesta o solución.

Cada ejemplo (o instancia en la notación informática) se caracteriza por un


conjunto de valores determinados de los parámetros. La respuesta o solución
depende de los parámetros, es decir, hay una solución para cada ejemplo.

Definición 15.11. Un problema de decisión π es un problema cuya respuesta


sólo puede ser afirmativa o negativa.
ORED 286 Problemas de rutas en grafos

Cualquier problema de optimización se puede traducir en un problema de


decisión sin más que acotar la función objetivo para preguntar si existe una
solución que mejora dicha cota o no.

En el caso del problema del viajante se puede plantear el siguiente proble-


ma de decisión: ¿existe un recorrido con longitud total menor que B, una cota
prefijada?

Aunque pueda parecer más restrictivo un problema de decisión que el co-


rrespondiente de optimización, eligiendo una sucesión de problemas de decisión
se puede resolver el problema de optimización. En el caso del problema del via-
jante, bastarı́a elegir una sucesión de cotas Bn de forma adecuada para obtener
el recorrido de longitud mı́nima.

El problema de decisión π se plantea a partir de un ejemplo genérico, donde


se introducen los parámetros del problema, y una cuestión planteada sobre el
ejemplo genérico y cuya respuesta es afirmativa o negativa.
Al conjunto de todos los ejemplos del problema π se le denomina Dπ . Dado
un ejemplo I ∈ Dπ , si la respuesta al problema π es afirmativa, se dice entonces
que I ∈ Yπ .
Formalmente, el problema de decisión del viajante serı́a:

PROBLEMA DEL VIAJANTE

EJEMPLO GENÉRICO
C = {1, 2, . . . , n}, conjunto de ciudades.
d : C × C → <, distancias entre ciudades.
B ∈ <, cota.

CUESTIÓN
¿Existe un recorrido, caracterizado por la permutación (π1 , . . . , πn ) tal que

n−1
X
dπi ,πi+1 + dπn ,π1 ≤ B ?
i=1
Introducción a la complejidad de los problemas ORED 287

Asociado al concepto de ejemplo está el de dimensión del ejemplo, que ya se


introdujo en el capı́tulo 1, y que mide la cantidad de memoria reservada para
almacenar el ejemplo.

Definición 15.12. Un problema de decisión es de la clase P cuando existe un


algoritmo polinomial que lo resuelva.

Por ejemplo, el problema de decisión asociado a la existencia de una cadena


euleriana pertenece a la clase P.
El hecho de que haya problemas —el problema del viajante, por ejemplo—
para los que no se ha encontrado un algoritmo polinomial induce a pensar que
hay problemas en el complementario de P. La cuestión fundamental es si esta
última afirmación es cierta; parece razonable pensar que sı́, puesto que mucha
gente y muy capaz no ha podido encontrar algoritmos polinomiales a determi-
nados problemas que han sido —y lo son todavı́a— muy estudiados.
En la duda de si existe el complementario de P, es preciso incluir esta clase
en otra más amplia, la clase N P, que será introducida en la siguiente subsección
a partir de los algoritmos no determinı́sticos.

15.5.2. Algoritmo no determinı́stico. Clase N P


Definición 15.13. Dado un problema de decisión π, se define un algoritmo no
determinı́stico como aquel procedimiento definido por dos etapas:

1. Etapa de conjetura
En esta etapa se propone para cada ejemplo I ∈ Dπ una estructura S
(solución factible del problema).

2. Etapa de comprobación
A partir del ejemplo I y de la estructura S propuesta en la etapa anterior,
en la etapa de comprobación se determina si la respuesta es SI, NO, o no
termina el procedimiento.

Se dice que un algoritmo no determinı́stico resuelve un problema de decisión


π si tiene las dos propiedades siguientes:

Si I ∈ Yπ , entonces existe una estructura S tal que en la etapa de com-


probación la respuesta es SI.
ORED 288 Problemas de rutas en grafos

Si I 6∈ Yπ , entonces no existe una estructura S con la propiedad anterior.

Observación 15.1. Cualquier algoritmo tradicional (determinı́stico) se puede


interpretar como un algoritmo no determinı́stico sin más que comprimir en una
las fases de conjetura y comprobación.

Definición 15.14. Un algoritmo no determinı́stico que resuelve un problema


de decisión π, se dice que es polinomial si ∀I ∈ Yπ existe alguna estructura S
de forma que la etapa de comprobación se realiza en tiempo polinomial.

Definición 15.15. Un problema de decisión es de la clase N P cuando exista


un algoritmo no determinı́stico polinomial que lo resuelva.

Un ejemplo de problema de decisión de la clase N P es el del problema del


viajante.

Proposición 15.3. Cualquier problema de decisión polinomial está incluido en


la clase N P, es decir, P ⊂ N P.

Conjetura
La cuestión más importante, y que sigue sin ser respondida en la actualidad,
es si las clases P y N P coinciden.
Dado que el problema sigue abierto, y considerando la gran cantidad de
recursos movilizados sin encontrar una respuesta afirmativa, en lo que sigue se
supondrá que
P ⊂ NP P 6= N P

15.5.3. Transformaciones polinomiales. Clase N P-completa


Cuando se trata de clasificar los problemas de decisión por su complejidad
o dificultad para ser resueltos, en concreto, si se quiere distinguir dentro de la
clase NP los que son de la clase P, es fundamental el definir unas reglas precisas
que permitan relacionar unos problemas con otros. En complejidad algorı́tmica,
casi todos los resultados se obtienen ası́ por comparación.

Definición 15.16. Dados dos problemas de decisión π1 y π2 , y supuesto que


el método de codificación de los ejemplos es razonable, se dice que existe una
transformación polinomial de π1 a π2 , y se denota por π1 ∝ π2 cuando exista
una función
f : Dπ1 → Dπ2
Introducción a la complejidad de los problemas ORED 289

verificando

1. f es computable en tiempo polinomial.

2. ∀I ∈ Dπ1 , I ∈ Yπ1 ⇐⇒ f (I) ∈ Yπ2

Ejemplo 15.4. Sean:

π1 : Problema del ciclo hamiltoniano:

• EJEMPLO GENÉRICO
G = (V, E), grafo.
V = {v1 , . . . , vk }, conjunto de vértices.
E = {e1 , . . . , el }, conjunto de aristas.
• CUESTIÓN
¿Existe un ciclo hamiltoniano?
(Un ciclo hamiltoniano es un ciclo que recorre todos los vértices sin
repetir)

π2 : Problema del viajante.

A continuación se demuestra que π1 ∝ π2 , para lo que hay que identificar la


función f :

Proposición 15.4. El Problema del Ciclo Hamiltoniano es transformable po-


linomialmente en el Problema del Viajante, es decir

HC ∝ T SP

Demostración:
Dado un ejemplo I ∈ π1 (problema del [Link]), se asocia el conjunto
de ciudades al conjunto de vértices V , se construye el grafo completo y se asigna
la siguiente distancia entre vértices:
(
1 {vi , vj } ∈ E
d(vi , vj ) =
2 caso contrario

Se considera como cota B = k = |V |


Es fácil comprobar que la función f es computable polinomialmente.
ORED 290 Problemas de rutas en grafos

Se ha demostrado ası́ que HC ∝ T SP . De alguna forma, el problema del


viajante es más general que el del ciclo hamiltoniano. Dicho de otra forma, cual-
quier algoritmo que resuelva el T SP puede resolver el HC con una complejidad
análoga.

Proposición 15.5.
(
π2 ∈ P =⇒ π1 ∈ P
π1 ∝ π2 =⇒
π1 6∈ P =⇒ π2 6∈ P

Proposición 15.6. (
π1 ∝ π2
=⇒ π1 ∝ π3
π2 ∝ π3
Definición 15.17. Dos problemas π1 y π2 son polinomialmente equivalentes
cuando π1 ∝ π2 y π2 ∝ π1 .

Al ser la relación ∝ reflexiva y transitiva, induce un orden parcial en el


conjunto de los problemas de decisión de la clase N P.

Un conjunto con un orden parcial no asegura que cualquier par de elementos


puedan ser ordenados, en este caso serı́a un orden total. Un ejemplo de conjunto
ordenado parcialmente es el cuadrado unidad [0, 1]2 ⊂ IR2 con el orden parcial
definido por

x  y ⇐⇒ xj ≤ yj j = 1, 2

En [0, 1]2 hay un elemento mayor 1 = (1, 1)t de forma que se verifica

x  1 ∀x ∈ [0, 1]2

Dado el conjunto N P ordenado parcialmente con la relación ∝, si existiera un


elemento maximal, cualquier problema de decisión π ∈ N P serı́a transformable
polinomialmente a dicho elemento maximal.
Dicho problema maximal serı́a el más general de todos los problemas de
la clase N P, puesto que un algoritmo que lo resolviera, resolverı́a cualquier
problema de la clase N P con la misma dificultad.
Introducción a la complejidad de los problemas ORED 291

Si hubiera más de un elemento maximal, serı́an todos ellos polinomialmente


equivalentes, ya que estarı́an todos ellos incluidos en la clase N P. Realmente,
se tendrı́an una clase de equivalencia definida a partir de la relación ∝.

Definición 15.18. La clase N P-completa es la clase de equivalencia según la


relación ∝ formada por los problemas maximales.
Dicho de otro modo:
(
π ∈ NP
π ∈ N P − completa ⇐⇒
∀π 0 ∈ N P π0 ∝ π

En consecuencia, si un problema N P-completo pudiera ser resuelto en tiem-


po polinomial =⇒ todos los problemas de la clase N P podrı́an ser resueltos en
tiempo polinomial.
Análogamente, si un problema de la clase N P es intratable (no puede ser
resuelto en tiempo polinomial) =⇒ todos los problemas N P-completos son in-
tratables.
La clase de problemas N P-completos está en el complementario de la clase
P dentro de N P. Gráficamente,

Proposición 15.7. Dados dos problemas de decisión π1 , π2 ∈ N P, entonces


)
π1 ∈ N P − completa
=⇒ π2 ∈ N P − completa
π1 ∝ π2

Esta proposición permite demostrar fácilmente cuando un problema de deci-


sión es N P-completo. El procedimiento para demostrar que π es N P-completo
serı́a el siguiente:

1. π ∈ N P

2. ∃π 0 ∈ N P-completa tal que π 0 ∝ π

La cuestión que queda pendiente es si existe al menos un problema de de-


cisión que sea N P-completo. Este es el resultado que se conoce como Teorema
de Cook, que propone un problema de decisión, el problema de sastisfacilidad,
que es N P-completo y, a partir de él, se demuestra la pertenencia de otros
problemas, el TSP es uno de ellos, a esta clase.
ORED 292 Problemas de rutas en grafos
Capı́tulo 16
Independencia en grafos y
digrafos. Problema de
coloración

Un subconjunto de vértices es absorbente cuando es accesible por un arco


desde su complementario.
Dado un grafo o un digrafo, un conjunto de vértices es independiente cuando
cualquier par de vértices no son adyacentes.
Si la estructura subyacente es la de digrafo, se desarrollará el concepto de
núcleo al exigir al conjunto independiente que sea, además, absorbente. Asociado
al núcleo, y caracterizándolo, se define la función de Grundy.
Para la estructura de grafo, a partir del concepto de independencia se plan-
tea de forma natural el problema de coloración de un grafo. Se define el número
cromático de un grafo y se introduce un algoritmo exacto que permite la colo-
ración de grafos.

16.1. Conjunto independiente. Núcleo de un digrafo


El problema de las 8 reinas planteado por Gauss permite introducir el con-
cepto de independencia en un grafo. El problema se plantea al preguntarse si es
posible situar 8 reinas en un tablero de ajedrez sin que se puedan comer.
La idea de independencia es la de seleccionar un conjunto de vértices no
ORED 294Independencia en grafos y digrafos. Problema de coloración

relacionados. Formalmente, se tiene el siguiente concepto, que es válido tanto


para grafos como para digrafos.

Definición 16.1. Dado un grafo o un digrafo G, un subconjunto de vértices


A ⊂ V se dice que es independiente o estable si cualquier par de vértices de A
no es adyacente.

En el problema de las 8 reinas, el grafo asociado es el formado por las 64


casillas del tablero, que se relacionan cuando son adyacentes mediante un mo-
vimiento de la reina. Las 8 reinas se situarán en aquellas casillas que formen un
conjunto independiente.
Obviamente, si A ⊂ V es un conjunto independiente, cualquier subcon-
junto A0 ⊂ A también lo será. El problema que interesa es el de encontrar el
conjunto independiente maximal, es decir, no contenido estrictamente en ningún
otro.

Definición 16.2. El cardinal del conjunto independiente maximal de un grafo


o digrafo G se denomina número de independencia y se denota por α(G).

Las 8 reinas que no se comen definen un conjunto independiente maximal,


puesto que 9 reinas repetirı́an fila o columna.
En el resto de esta sección se trabajará con digrafos; en esta estructura se
introducen los conceptos de conjunto absorbente y de núcleo.

Definición 16.3. Dado un digrafo G = (V, U ), un subconjunto de vértices


A ⊂ V se dice que es absorbente si desde cualquier vértice del complementario
de A parte un arco con extremo final en A, es decir

Γ+ (x) ∩ A 6= ∅ ∀x ∈ V − A

Dado un conjunto absorbente A ⊂ V , cualquier conjunto que lo conten-


ga A ⊂ A0 también lo será. El problema que interesa es el de encontrar el
conjunto absorbente minimal, identificado por un conjunto absorbente de car-
dinal mı́nimo.

Definición 16.4. Al cardinal del conjunto absorbente minimal de un digrafo G


se le denomina número de absorción del digrafo y se denota por β(G).

Un ejemplo de este tipo de problemas puede ser el de situar en un tablero


de ajedrez el menor número de reinas que controlan todas las casillas. En este
Conjunto independiente. Núcleo de un digrafo ORED 295

2 2 2

1 4 1 1 4

3 3 3
(a) (b) (c)

Figura 16.1: Existencia (a,c) y unicidad (a) de núcleo

caso, los vértices son las 64 casillas y cada arco relaciona dos casillas cuando son
accesibles por un movimiento de reina; obviamente, el digrafo es simétrico. El
conjunto absorbente minimal identifica las posiciones de las reinas. El número
de absorción del digrafo asociado es 5.
Combinando los conceptos de independencia y absorción, se tiene el siguiente
concepto.

Definición 16.5. Dado un 1-digrafo G = (V, U ), un subconjunto S ⊂ V se dice


que es un núcleo si es simultáneamente independiente y absorbente. Es decir,
cuando cualquier vértice x ∈ V verifica:

Γ(x) ∩ S = ∅ si x ∈ S

Γ(x) ∩ S 6= ∅ si x 6∈ S

La existencia y unicidad del núcleo de un digrafo no se puede asegurar en


general. En los tres digrafos de la figura 16.1 se observa la existencia de un único
núcleo (a), no existencia de núcleo (b), y existencia pero no unicidad (c).
El juego del Fan-Tan, que se explica en el siguiente ejemplo, permite ser
representado por un digrafo de forma que la solución puede ser obtenida a
partir de su núcleo.

Ejemplo 16.1. Dadas 3 filas con 3, 4 y 5 cerillas, cada uno de los 2 jugadores
retira en su turno entre una y el total de cerillas de una de las filas. Gana el
que retira la última cerilla.
Los vértices del digrafo son las distintas situaciones del juego

{(x1 , x2 , x3 ) / 0 ≤ xi ≤ 2 + i 1 ≤ i ≤ 3}

y un arco (x, y) representa una jugada de alguno de los jugadores.


El vértice final es el (0, 0, 0) y el jugador que controle el arco que llega a
dicho vértice es el ganador.
ORED 296Independencia en grafos y digrafos. Problema de coloración

Los juegos que permiten ser representados por un digrafo con estas carac-
terı́sticas se denominan juegos de Nim. El núcleo de estos juegos representa para
un jugador el conjunto de estados en los que debe moverse si el vértice victorio-
so, en el de las cerillas el (0, 0, 0). Al ser independiente, y siempre que el otro
jugador esté fuera del núcleo, él puede volver al núcleo —conjunto absorbente—
; por otra parte, al otro jugador no le queda más remedio que salir del núcleo
—conjunto independiente—; de esta forma, se termina victoriosamente el juego.

El núcleo de un digrafo puede ser identificado en algunas situaciones por


medio de la función de Grundy, que se introduce a continuación. A partir de
esta función se resolverá el juego de las cerillas.

16.1.1. Función de Grundy (*)


Definición 16.6. Dado un digrafo simple G = (V, U ), se define una función

g : V −→ {0, 1, 2, . . .}

verificando la siguiente propiedad:

g(x) = mı́n{z ∈ {0, 1, 2, . . .} / z 6= g(y) ∀y ∈ Γ+ (x)} ∀x ∈ V

La función de Grundy de un digrafo puede ser caracterizada por las dos


condiciones siguientes:

1. g(x) = k > 0 =⇒ ∀j < k ∃y ∈ Γ+ (x) / g(y) = j

2. g(x) = k =⇒ g(y) 6= k ∀y ∈ Γ+ (x)

La función de Grundy no siempre existe ni es única. Ver los digrafos ante-


riores a, b y c para identificar los casos de existencia y unicidad (caso a), no
existencia (caso b) y no unicidad (caso c).
La relación formal entre la función de Grundy y el núcleo de un digrafo se
describe en la siguiente proposición.

Proposición 16.1. Si g es la función de Grundy del digrafo simple G, entonces


su núcleo S se caracteriza por

S = {x ∈ V / g(x) = 0}
Conjunto independiente. Núcleo de un digrafo ORED 297

a b

d c

Figura 16.2: Existencia de núcleo sin función de Grundy

Demostración
Dado x ∈ V , hay dos opciones:

x∈S
Entonces g(x) = 0 y se verifica

mı́n g(y) > 0 =⇒ Γ(x) ∩ S = ∅


y∈Γ+ (x)

por lo que S es un conjunto independiente.

x 6∈ S
En este caso, g(x) > 0 y se verifica

mı́n g(y) = 0 =⇒ Γ(x) ∩ S 6= ∅


y∈Γ+ (x)

por lo que S es un conjunto absorbente.

La implicación en sentido contrario no es cierta; puede existir núcleo sin que


el digrafo tenga función de Grundy. Esta situación se ilustra con el digrafo de
la figura 16.2, cuyo núcleo es el conjunto formado por el vértice d.
Como se ve en este digrafo, la existencia de circuitos es crı́tica para la exis-
tencia de la función de Grundy. Este observación se concreta en la siguiente
proposición.

Proposición 16.2. Si el digrafo simple G no tiene circuitos, el núcleo y la


función de Grundy existen y son únicos.

Demostración
Se construye la siguiente partición en el conjunto de vértices V :
X(0) = {x ∈ V / Γ+ (x) = ∅}
ORED 298Independencia en grafos y digrafos. Problema de coloración

X(1) = {x ∈ V / x 6∈ X(0) Γ+ (x) ⊂ X(0)}


X(2) = {x ∈ V / x 6∈ X(0) ∪ X(1) Γ+ (x) ⊂ X(0) ∪ X(1)}
············
X(k) = {x ∈ V / x 6∈ X(0) ∪ X(1) ∪ · · · ∪ X(k − 1) Γ+ (x) ⊂ X(0) ∪
X(1) ∪ · · · ∪ X(k − 1)}
············
Al no tener circuitos, la función de Grundy se construye ordenando los vérti-
ces según X(0), X(1), . . . e iniciando la asignación según g(x) = 0 para todo
x ∈ X(0).

En el caso en que el digrafo tenga circuitos pares puede haber varios núcleos
y varias funciones de Grundy. Si existe un circuito impar, no existe núcleo ni
función de Grundy.

16.2. Problema de coloración de grafos


El problema de coloración de grafos es uno de los más interesantes desde el
punto de vista matemático. Es famosa la conjetura de los 4 colores, según la
cual, cualquier grafo planar (un mapa) puede ser coloreado con 4 colores sin que
haya dos regiones adyacentes con el mismo color.
Desde el punto de vista computacional, además, es uno de los problemas más
difı́ciles de resolver y son necesarias las heurı́sticas para resolver problemas de
tamaño medio y grande.
El problema de coloración está asociado al concepto de independencia y se
introduce a continuación.

16.2.1. Función de coloración. Número cromático


Ya se introdujo el número de independencia de un grafo G, denotado α(G),
como el número de vértices del conjunto independiente de cardinal máximo. Con
el fin de caracterizar cada uno de los conjuntos independientes se introduce el
siguiente concepto.

Definición 16.7. Dado un grafo G = (V, E), una Función de coloración es una
aplicación
C : V −→ {1, 2, . . .}
Problema de coloración de grafos ORED 299

1 4

2 5

3 6

Figura 16.3: Grafo bipartito G

que asigna un número (color) a cada vértice con la siguiente propiedad:

C(x) 6= C(y) ∀{x, y} ∈ E

Cualquier función de coloración define una partición del conjunto de vértices


en conjuntos independientes:
[
V = {x ∈ V / C(x) = k}
k=1,2,...

denominados clases de color.


El problema no es, sin embargo, determinar cuál es el tamaño máximo de
alguna de estas clases de color, el número de independencia, sino cuál es el menor
número de estas clases. Con este fin se introducen las siguientes definiciones.

Definición 16.8. Un grafo G es r-coloreable si existe una función de coloración


C verificando
C(x) ≤ r ∀x ∈ V

De forma natural surge la cuestión de cuál es el mı́nimo número r tal que el


grafo es r-coloreable.

Definición 16.9. Dado un grafo G = (V, E), su número cromático, denotado


por χ(G), es el mı́nimo r ∈ {1, 2, . . .} tal que el grafo G es r-coloreable.

Es preciso no confundir el número cromático con el número de independencia


de un grafo. Ambos conceptos están asociados a funciones de coloración, según
se puede ver en el grafo bipartito G de la figura 16.3.
La función de coloración que determina el número cromático, χ(G) = 2 por
ORED 300Independencia en grafos y digrafos. Problema de coloración

ser un grafo bipartito, es la siguiente:

C 1 (1) = C 1 (2) = C 1 (3) = 1 C 1 (4) = C 1 (5) = C 1 (6) = 2

La función de coloración asociada al número de independencia, α(G) = 4,


es la siguiente:

C 2 (1) = 1 C 2 (4) = 2 C 2 (2) = C 2 (3) = C 2 (5) = C 2 (6) = 3

siendo el conjunto {2, 3, 5, 6} el conjunto independiente de cardinal máximo.


Evidentemente, la existencia de un clan Ks en un grafo G acota inferiormente
el número cromático según χ(G) ≥ s. Se introduce el siguiente concepto

Definición 16.10. Dado un grafo G = (V, E), el orden del clan maximal, de-
notado por w(G), es el número de vértices del clan maximal incluido en G.

Obviamente se verifica la siguiente propiedad para cualquier grafo G:

χ(G) ≥ w(G)

La desigualdad estricta se da, por ejemplo, en el grafo de 5 vértices cuyas


aristas son los lados del pentágono asociado. En este grafo, w(G) = 2 y, sin
embargo, χ(G) = 3.
Los conceptos de conjunto independiente y clan están relacionados a través
del grafo complementario Ḡ.

Proposición 16.3. Dado un grafo G, se verifica

α(G) = w(Ḡ) α(Ḡ) = w(G)

En la figura 16.4 se detalla el grafo complementario Ḡ del grafo bipartito de


la figura 16.3.
En dicho grafo se comprueba fácilmente que hay un clan maximal de orden
4 de forma que w(Ḡ) = 4 y α(Ḡ) = 2.
Con el fin de obtener la función de coloración asociada al número cromático
se introducen dos algoritmos, uno voraz, que es muy rápido pero es aproximado y
no garantiza la optimalidad de la solución, y otro algoritmo exacto, el algoritmo
de Brown, que es aplicable sólo para grafos de tamaño reducido.
Problema de coloración de grafos ORED 301

2 5

1 4

3 6

Figura 16.4: Grafo Ḡ complementario del grafo de la figura 16.3

16.2.2. Algoritmo voraz


A continuación se detalla un algoritmo que construye la función de coloración
rápidamente asignando a cada vértice el menor color posible considerando los
colores previamente asignados y que son adyacentes.
Este tipo de algoritmos se denominan voraces y no siempre, el problema de
coloración es uno de estos casos, obtienen la solución óptima.
Con el fin de distinguir los vértices anteriores que son adyacentes a uno dado,
y suponiendo una ordenación de los vértices, por ejemplo V = {1, 2, . . . , n}, se
introduce
Γk (i) = {j ∈ Γ(i) / j < k}

El algoritmo voraz serı́a el siguiente, en el que se suponen conocidos los


colores anteriores al vértice i0 , y se asigna un color c0 a dicho vértice para
seguir coloreando los posteriores.
La situación habitual es que no se conozca ninguna coloración previa, en
ese caso, se fija el vértice inicial i0 = 1 y C(i0 ) = c0 = 1. Se utiliza esta
generalización en el algoritmo 16.1 para permitir su posterior utilización en el
algoritmo 16.2, que sı́ es exacto y garantiza la optimalidad de la solución.

El valor χ̄ obtenido por el algoritmo 16.1 representa una cota superior del
número cromático del grafo G, es decir:

χ̄ ≥ χ(G)

ya que el valor obtenido por el algoritmo depende de la ordenación de los vértices.


ORED 302Independencia en grafos y digrafos. Problema de coloración

Algoritmo 16.1: [C, ī, χ̄] = ColorV oraz(i0 , c0 , G = (V, E), {C(j), i <
i0 })
Entrada:
G = (V = {1, . . . , n}, E), grafo de entrada, i0 ∈ V , c0 ≥ 1;{C(j), j < i0 },
coloración válida de {1, 2, . . . , i0 − 1} ⊂ V .
Salida:
C, coloración válida de G.
ī, primer vértice de V con el máximo color χ̄ utilizado en la coloración.
χ̄, máximo color obtenido (estimación del número cromático χ(G))
Inicialización:
Se asigna a i0 el color c0
C(i0 ) = c0 ;
for i = i0 + 1, n do
Se asigna a i el menor color posible compatible con los nodos anteriores
C(i) = M in{c ∈ {1, 2, . . .} / C(j) 6= c ∀j ∈ Γi (i)};
end for
χ̄ = máx1≤i≤n {C(i)}
ī = mı́nC(i)=χ̄ {i ∈ V };

Con el fin de obtener el número cromático exacto, se propone el siguien-


te algoritmo, que parte de una coloración inicial que puede proporcionar este
algoritmo voraz.

16.2.3. Algoritmo exacto de Brown


La idea básica del algoritmo de Brown es la siguiente: a partir de una colo-
ración inicial, incrementar el color de algún vértice —sin aumentar el número
cromático obtenido y siempre que sea compatible con los vértices anteriores—
para que, al colorear vorazmente a partir de dicho vértice modificado, disminuir
el número cromático.
Como se utiliza sistemáticamente la coloración voraz descrita anteriormente,
se denotará por
voraz(i, ci , i0 , χ̄)

a la subrutina que colorea vorazmente el grafo partiendo de una coloración válida


C(1), C(2), . . . , C(i − 1) y asigna al vértice i el color ci , es decir, C(i) = ci .
Los argumentos de salida de la subrutina son:

1. χ̄ = mı́n1≤j≤n {C(j)}

2. io = M in{i ∈ V / C(i) = χ̄}


Problema de coloración de grafos ORED 303

2 6

3 5

Figura 16.5: Grafo del ejemplo 16.2

El algoritmo voraz descrito en la subsección anterior serı́a equivalente a


llamar a esta subrutina voraz(1, 1, i0 , χ̄).
La compatibilidad de un nuevo color c0 asignado a un vértice j0 , es decir,
C(j0 ) = c0 , se verifica comprobando que c0 no coincide con ninguno de los
colores de los vértices adyacentes anteriores:

c0 6= C(j) ∀j ∈ Γj0 (j0 )

La función de coloración óptima es C ∗ y χ es el número cromático del grafo


G.

Ejemplo 16.2. Aplicar el algoritmo de Brown al grafo de la figura 16.5 y


comprobar que el número cromático es 3.
ORED 304Independencia en grafos y digrafos. Problema de coloración

Algoritmo 16.2: [C, χ̄(G)] = ColorBrown(G = (V, E))


Entrada:
G = (V = {1, . . . , n}, E), grafo de entrada.
Salida:
C, coloración válida de G que alcanza χ̄(G).
χ̄(G), número cromático de G.
Inicialización:
Se parte de una coloración inicial (algoritmo voraz, por ejemplo)
[C, i0 , χ] = ColorV oraz(1, 1, G = (V, E), ∅);
Se identifica el vértice anterior al primero que alcanza χ: C(j0 ) = c0
j0 = i0 − 1;
c0 = C(j0 );
C ∗ (j) = C(j) ∀j = 1, n;
Proceso:
Se intenta aumentar el color de j0 > 1 para disminuir el valor de la cota χ
while j0 > 1 do
if c0 < χ − 1 then
c0 = c0 + 1;
C(j0 ) = c0 ;
if c0 6= C(j) ∀j ∈ Γj0 then
El color c0 es compatible con los sucesores de j0
[C, i00 , χ0 ] = ColorV oraz(j0 , c0 , G = (V, E), {C(j), j < j0 });
if χ0 < χ then
Se ha conseguido disminuir la cota χ
χ = χ0 ;
C ∗ (j) = C(j) ∀j = 1, n;
end if
Se repite el proceso actualizando el valor de j0
j0 = i00 − 1;
c0 = C(j0 );
end if
else
Se intenta con el vértice anterior a j0
j0 = j0 − 1;
c0 = C(j0 );
end if
end while
Se actualiza C con la mejor coloración obtenida C ∗ .
C(j) = C ∗ (j) ∀j = 1, n.
Bibliografı́a

[1] Berge, C. (1976) Graphs and hypergraphs. North Holland Publishing


Company.

[2] Jungnickel, D. (2005). Graphs, Networks and Algorithms. Springer.

[3] Korte, B., Vygen, J. (2006). Combinatorial Optimization. Theory and


Algorithms. Springer.

[4] Lawler, *. (****) Combinatorial optimization. ****

Otras referencias
[5] Appel, K., Haken, W. (1976) Every map is four colourable. Bulletin of
the American Mathematical Society 82: 711 — 712.

[6] Bellman, R. (1958) On a routing problem. Quarterly of Applied Mathe-


matics, 16: 87 — 90.

[7] Berge, C. (1958) Théorie des graphes et ses applications, Wiley.

[8] Biggs, N.L., Lloyd, E.K., Wilson, R.J. (1975) Graph Theory: 1736 -
1936. Oxford: University Press.

[9] Cayley, A. (1857) On the Theory of Analytic Forms Called Trees. Philos.
Mag. 13: 19 — 30.

[10] Cipra, B.A. (2000) The Best of the 20th Century: Editors Name Top 10
Algorithms. SIAM News, Volume 33 (4).

305
ORED 306 BIBLIOGRAFÍA

[11] Dantzig, G. B. (1982) Reminiscences about the origins of linear program-


ming. Operations Research Letters, Volume 1 (2): 43 — 48.

[12] Dijkstra, E.W. (1959) A note on two problems in connexion with graphs.
Numerische Mathematik, 1: 269 — 271.

[13] Dudeney, H.E. (1958) Amusements in Mathematics. Paperback ed. New


York: Dover Publications.

[14] Edmonds, J. (1967) Optimum Branchings. Journal of Research of the Na-


tional Bureau of Standards Section B, 71B (4): 233 — 240.

[15] Euler, L. (1736) Solutio problematis ad geometriam situs pertinentis.


Commentarii Academice Scientarum Imperialis Petropolitane 8: 128 —
140.

[16] Euler, L. (1759) Solution d’une question curieuse qui ne parait soumise
a aucune analyse. Mémoires de l’Académie Royale des Sciences et Belles
Lettres vol.15: 310 — 337.

[17] Floyd, R. W. (1962). Algorithm 97: Shortest Path. Communications of


the ACM, 5 (6): 345.

[18] Ford, L.R. (1956) Network Flow Theory, Paper P-923, The RAND Cor-
poration. Santa Monica, California.

[19] Fulkerson, D.R. (1961) An out-of-kilter method for minimal cost flow
problems. Journal of the Society for Industrial and Applied Mathematics;
9(1): 18 — 27.

[20] Garey, M.R., Johnson, D.S. (1979) Computers and intractability. A


guide to the theory of NP-Completeness. W. H. Freeman and Company.

[21] Golumbic, M. (1980). Algorithmic Graph Theory and Perfect Graphs.


Academic Press.

[22] Guthrie, F. (1880) Note on the Colouring of Maps. Proc. Roy. Soc. Edin-
burgh, 10: 727 — 728.

[23] Harary, F. (1969). Graph Theory. Reading, Massachusetts: Addison-


Wesley.
BIBLIOGRAFÍA ORED 307

[24] Hopcroft, J.E., Tarjan, R.E. (1973) Efficient algorithms for graph ma-
nipulation. Communications of the ACM (16):372 — 378.

[25] Lawler, E. (2001) Combinatorial optimization. Networks and Matroids.


Dover Publications Inc. Mineola, New York.

[26] Lucas, E. (1882) Rècrèations mathèmatiques, deuxième èdition, Gauthier-


Villars, Paris.

[27] Kantorovich, L. (1942) On the transfer of masses (in russian). Doklady


Akademii Nauk, 37(2): 227 — 229.

[28] Kruskal, J. (1956) On the shortest spanning subtree of a graph and the
traveling salesman problem. Proc. Amer. Math. Soc. 7: 48 — 50.

[29] Kuratowski, K. (1930) Sur le probleme des courbes gauches en topologie


(in French). Fund. Math. 15: 271 — 283.

[30] Menger, K. (1927). Zur allgemeinen Kurventheorie. Fund. Math. 10: 96


— 115.

[31] Nesetril, J., Milková, E., Nesetrilová, H. (2001) Otakar Boruvka


on minimum spanning tree problem Translation of both the 1926 papers,
comments, history. Discrete Mathematics, (233): 3 — 36.

[32] Prim, R. C. (1957) Shortest connection networks and some generalisations.


Bell System Technical Journal, 36: 1389 — 1401.

[33] Robertson, N., Sanders, D., Seymour, P., Thomas, R. (1997) The
Four-Colour Theorem. Journal of Combinatorial Theory, Series B, Volume
70 (1): 2 — 44.

[34] Schrijver, A. (2012) On the History of the Shortest Path Problem. Do-
cumenta Mathematica, Extra Volume ISMP: 155 — 167.

[35] Shimbel, A. (1951) Applications of matrix algebra to communication nets,


Bulletin of Mathematical Biophysics 13: 165 — 178.

[36] Shimbel, A. (1953) Structural parameters of communication networks.


Bulletin of Mathematical Biophysics, 15: 501 — 507.
ORED 308 BIBLIOGRAFÍA

[37] Tarjan, R.E. (1972) Depth-first-search and linear graph algorithms.


SIAM [Link].: 2146 — 160.

[38] Tarry, G. (1895) Le problème des labyrinthes. Nouvelles Annales de


Mathématique : 4187 — 190.

[39] Tolstoi A.N. (1930) Metody nakhozhdeniya naimenśhego summovogo


kilome-trazha pri planirovanii perevozok v prostranstve (russian); methods
of finding the minimal total kilometrage in cargo transportation planning
in space). TransPress of the National Commissariat of Transportation: 23
— 55.

[40] Vandermonde, A.T. (1771) Remarques sur les problèmes des situa-
tion. En Histoire de l’Académie Royale de Sciences avec les memoires de
Mathématique et de Physique pour l’année 1771: 566 — 574.

[41] Warshall, S. (1962). A theorem on Boolean matrices. Journal of the


ACM, 9 (1): 11 — 12.

[42] Wiener, Chr. (1873) Ueber eine Aufgabe aus der Geometria situs. Mat-
hematische Annalen, 6: 29 — 30.

También podría gustarte