Está en la página 1de 126

NOTAS DEL CURSO

TEORÍA DE GRAFOS Y OPTIMIZACIÓN


EN REDES

Ramiro Torres

Semestre 2023-A
2
Índice general

1. Conceptos y definiciones básicas 7


1.1. Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2. Grafos dirigidos . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3. Representación computacional de grafos . . . . . . . . . . . . 13
1.3.1. Matriz de adyacencia . . . . . . . . . . . . . . . . . . . 13
1.3.2. Matriz de incidencia . . . . . . . . . . . . . . . . . . . 14
1.3.3. Listas de adyacencia . . . . . . . . . . . . . . . . . . . 15
1.3.4. Matrices totalmente unimodulares . . . . . . . . . . . . 16
1.4. Caminos y ciclos . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.5. Árboles, forestas y cortes . . . . . . . . . . . . . . . . . . . . . 20
1.6. Conectividad . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.7. Grafos Eulerianos y Bipartitos . . . . . . . . . . . . . . . . . . 24

2. Árboles generadores de peso mı́nimo 29


2.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2. Programación entera . . . . . . . . . . . . . . . . . . . . . . . 30
2.3. Definiciones básicas . . . . . . . . . . . . . . . . . . . . . . . . 31
2.4. Algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.4.1. Algoritmo de Prim . . . . . . . . . . . . . . . . . . . . 34
2.4.2. Algoritmo de Kruskal . . . . . . . . . . . . . . . . . . . 38
2.5. Arborescencias de peso mı́nimo . . . . . . . . . . . . . . . . . 40

3. Problema de caminos más cortos 47


3.1. introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.2. Formulación lineal entera . . . . . . . . . . . . . . . . . . . . . 49
3.3. Algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.3.1. Dijkstra . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.3.2. Algoritmo de Ford . . . . . . . . . . . . . . . . . . . . 53
3.3.3. Algortimo de Bellman-Ford . . . . . . . . . . . . . . . 59
3.4. Grafos acı́clicos . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.5. Camino más corto entre todos los nodos . . . . . . . . . . . . 65

3
4 ÍNDICE GENERAL

4. Problema de flujo máximo 69


4.1. introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.2. Definiciones Básicas . . . . . . . . . . . . . . . . . . . . . . . . 69
4.3. Cortes y grafos residuales . . . . . . . . . . . . . . . . . . . . 71
4.4. Teorema de flujo máximo-corte mı́nimo . . . . . . . . . . . . . 74
4.5. Algoritmo de Ford – Fulkerson . . . . . . . . . . . . . . . . . . 76
4.5.1. Buscando caminos aumentantes . . . . . . . . . . . . . 77
4.6. Algoritmo de Edmonds-Karp . . . . . . . . . . . . . . . . . . . 81
4.7. Descomposición de caminos . . . . . . . . . . . . . . . . . . . 86
4.8. Algoritmo de Goldberg-Tarjan . . . . . . . . . . . . . . . . . . 88

5. Problemas de flujo de costo mı́nimo 97


5.1. Formulación . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
5.2. Criterio de optimalidad . . . . . . . . . . . . . . . . . . . . . . 98
5.3. Algoritmo de Cancelación de ciclos negativos . . . . . . . . . . 102
5.4. Algoritmo de cancelación de ciclos de costo medio mı́nimo . . 103
5.5. Algoritmo de caminos más cortos consecutivos . . . . . . . . . 106
5.6. Flujo sobre tiempo . . . . . . . . . . . . . . . . . . . . . . . . 111

6. Emparejamiento 117
6.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
6.2. Emparejamiento sobre grafos bipartitos . . . . . . . . . . . . . 118
6.2.1. Formulación lineal entera . . . . . . . . . . . . . . . . . 121
6.3. Emparejamiento de cardinalidad máxima . . . . . . . . . . . . 124
Bibliografı́a

1. Bernhard Korte y Hens Vygen(2000). Combinatorial Optimization-


Theory and Algorithms. Second edition. Springer.

2. Integer and Combinatorial Optimization. George Nemhauser and Lau-


rence Wolsey. Wiley-Interscience.

3. Cook, Cunningham, Pulleyblank & Schrijver (1997). Combinatorial


Optimization (1st ed.). Wiley-Interscience.

4. Ahuja, R., Magnanti, T., Orlin J. (1993) Network Flows: Theory, Al-
gorithms and Applications. New York: Prentice Hall.

5. Cormen, Leiserson, Rivest & Stein (2001). Introduction to Algorithms


(2nd ed.). MIT Press.

5
6 ÍNDICE GENERAL
Capı́tulo 1

Conceptos y definiciones
básicas

En este capı́tulo se presenta los conceptos básicos sobre grafos, tanto en


su versión dirigida como no dirigida. Dentro de estos objetos se definirán
algunos operadores y conjuntos especiales, los cuales serán importantes para
este curso.

1.1. Grafos
Definición 1 (Grafo no dirigido) Un grafo no dirigido G es un par or-
denado G = (V, E), compuesto por un conjunto finito V = {v1 , . . . , vn } lla-
mados vértices o nodos, y un multi-conjunto E = {{vi , vj } : vi , vj ∈ V } de
pares desordenados de V , conocidos como aristas.

El conjunto de nodos del grafo G es también notado como V (G) y su


conjunto de aristas como E(G). Además, definimos |V | = n como el número
de nodos y |E| = m como el número de aristas del grafo G.

Ejemplo 1 Para aclarar la noción de multiconjunto, como un conjunto que


admite elementos repetidos, consideremos el grafo G = (V, E) donde

V = {v1 , v2 , v3 , v4 }E = {v1 , v2 }, {v1 , v3 }, {v1 , v3 }, {v2 , v2 } {v3 , v4 } .

Observación 1 Dada una arista e = {i, j} ∈ E, los nodos i y j se conocen


como extremos de la arista e. Además, se dice que e es incidente a los nodos
i y j.

Definición 2 Sea G = (V, E) un grafo no dirigido.

7
8 CAPÍTULO 1. CONCEPTOS Y DEFINICIONES BÁSICAS

Dos aristas que tienen los mismos extremos se dicen paralelas.


Una arista que conecta a un nodo consigo mismo se llama un lazo; es
decir, tiene la forma e = {i, i}, para algún nodo i ∈ V .
Un nodo que no tiene aristas adyacentes se llama aislado.
Si G no tiene lazos ni aristas paralelas, entonces G es un grafo simple.
Un grafo simple en el que cada par de nodos está conectado por una
arista se denomina grafo completo. Una grafo completo de n nodos se
representa por Kn
En adelante se supone que todos los grafos son simples.
Ejemplo 2 Las siguientes figuras representan a los grafos completos con
tres, cuatro y cinco nodos:

1 2
1

1 2

2 3 3 4

n = 2, m=1 n = 3, m=3 n = 4, m=6


n(n−1)
En general, un grafo completo con n nodos contiene 2
aristas.
Definición 3 (Subgrafo) Sean G = (V, E) un grafo no dirigido, W ⊆ V y
F ⊆ E. Si H = (W, F ) es un grafo, entonces se dice que H es un subgrafo
de G.
Notemos que la condición de que H sea un grafo implica que i, j ∈ W
para todo {i, j} ∈ F . Si además se cumple que F contiene a todas las aristas
de G con ambos extremos en W , es decir,
F = {{i, j} ∈ E : i, j ∈ W },
entonces H se conoce como el grafo inducido por W y lo notamos G[W ]. Por
otro lado, si W = V y F ⊂ E, entonces H se denomina el grafo generado
por F y se nota G[F ]. Finalmente, notaremos G \ i y G \ e a los subgrafos
G[V \ {i}] y G[E \ {e}], respectivamente.
Si se tiene los grafos G = (V, E) y G′ = (V ′ , E ′ ), establecemos que G ∪
G = (V ∪ V ′ , E ∪ E ′ ) y G ∩ G′ = (V ∩ V ′ , E ∩ E ′ ). Si G ∩ G′ = ∅, entonces

se dice que son disjuntos. Además, si V ′ ⊆ V y E ′ ⊆ E , entonces se tiene


que G′ es un subgrafo de G.
1.1. GRAFOS 9

Adyacencia, incidencia y vecindad


Definición 4 (Nodo adyacente) Sea. G = (V, E) un grafo no dirigido. Se
dice que dos nodos i, j ∈ V son adyacentes si la arista {i, j} pertenece a E.
Dos nodos adyacentes también se denominan vecinos y al conjunto de
todos los nodos vecinos a un cierto nodo i ∈ V se lo denomina vecindad de
i, la que notaremos por:
N(i) := {j ∈ V : {i, j} ∈ E}.
Este conjunto tiene su análogo en E, donde todas las aristas incidentes al
nodo i ∈ V se representa por:
δ(i) := {{i, j} : {i, j} ∈ E}.
La cardinalidad de δ(i) se conoce como grado del nodo y corresponde al
número de aristas incidentes a i y se denota por |δ(i)|. Ası́, un nodo con
grado igual a cero será un nodo aislado. Si todos los vértices de G tienen el
mismo grado k > 0, entonces se dice que G es k−regular. Para un subconjunto
X ⊆ V , definimos δ(X) := E(X, V (G) \ X) = {{i, j} : i ∈ X, j ∈ V (G) \ X}
Lema 1 El grado promedio de un grafo es mayor igual que mı́n{|δ(i)| : i ∈
V } y menor igual que máx{|δ(i)| : i ∈ V }.
Demostración: Claramente se cumple que:
mı́n{|δ(i)| : i ∈ V } ≤ |δ(j)| ≤ máx{|δ(i)| : i ∈ V }, ∀j ∈ V.
Sumando sobre todos los nodos, se tiene
1X
mı́n{|δ(i)| : i ∈ V } ≤ |δ(i)| ≤ máx{|δ(i)| : i ∈ V }
n i∈V

Lema 2 La suma de los grados de todos los nodos de un grafo no dirigido


es una cantidad par.
Demostración: Sea G un grafo no dirigido. Sabemos que para cada i ∈ V ,
el grado indica la cantidad de aristas incidentes a i. Como cada arista es
incidente a dos nodos, entonces la suma de los grados corresponde a contar
cada arista dos veces y se tiene:
X
|δ(i)| = 2m.
i∈V
10 CAPÍTULO 1. CONCEPTOS Y DEFINICIONES BÁSICAS

Lema 3 El número de nodos de grado impar en un grafo es siempre par.


P
Demostración: En un grafo G = (V, E) se tiene que m = 1/2 i∈V |δ(i)| ya
que cada arista es contada
P exactamente 2 veces al ser incidente a dos nodos.
Entonces se tiene que i∈V |δ(i)| es un número par.
Definición 5 (Grafos isomorfos) Sean G = (V, E) y H = (W, F ) dos
grafos. Se dice que G y H son isomorfos si existe una función biyectiva
ϕ : V → W , tal que

{i, j} ∈ E ←→ ϕ(i), ϕ(j) ∈ F.
En dicho caso, notamos G ≅ H.
La relación ≅ es de equivalencia y respeta las operaciones de vecindad N y
de grado.
Ejemplo 3 Sean G y H definidos por la siguiente figura:
d
2 3 a

b
G H
1 4
c

Estos grafos son isomorfos, pues la función ϕ definida por


1 7→ φ(1) = c, 2 7→ φ(2) = a,
3 7→ φ(3) = d, 4 7→ φ(4) = b,
es biyectiva y tiene la propiedad de isomorfismo. Ası́, G ≅ H.
Por el contrario, el grafo
2

1 3

no es isomorfo a G, y por ende tampoco es isomorfo a H, pues el nodo 1


tiene grado tres y por tanto no puede ser proyectado a algún nodo de G.
1.2. GRAFOS DIRIGIDOS 11

1.2. Grafos dirigidos


Definición 6 (Grafo dirigido) Un grafo dirigido (digrafo) es un par orde-
nado D = (V, A), compuesto por un conjunto V de nodos y A es un conjunto
de pares ordenados de nodos, conocidos como arcos.

En un grafo dirigido se tiene que (i, j) 6= (j, i). Además, en un arco


a = (i, j) se dice que:

j es el sucesor de i en a

i es el predecesor de j en a

i es el nodo inicial y j es el nodo final del arco a.

Ejemplo 4 Consideremos una variación del grafo del ejemplo 1. Sea D =


(V, A) definido por

V = {1, . . . , 4}A = (1, 2), (1, 3), (1, 3), (2, 2) .

En este caso, el conjunto A consiste de cuatro pares ordenados que no se re-


piten. El digrafo D puede representarse como se indica en la siguiente figura:

(1,2) (2,2)
1 2

(1,3) (1,3)

3 4

Notemos que, a diferencia de la versión no dirigida, el arco (1, 3) indica una


dirección diferente al arco (3, 1).

La mayorı́a de conceptos definidos para grafos no dirigidos pueden ser


extendidos de forma natural a grafos dirigidos. Por ejemplo, dos arcos se
dicen paralelos si sus nodos iniciales y finales coinciden, pero se denominan
antiparalelos si el nodo inicial de uno es el final del otro y viceversa. Un
arco se dice que es un lazo si el nodo inicial y final es el mismo, es decir, un
lazo tiene la forma a = (i, i), para cierto i ∈ V . Del mismo modo, un grafo
dirigido se dice simple si no tiene lazos ni arcos paralelos.
12 CAPÍTULO 1. CONCEPTOS Y DEFINICIONES BÁSICAS

Para las nociones de vecindad es necesario precisar la dirección de los


arcos. Ası́ se define la vecindad antecesora con nodo final i ∈ V de la forma:

N− (i) := j ∈ V : (j, i) ∈ A ;

y la vecindad sucesora asociada al nodo i ∈ V de la siguiente manera:



N+ (i) := j ∈ V : (i, j) ∈ A .

Análogamente,
 al conjunto de arcos que llegan al nodo i se nota δ− (i) :=
(j, i) ∈ A y al conjunto de arcos salientes del nodo i como δ + (i) := (i, j) ∈
A . La cardinalidad de estos conjuntos define el grado entrante δ − (i) y el
grado saliente δ + (i) del nodo i ∈ V y el grado del nodo es δ − (i) + δ + (i) .
Un nodo con grado igual a cero es un nodo aislado. Si el grado de cada nodo
del grafo es igual a k, entonces el grafo es llamado k-regular.

Ejemplo 5 En el grafo D = (V, A) del ejemplo 4 tenemos que N+ (1) =


{2, 3} mientras que N− (1) = {3}, δ − (3) = {(1, 3)} es diferente a δ + (3) =
{(3, 1)}, y d− (2) = 2 contrasta con d+ (2) = 1.

Lema 4 La suma de grados entrantes es igual a la suma de los grados sa-


lientes.

Demostración: Sea D = (V, A) un grafo dirigido. Como cada arco tiene


un extremo inicial, entonces tenemos que la suma de los grados de llegada
es igual al número de arcos en el digrafo. Del mismo modo, como cada arco
tiene un único nodo final, la suma de los grados salientes coincide con el
número de arcos en el grafo dirigido. Ası́ podemos afirmar que
X X
|δ + (i)| = |δ − (i)|.
i∈V i∈V

Extendiendo el concepto anterior, para un grafo G = (V, E) y dos con-


juntos definimos X, Y ⊂ V con X ∩ Y = ∅, se define E(X, Y ) = {{x, y} ∈
E : x ∈ X, y ∈ Y } y δ(X) = E(X, V \ X). La vecindad de X es definida por
N(X) = {v ∈ V \ X : E(X, {v}) 6= ∅)}. Si G es un grafo dirigido se define
E + (X, Y ) = {(x, y) ∈ E : x ∈ X, y ∈ Y }, δ + (X) = E + (X, V \ X), δ − (X) =
δ + (V \ X) y δ(X) = δ + (X) ∪ δ − (X).

Lema 5 Sea G = (V, A) un grafo dirigido y dos conjuntos X, Y ⊆ V . En-


tonces:

|δ + (X)| + |δ + (Y )| = |δ + (X ∩ Y )| + |δ + (X ∪ Y )| + |E + (X, Y )| + |E + (Y, X)|


1.3. REPRESENTACIÓN COMPUTACIONAL DE GRAFOS 13

Demostración: Podemos definir el conjunto Z = V \ (X ∪ Y ). Podemos


notar que:
|δ + (X)| + |δ + (Y )| =|E + (X, Z)| + |E + (X, Y \ X)| + |E + (Y, Z)| + |E + (Y, X \ Y )|
=|E + (X, Z)| + |E + (Y, Z)| − |E + (X ∩ Y, Z)|
+ |E + (X ∩ Y, Z)| + |E + (X, Y \ X)| + |E + (Y, X \ Y )|
=|δ + (X ∪ Y )| + |E + (X ∩ Y, Z)| + |E + (X, Y \ X)| + |E + (Y, X \ Y )|
Completando los arcos salientes de X ∩ Y , se tiene:
|δ + (X)| + |δ + (Y )| = |δ + (X ∪ Y )| + |δ + (X ∩ Y )| + |E + (X, Y )| + |E + (Y, X)|.

Para la gran mayorı́a de problemas de interés, todo grafo no dirigido


puede ser representado por un grafo dirigido al sustituir cada arista por un
par de arcos anti-paralelos.

2 3 a d

1.3. Representación computacional de grafos


A continuación describimos tres formas de almacenar un grafo.

1.3.1. Matriz de adyacencia


Dado un grafo no dirigido y simple G = (V, E), se define su matriz de
adyacencia A ∈ {0, 1}n×n por
(
1 si los nodos i, j ∈ V son adyacentes,
ai,j =
0 en caso contrario.
Notemos que A es una matriz simétrica y que para todo i ∈ V
X X
ai,j = aj,i = |δ(i)|.
j∈V j∈V

Si D = (V, A) es un grafo dirigido y simple, su matriz de adyacencia


A ∈ M{0, 1}n×n se redefine como
(
1 si j ∈ V es sucesor de i ∈ V,
ai,j =
0 en caso contrario.
14 CAPÍTULO 1. CONCEPTOS Y DEFINICIONES BÁSICAS

En este caso la matriz ya no es simétrica, mientras que


X X
ai,j = |δ + (i)| y aj,i = |δ − (i)|.
j∈V j∈V

Finalmente, si el grafo no es simple, ai,j representa el número de aristas


o arcos con extremos i y j.

1 2 1 2

5 5

3 4 3 4

Figura 1.1: Representación computacional

Ejemplo 6 Considerando el grafo de la figura 1.1, tenemos las siguientes


representaciones matriciales:
   
0 1 1 0 0 0 1 1 0 0
1 0 0 1 1 0 0 0 1 1
   
1 0 0 1
A1 =  0 y 0
A2 =  0 0 1 0.
0 1 1 0 1 0 0 0 0 1
0 1 0 1 0 0 0 0 0 0

1.3.2. Matriz de incidencia


Dado un grafo no dirigido y simple G = (V, E), se define su matriz de
incidencia A ∈ {0, 1}n×m por
(
1 si la arista e ∈ E es incidente al nodo i ∈ V,
aie =
0 en caso contrario.
Es claro que A no es necesariamente cuadrada y para todo i ∈ V
X
aie = |δ(i)|.
e∈E

Si D = (V, A) es un grafo dirigido y simple, su matriz de incidencia


A ∈ {−1, 0, 1}n×m toma un tercer valor:

−1 si i ∈ V es extremo inicial de e ∈ A,

ai,e = 1 si i ∈ V es extremo final de e ∈ A,


0 en caso contrario.
1.3. REPRESENTACIÓN COMPUTACIONAL DE GRAFOS 15

A diferencia del caso no dirigido, la suma de las componentes de la fila que


representa al nodo i coincide con la diferencia entre los grados entrante y
saliente de i: X
aie = |δ − (i)| − |δ + (i)|.
e∈A
Finalmente, si el grafo D no es simple, podemos reemplazar la definición
de aie como el número de veces, por la dirección del arco, que el nodo i es
extremo de e.
Ejemplo 7 Para los grafos de la Figura 1.1, tenemos las siguientes repre-
sentaciones matriciales:
   
1 1 0 0 0 0 −1 −1 0 0 0 0
1 0 0 1 0 1
 
1
 0 0 −1 0 −1 
A1 = 0 1 1 0 0 0 y A2 =  0
  1 −1 0 0 0,
0 0 1 1 1 0 0 0 1 1 −1 0 
0 0 0 0 1 1 0 0 0 0 1 1
donde usamos la enumeración
1 7→ {1, 2}, 2 7→ {1, 3} 3 7→ {3, 4},
4 7→ {2, 4}, 5 7→ {4, 5} 6 7→ {2, 5}.

1.3.3. Listas de adyacencia


Dado un grafo G = (V, A), almacenamos para cada nodo i ∈ V una
lista que nos indique cuáles son sus vecinos. Son usualmente preferidas por-
que proveen una forma compacta de representar grafos dispersos, es decir,
|E| <<< |V |2 .
Esta forma de almacenamiento de un grafo consiste de un arreglo Adj
de |V | listas, una para cada nodo in V , que almacena los arcos adyacentes
a dicho nodo. La potencial desventaja es que no existe una forma rápida de
determinar si existe o encontrar un arco (u, v), ya que es necesario buscar el
nodo v en la lista Adj[u]. Esta desventaja puede ser resueltas con las matrices
anteriores pero usando potencialmente mayor memoria.
Ejemplo 8 Para los grafos del ejemplo 1.1, tenemos cinco listas. Para el
caso no dirigido:
L1 = {2, 3},
L2 = {1, 4, 5},
L3 = {1, 4},
L4 = {2, 3, 5},
L5 = {2, 4}.
16 CAPÍTULO 1. CONCEPTOS Y DEFINICIONES BÁSICAS

Para el caso dirigido vamos a almacenar la lista de sucesores

L1 = {2, 3},
L2 = {4, 5},
L3 = {4},
L4 = {5},
L5 = ∅.

1.3.4. Matrices totalmente unimodulares


Las matrices totalmente unimodulares son una herramienta muy impor-
tante en el estudio de los problemas de programación entera. Ası́, en la pre-
sente sección estamos interesados en el siguiente problema:
INSTANCIA: Una matriz A ∈ Z m×n y vectores b ∈ Z m , c ∈ Z n

TAREA: Encontrar un vector x ∈ Z n tal que Ax ≤ b y cT x es maximi-


zado.

Definición 7 Una matriz cuadrada es llamada unimodular si esta es entera


y tiene determinante +1, −1.

A partir de esta definición tenemos el siguiente resultado:


Teorema 1 La inversa de una matriz unimodular es unimodular
Demostración: Sea U una matriz unimodular. Ası́:

det(U) ∗ det(U −1 ) = det(UU −1 ) = 1

por lo que la inversa también es unimodular

Definición 8 Una matriz A es totalmente unimodular si cada subdetermi-


nante de A es 0, +1, −1.

En particular cada entrada de una matriz totalmente unimodular debe


ser {−1, 0, +1}. La principal consecuencia de este tipo de matrices esta dada
por el siguiente resultado:

Teorema 2 (Hoffman-Kruskal-1956) Una matriz A es totalmente unimodu-


lar si y solo si:
{x : Ax ≤ b, x ≥ 0}
es entero para todo entero b entero.
1.3. REPRESENTACIÓN COMPUTACIONAL DE GRAFOS 17

Demostración: Se define A ∈ Z m×n y P = {x : Ax ≤ b, x ≥ 0}. Suponga-


mos que A es totalmente unimodular, b algún vector entero y x un vértice
de P , es decir, se tiene que x es la solución del subsistema A′ x ≤ b′ de:
   
A b
x≤
−I 0

siendo A′ una matriz no singular. Dado que A es totalmente unimodular


|det(A′ )| = 1 se tiene x = (A′ )−1 b′ lo que es entero.
Por otro lado, supongamos que los vértices de P son enteros para cada
b entero. Sea A′ ∈ Z k×k alguna submatriz no singular de A con las prime-
ras k filas y columnas de A, donde |det(A′ )| = 1. Además, consideremos
otra submatriz B ∈ Z m×m de A conteniendo las primeras k y las últimas
m − k columnas de (A, I). Obviamente det(B) = det(A′ ). Para probar que

|det(B)| = 1, lo único que deberı́amos probar que B −1 es entero, ya que


det(B ∗ B −1 ) = 1. Sea i ∈ {1, . . . , m} y escogemos un vector y tal que se
construye el vector z = y + B −1 ei ≥ 0. Entonces tomamos b = Bz = By + ei
que es entero. Añadimos componentes ceros a z para obtener z ′ con:

(A, I)z ′ = Bz = b

Ahora construimos z ′′ con las primeras n componentes de z ′ y perteneciendo


a P . Además, n restricciones linealmente independientes son satisfechas con
igualdad, las primeras k y las últimas desigualdades de:
   
A ′′ b
z ≤
−I 0
18 CAPÍTULO 1. CONCEPTOS Y DEFINICIONES BÁSICAS

por lo que se tiene que z ′′ es un vértice de P , que por nuestra hipótesis


es entero. Pero entonces z ′ también debe ser entero, ya que sus primeras
n componentes son componentes de z ′′ y las últimas m componentes son
variables de holgura b − Az ′′ (A y b son enteros). Por tanto z es también
entero y B −1 ei = z − y es entero.
Corolario 1 (Veinott -Dantzig 1968) Una matriz entera A es totalmente
unimodular si y solo si para todo vector entero b y c se obtiene:
máx{cx : Ax ≤ b, x ≥ 0} = mı́n{yb : AT y ≥ c, y ≥ 0}
con vectores solución enteros(si son finitos)
Demostración: Usando el resultado anterior y usando el hecho que AT es
también totalmente unimodular.
Un criterio útil para determinar si una matriz es totalmente unimodular
es el siguiente:
Teorema 3 (Ghouila-Houri-1962) Una matriz A ∈ Z m×n es toalmente uni-
modular si y solo si para todo R ⊆ {1, . . . , m} existe una partición R =
R1 ∪ R2 tal que: X X
aij − aij ∈ {−1, 0, +1}
i∈R1 i∈R2

Las siguientes proposiciones son equivalentes:


A es TU
At es TU
[A, I] es TU (I es la matriz identidad)
[A, −I] es TU (I es la matriz identidad)
[A, −A] es TU
Teorema 4 La matriz de incidencia de un grafo no dirigido G = (V, E) es
totalmente unimodular si y solo si G es un grafo bipartito.
Demostración: Por el teorema 3 la matriz de incidencia de G es totalmente
unimodular si y solo si para algún X ⊆ V existe una partición X = A ∪ B tal
que E(G[A]) = E(G[B]) = ∅. Como G es bipartito, tal partición es posible.

Teorema 5 La matriz de incidencia de un grafo dirigido es totalmente uni-


modular
Demostración: Es suficiente tomar R1 = R y R2 = ∅ para algún R ⊆ V
1.4. CAMINOS Y CICLOS 19

1.4. Caminos y ciclos


Un camino es un grafo no vacı́o P = (V, E) de la forma;

V = {vi , . . . , vk } E = {{vi , vi+1 }, {vi+1 , vi+2 }, . . . , {vk−1, vk }}

donde los elementos de V son distintos. Los nodos vi y vk son unidos por el
camino P y son llamados nodos extremos y vi+1 , . . . , vk−1 los nodos internos
de P . El número de aristas en el camino es la longitud del mismo. A menudo
nos referiremos a un camino como una secuencia de nodos representada por
P = vi , vi+1 , . . . , vk o como una sucesión finita y alternada de nodos y aristas
P = vi , ei , vi+1 , ei+1 . . . , ek−1 , vk que va desde vi hasta vk . Para dos nodos v y
w se define dist(v, w) como la longitud más corta de v a w (vw-camino). Si
no existe un vw−camino diremos que w no es alcanzable desde v y se tiene
dist(v, w) = +∞. En el caso no dirigido se tiene dist(v, w) = dist(w, v),
mientras que en la versión dirigida dicha igualdad no siempre se tiene.
Si P = vi , vi+1 , . . . , vk es un camino de longitud mayor igual a 2, entonces
el grafo C = P ∪ {vi , vk } es un ciclo o circuito.

Lema 6 Todo grafo G con mı́n{δ(i) : i ∈ V } ≥ 2 contiene un camino de


longitud igual a mı́n{δ(i) : i ∈ V } y un ciclo de longitud al menos igual a
mı́n{δ(i) : i ∈ V } + 1

Demostración: Sea P = v0 , . . . , vk el camino más largo en G. Entonces

v0 v1 v2 v3 vk−1
vk

todos los vecinos de vk están en este camino ya que P es el camino más


largo. Por tanto, k ≥ |δ(vk )| ≥ mı́n{δ(i) : i ∈ V }, es decir, un camino
tiene longitud al menos mı́n{δ(i) : i ∈ V }. Si i < k y P es minimal con
{vi , vk } ∈ E(G), entonces C = P ∪ {vk , vi } es un ciclo de longitud al menos
mı́n{δ(i) : i ∈ V } + 1.
Al igual que en los caminos, los ciclos serán notados como secuencias de
nodos. Ası́, el ciclo anterior podrı́a ser escrito como C = vi , vi+1 , . . . , vk , vi
y la longitud del ciclo es el número de aristas. Un camino simple en G se
dice camino Hamiltoniano si visita todos los nodos del grafo exactamente
una sola vez, mientras que un circuito que visita exactamente una sola vez
a cada nodo del grafo es llamado un ciclo Hamiltoniano o un tour. Un grafo
que contiene ciclos Hamiltonianos es llamado grafo Hamiltoniano.
20 CAPÍTULO 1. CONCEPTOS Y DEFINICIONES BÁSICAS

1.5. Árboles, forestas y cortes


Un grafo G = (V, E) es llamado conexo si cualquier par de sus nodos
pueden ser unidos por un camino. Si el grafo no es conexo, entonces se llamará
disconexo. Un conjunto de nodos X ⊆ V es llamado conexo si el subgrafo
inducido por X es conexo. Un grafo dirigido es llamada fuertemente conexo
si y solo si existe un camino desde s a t y de t a s, para todo s, t ∈ V . Si el
grafo dirigido no es fuertemente conexo, pero el grafo no dirigido es conexo,
entonces se dice que es débilmente conexo.
Un grafo no dirigido sin ciclos o circuitos es llamado una foresta. Si la
foresta es conexa entonces es llamado un árbol. Un nodo de un árbol con
grado 1 es llamado una hoja del árbol. Una estrella es un árbol donde a lo
más un nodo no es una hoja.

Lema 7 Un grafo no dirigido G = (V, E) es conexo si y solo si δ(X) 6= ∅


para todo ∅ =
6 X⊂V

Demostración: Si existe un conjunto X ⊂ V con r ∈ X, v ∈ V \ X y


δ(X) = ∅, entonces no existe un camino que conecte los nodos r y v revelando
que G no es conexo. Por otro lado , si G no es conexo, entonces no existe un
camino de r a v. Si R es el conjunto de nodos alcanzables desde r, se tiene
que v 6∈ R y δ(R) = ∅

Teorema 6 Sea G = (V, E) un grafo no dirigido con n nodos. Las siguientes


afirmaciones son equivalentes:

a) G es un árbol.

b) G tiene n − 1 aristas y no tiene ciclos.

c) G tiene n − 1 aristas y es conexo.

d) G es un grafo conexo minimal(es decir, toda arista es un puente).

e) G es un grafo minimal con δ(X) 6= ∅ para todo ∅ =


6 X ⊂V.

f ) G contiene un único camino entre algún par de nodos.

Demostración:

a ⇒ f : Se tiene ya que si existen 2 caminos distintos con los mismos


puntos finales, entonces la unión genera un ciclo.

e ⇒ d: Resultado del lema 7.


1.5. ÁRBOLES, FORESTAS Y CORTES 21

f ⇒ b ⇒ c: Se sigue del hecho que para una foresta con n nodos, m


aristas y p componentes conexas se cumple que n = m + p. (inducción)

c ⇒ a: Sea G conexo con n − 1 aristas. Mientras existan circuitos en G,


es necesario destruirlos eliminando algún arista del ciclo. Supongamos
que hemos eliminado k aristas, entonces el grafo resultante G′ es aún
conexo y no tiene ciclos. Ası́, G′ tiene exactamente m = n−1−k aristas.
Por el resultado anterior se cumple que n = m + p = n − 1 − k + 1,
resultando que k = 0.

El teorema anterior implica que un grafo G es conexo si y solo si existe


un árbol sobre G.
Un corte en un grafo no dirigido G = (V, E) es un conjunto de aristas δ(X)
para algún ∅ =
6 X ⊂ V . Diremos que un conjunto de aristas F ⊆ E separan
dos nodos s y t si t es alcanzable desde s en G pero no en G′ = (V, E \ F ).
En un grafo dirigido, el conjunto de aristas δ + (X) con s ∈ X y t 6∈ X es
llamado un st-corte.

Definición 9 Un grafo G que no contiene ciclos se llama acı́clico.

Los vértices de un grafo acı́clico pueden ser ordenados de una forma es-
pecı́fica:

Definición 10 Sea D = (V, A) un grafo dirigido. Un ordenamiento topológi-


co de D es un orden de los nodos V = {v1 , . . . , vn } tal que para cada arco
(vi , vj ) ∈ A siempre se tiene i < j.

Relacionando la dos últimas definiciones, se tiene el resultado:

Lema 8 Un grafo dirigido D = (V, A) tiene un ordenamiento topológico si


y solo si D es acı́clico.

Demostración: Por un lado, notemos que si D contiene un ciclo entonces


el grafo no puede encontrar un ordenamiento topológico, ya que para un par
de nodos distintos i, j ∈ V se tendrı́a que i < j y luego j < i.
Por otro lado, si D es acı́clico, entonces existe i ∈ V tal que δ + (i) = ∅, es
decir, no existen arcos entrantes al nodo i. Sea i1 := i y podemos notar que
el grafo inducido por V \ {i1 } es también acı́clico. Esto implica que existe
otro nodo j ∈ V con grado entrante igual a cero y podemos definir i2 := j.
Repitiendo este proceso hasta que la secuencia contenga todos los nodos de
V , la secuencia i1 , . . . , in es un ordenamiento topológico sobre V .
22 CAPÍTULO 1. CONCEPTOS Y DEFINICIONES BÁSICAS

1.6. Conectividad
Conectividad es un concepto muy importante en la teorı́a de grafos y
su detección es una tarea fundamental. El siguiente algoritmo encuentra un
camino desde un nodo especı́fico s ∈ V a todos los nodos alcanzables en el
grafo. El algoritmo trabajo para grafos dirigidos y no dirigidos.
Dado un grafo G = (V, E) y un nodo fuente s ∈ V , al algoritmo BFS
(Breadth First Search) explora sistemáticamentelas aristas de G y descubre
todos los nodos alcanzables desde s con su respectiva distancia(número de
aristas). Para mantener el progreso del algoritmo, BFS colorea cada nodo de
blanco, gris o negro. Además, el predecesor de cada nodo u ∈ V es almace-
nado en π[u] y la distancia del nodo s a cada nodo u ∈ V es almacenada en
d[u]. Nodos blancos no han sido visitados mientras que grises o negros fueron
visitados en alguna iteración previa, es decir, los nodos inician pintados de
blanco, luego llegan a ser grises y finalmente son pintados de color negro. Si
(u, v) ∈ E y el nodo u es negro, entonces v es gris o negro, es decir, todos los
nodos adyacentes a un nodo negro previamente han sido visitados. Un nodo
gris puede tener algunos nodos adyacentes blancos y el conjunto de todos los
nodos grises representan la frontera entre los nodos visitados y no visitados.
El color es inicializado en blanco, la distancia es fijada en +∞ y la variable
que almacena el predecesor en NULL para todos los nodos v ∈ V \ {s}. Por
otro lado, dist[s] = 0 y π[s] = NULL. Además, el algoritmo usa una cola Q
para manejar el conjunto de nodos grises. BFS puede ser escrito de acuerdo
al algoritmo 1.

Proposición 1 El algoritmo BSF trabaja correctamente

Demostración: En alguna iteración, el par (R, T ) es un árbol o una foresta


con raı́z en s. Suponga que al final existe un nodo w ∈ V \R que es alcanzable
desde s. Sea P el camino desde s a w y sea {x, y} una arista en P con x ∈ R y
y 6∈ R. Dado que x ha sido incluido a R, este nodo también ha sido incluido en
Q en alguna iteración del algoritmo y el algoritmo no termina hasta remover
x de Q. Por este hecho, el nodo w deberı́a ser incluido en R o la arista {x, y}
no existe en el grafo.
Para los árboles obtenidos por el algoritmo BFS se tiene el siguiente
resultado importante.

Teorema 7 Un árbol obtenido por BFS contiene el camino más corto de s


a cada nodo alcanzable en el grafo.

Demostración: Aplicando el algoritmo BFS a la instancia (G, s), se puede


considerar lo siguiente: la condición inicial establece d(s) := 0 y cuando
1.6. CONECTIVIDAD 23

Algorithm 1 Algoritmo BFS(G,s)


1: ENTRADA:Un grafo G (dirigido o no dirigido) y un nodo s ∈ V .
2: SALIDA:El conjunto R con nodos alcanzables desde s y T ⊆ E tal que
(R, T ) es una foresta con raı́z en s.
3: for u ∈ V \ {s} do
4: color[u]=blanco, π[u] = NULL, d[u] = ∞
5: end for
6: color[s]=gris, d[s] = 0, π[s] = NULL.
7: Q = {s}, R = {s}, T = ∅.
8: while Q 6= ∅ do
9: Extraer u de Q y eliminarla de la cola
10: for (u, v) ∈ δ[u] do
11: if color[v] = blanco then
12: color[v]=gris, d[v] = d[u] + 1, π[v] = u
13: R = R ∪ {v}, T = T ∪ {(u, v)}
14: Q = Q ∪ {v}
15: end if
16: color[u]=negro
17: end for
18: end while

el color de cierto nodo v con {s, v} ∈ E se transforma a gris se impone


d(v) := d(s) + 1. Obviamente tenemos que d(v) = dist(s, v) para todo v ∈
R, en cualquier etapa del algoritmo. Además, si v es el vértice explorado
actualmente (nodos que se encuentran en Q), en este momento no hay ningún
vértice w ∈ R con d(w) > d(v) + 1 ya que los nodos son explorados en un
orden creciente respecto a la función de distancia d.
Supongamos que cuando termina el algoritmo hay un vértice w ∈ V con
distancia menor a dBF S (w). Ası́, sea P el sw−camino de longitud más corto
en G y sea e = {v, w} o e = {v, w} el último arco o arista en P . Tenemos
que dBF S (v) = dist(s, v) = dP (v) es la distancia más corta a v, pero e no
pertenece a T . Además, dBF S (w) > dP (w) = dist(s, v) + 1 = dBF S (v) + 1.
Esta desigualdad, combinada con la observación anterior, prueba que w no
pertenecı́a a R cuando se eliminó v de Q contradiciendo que e se encuentra
en G.
Si la estructura de datos usada para almacenar los nodos de color gris es
una pila, el algoritmo de exploración se denomina DFS (Depth First Search).
Conociendo la correctitud del algoritmo, es necesario determinar la com-
plejidad computacional del mismo. Ası́, usando la teorı́a de crecimiento de
funciones (Anexo) podemos encontrar el orden del algoritmo y se tiene el
24 CAPÍTULO 1. CONCEPTOS Y DEFINICIONES BÁSICAS

siguiente resultado.
Proposición 2 El algoritmo BFS puede ser implementado en tiempo O(m+
n)
Demostración: Asumimos que el grafo G = (V, E) es almacenado usando
listas de adyacencia. Ası́, para cada nodo x disponemos de una lista con
las aristas adyacentes (δ(x)) o arcos adyacentes (δ + (x)). En el proceso de
inicialización se actualiza los parámetros de cada uno de los nodos. En el
lazo principal, cuando el final de la lista es alcanzada, el nodo x es removido
de la cola Q y nunca más es insertado de nuevo. Por tanto, el tiempo de
ejecución es proporcional al número de nodos más el número de aristas, es
decir, O(n + m)

1.7. Grafos Eulerianos y Bipartitos


Euler trabajo en el problema de los puentes de Königsberg que menciona
lo siguiente:

⇒ ⇒

Dado el mapa de Königsberg con el rı́o Pregel dividiendo el plano en cuatro


regiones distintas y unidas a través de siete puentes. El problema consiste en
responder a la siguiente pregunta:
¿Es posible dar un paseo comenzando desde cualquiera de estas
regiones, pasando por todos los puentes, recorriendo sólo una
vez cada uno, y regresando al mismo punto de partida?
Euler definió un grafo y buscó un camino que contenga todos las aristas.
Como resultado obtuvo que el problema no tiene solución ya que el grafo
contiene más de dos nodos con grado impar. Esto nos permite presentar la
siguiente definición.
Definición 11 Un camino Euleriano en un grafo G es un camino que con-
tiene todas las aristas del grafo. Un grafo no dirigido se dice Euleriano si el
grado de cada nodo es par. Un digrafo es Euleriano si |δ − (v)| = |δ + (v)| para
cada v ∈ V
1.7. GRAFOS EULERIANOS Y BIPARTITOS 25

Aunque Euler no probó suficiencia, el siguiente resultado se le atribuye


Teorema 8 (Euler (1736), Hierholzer (1873)) Un grafo conexo tiene un
ciclo Euleriano si y solo si el grafo es de Euler
La suficiencia es probada por medio del algoritmo 2 que acepta como entrada
solo grafos conexos. Para digrafos se debe usar el conjunto de arcos δ + (x).

Algorithm 2 Algoritmo de Euler(G)


1: ENTRADA:Un grafo conexo G = (V, E) Euleriano
2: SALIDA:Un ciclo Euleriano W en G
3: Escoger v1 ∈ V arbitrariamente.
4: W = Euler(G, v1 )
5: return W

Algorithm 3 Euler(G,v)
1: W = {v1 } y x = v1
2: if δ(x) = ∅ then
3: Ir a 8
4: else
5: e = (x, y) ∈ δ(x)
6: end if
7: W = W, e, y, y se actualiza x = y, E = E \ {e}. Ir a 2.
8: Sea v1 , e1 , v2 , e2 , . . . , vk , ek , vk+1 la secuencia W .
9: for i := 1 hasta k do
10: Wi := Euler(G, vi )
11: end for
12: W := W1 , e1 , W2 , e2 , . . . , Wk , ek , vk+1 .
13: Retornar W

Teorema 9 El algoritmo de Euler trabaja correctamente.

Demostración: Por inducción sobre |E|. Iniciamos con el caso E = ∅, un


caso trivial. Cuando se ejecuta la lı́nea 8, vk+1 = x = v1 por las condiciones
de grado par de cada nodo, es decir, W es un ciclo. Sea G′ = G en ese
escenario. G′ continua siendo un grafo de Euler ya que el grado de cada nodo
en W se redujo en un número par. Ahora, para cada arista e ∈ E(G′ ) existe
un mı́nimo i ∈ {1, 2, . . . , k} tal que e se encuentra en la misma componente
conexa que vi en G′ . Entonces por hipótesis de inducción e pertenece al
camino Wi determinando el ciclo es Euleriano W .
26 CAPÍTULO 1. CONCEPTOS Y DEFINICIONES BÁSICAS

Finalmente necesitamos demostrar la polinomialidad del algoritmo ante-


rior.

Proposición 3 El tiempo de ejecución del algoritmo de Euler es O(n + m)

Demostración: Debido a cada arista es eliminada inmediatamente luego


de ser examinada el tiempo de ejecución del algoritmo es proporcional al
número de aristas del grafo. Además, sobre cada nodo del grafo, se ejecuta
recursivamente el algoritmo de Euler sobre los arcos sobrantes y se tiene que
el algoritmo es de orden O(n + m).
Una bipartición de un grafo no dirigido G es una partición del conjunto de
nodos V (G) = A ∪ B tal que A ∩ B = ∅ y los subgrafos inducidos son vacı́os.
Un grafo es llamado Bipartito si tiene una bipartición. Un grafo bipartito
simple G = (V, E) tiene una partición V = S ∪ T , y E = {{u, v} : u ∈ S, v ∈
T}

Proposición 4 (König [1916]) Dado un grafo G = (V, E). Se dice que


G es bipartito si y solo si no contiene circuitos de grado impar. Existe un
algoritmo que permite encontrar la bipartición o un ciclo de longitud impar.

Demostración: Supongamos que G es bipartito con V = S ∪ T y sea


C = v1 , e1 , v2 , e2 , . . . , vk , ek , vk+1 un circuito en G. Sin perdida de genera-
lidad asumimos que v1 ∈ S. Por el hecho anterior se tiene que v2 ∈ T ,
v3 ∈ S, . . ., por lo que concluimos que si vk+1 = v1 , k debe ser par.
Para proponer el algoritmo consideremos que G es un grafo conexo. Ini-
ciamos seleccionando un nodo arbitrario s ∈ V y aplicando BF S(G, s) para
obtener la distancia de s a v, para todo v ∈ V \ {s}. Sea H el árbol resultan-
te de aplicar el algoritmo BFS y definimos S = {v ∈ V : dist(s, v)es par} y
T = V \ S. Si existe una arista e = {x, y} en el grafo G(S) o G(T ), entonces
el camino de x a y en H junto con la arista e forman un circuito de longitud
impar en G. Si no existe tal arista, se tiene un grafo bipartito.

Anexo:
Crecimiento de funciones
Definición 12 Sea A un algoritmo el cual acepta entradas de un conjunto
X y sea una función f : X R+ . Si existe constantes α1 , α2 > 0 tal que el
algoritmo A con entrada x ∈ X termina sus operaciones en al menos α1 f (x)
y a lo más α2 f (x) pasos elementales, entonces se dice que A es de orden
Θ(f ).
1.7. GRAFOS EULERIANOS Y BIPARTITOS 27

Ası́ nosotros podemos denotar por Θ(g(n)) al conjunto de funciones:

Θ(f (n)) = {g(n) : ∃α1 , α2 , n0 tal que 0 ≤ α1 f (n) ≤ g(n) ≤ α2 f (n), ∀n ≥ n0 }

Aunque Θ(f ) es un conjunto, nosotros usaremos la notación g(n) = Θ(f )


e indica que la función es miembro de Θ(f ) o de orden Θ(f ).
Si solo necesitamos generar lı́mites superiores se usa la notación O(f (n))
definida como:

O(f (n)) = {g(n) : ∃α, n0 > 0 tal que 0 ≤ g(n) ≤ cf (n), ∀n ≥ n0 }

o lı́mites inferiores definidos con la notación Ω(f (n))

Ω(f (n)) = {g(n) : ∃c, n0 > 0 tal que 0 ≤ cf (n) ≤ g(n), ∀n ≥ n0 }

Resumiendo las definiciones anteriores podemos decir que: Dadas dos fun-
ciones f, g : X R+ decimos que:
f ∈ O(g(n))
f=O(g(n))
f es de orden O(g(n))
f ∈ Ω(g(n)) lo que es equivalente a g(n) = O(f (n))
f=Ω(g(n))

Definición 13 (Notación asintótica) Sean f y g dos funciones reales a


valores en R+ .
Notamos f (x) ∼ g(x) y decimos que f es asintótica a g si
f (x)
lı́m = 1.
x→∞ g(x)

Escribimos f (x) = O(g(x)) y decimos que f es un o grande de g si


existe C > 0 tal que para x suficientemente grande

f (x) ≤ Cg(x).

De forma equivalente
f (x)
lı́m sup < ∞.
x→∞ g(x)
28 CAPÍTULO 1. CONCEPTOS Y DEFINICIONES BÁSICAS

Notamos f (x) = Ω g(x) y decimos que f es omega de g si existe ε > 0
tal que para x suficientemente grande

f (x) ≥ εg(x).

Es decir g(x) = O f (x) o también

f (x)
lı́m inf > 0.
x→∞ g(x)

Veamos un ejemplo donde podamos interpretar los operadores asintóticos:

Ejemplo 9 Sean f (n) := 3n2 + n − 5 y g(n) := 3n2 . Tenemos que por la


regla de L’Hôpital

3n2 + n − 5 6n + 1
lı́m 2
= lı́m = 1.
3n 6n
Entonces f (n) ∼ g(n) y esto significa que f crece asintóticamente igual que
g.
Ahora definamos h(n) := n3 . En dicho caso

3n2 + n − 5 3 1 5
lı́m 3
= lı́m + 2 − 3 = 0,
n n n n
por lo tanto f (n) = O(n3 ). Esto significa que f crece asintóticamente no más
rápido que h.
Finalmente, si definimos l(n) = n, tenemos que f y l se igualan si y sólo
si
3n2 + n − 5 = n;
es decir, cuando 3n2 = 5, lo cual no sucede para ningún entero. Es más,
f (n) > l(n) para n > 1, lo cual indica que f (n) = Ω(n) y lo interpretamos
al decir que f crece asintóticamente más rápido que l.

La notación asintótica es útil para estimar el comportamiento de un algo-


ritmo dentro de un computador, esto se debe a que las operaciones de suma,
producto, exponenciación, y sus inversas, se pueden estimar en tiempo O(1).
De este modo, si realizamos la misma operación n veces, en total tendremos
un tiempo acotado por O(n). Este es el objetivo del análisis asintótico: inves-
tigar el comportamiento del número de operaciones que realiza un algoritmo
(el cual es proporcional al tiempo de cómputo) para instancias grandes de
problemas.
Capı́tulo 2

Árboles generadores de peso


mı́nimo

2.1. Introducción
El problema de árboles generadores de peso mı́nimo aparece en 2 artı́culos
de Otakar Boruvka en 1926 propuesto de la siguiente forma:

There are n points given in the plane (in the space) whose mutual dis-
tances are all different. We wish to join them by a net such that

1. Any two points are joined either directly or by means of some points,

2. The total length of the net would be the shortest possible.

It is evident that a solution of this problem could have some importance


in electricity power-line network design; hence I present the solution briefly
using an example. The reader with a deeper interest in the subject is referred
to the above quoted paper.

Hoy en dı́a, el problema de encontrar árboles en un grafo es un problema


simple pero muy importante en la optimización combinatoria que aparece en
algunos casos reales:

Consideremos una empresa que desea construir una red de transmisión


eléctrica de costo mı́nimo tal que todas las ciudades se encuentren co-
nectadas. Es natural modelar el problema como un grafo, donde los
nodos son las ciudades y las aristas corresponden a la red eléctrica que
conecta las diferentes ciudades. Si cada uno de estas aristas tienen un
costo que representa el costo de conexión, entonces se desea encontrar

29
30 CAPÍTULO 2. ÁRBOLES GENERADORES DE PESO MÍNIMO

un subgrafo en el que siempre exista un camino entre cualquier par de


nodos y su peso sea mı́nimo.

Una compañı́a obtiene el contrato para construir la red de conexión de


internet de las principales ciudades de un paı́s. El punto de conexión
se encuentra fuera del paı́s pero se conoce las distancias hacia las ciu-
dades fronterizas. El paı́s es muy montañoso, con un gran número de
rı́os y lagos, haciendo la construcción delicada desde el punto de vista
ambiental. Si se conoce las longitudes de cable que se deberı́a usar en-
tre las distintas ciudades del paı́s, determinar la red de costo mı́nimo
que permita conectar a todas las ciudades con el punto de conexión
principal.

2.2. Programación entera


Un subconjunto C ⊂ Rn es convexo si λx + (1 − λ)y ∈ C, ∀x, y ∈ C
y0 ≤ λ ≤ 1. La envolvente convexa de un conjunto X ⊆ Rn denotado por
conv(X)es el conjunto más pequeño que que contiene a X. Ası́,
k
nX k
X o
+
conv(X) = λi xi : k ≥ 1, x1 , . . . , xk ∈ X, λ1 , . . . , λk ∈ R , λi = 1
i=1 i=1

Un conjunto P de Rn es llamado un poliedro si existe una matriz A ∈


Rm×n y un vector b ∈ Rm tal que:

P = {x : Ax ≤ b}

Equivalentemente, P es un poliedro si y solo si es la intersección de un número


finito de subespacios afines. Alguna desigualdad cT x ≤ δ es llamada válida
para P si ct x ≤ δ se tiene para cada x ∈ P .
La programación lineal (LP) consiste en optimizar (maximizar o minimi-
zar) una función lineal sobre un poliedro:

máx{cT x : Ax ≤ b, x ≥ 0} o mı́n{cT x : Ax ≥ b, x ≥ 0}

El teorema de dualidad de la programación lineal menciona que:

Teorema 10 Sea A una matriz y b y c dos vectores, entonces:

máx{ct x : Ax ≤ b} = mı́n{y T b : y ≥ 0, y T A = cT }

Ası́, al menos uno de ellos es finito, entonces ambos lo son.


2.3. DEFINICIONES BÁSICAS 31

Para resolver LP tenemos varios métodos Ası́, el Método del Simplex


desarrollado por Dantzig(1951) que en la práctica funciona de forma eficien-
te, aunque se puedan construir instancias en las que se comporte en forma
polinomial. El primer algoritmo polinomial para este tipo de problemas fue
reportado por Khachiyan(1979) adaptando el método de la elipsoide usado
para resolver problemas no lineales, aunque el método es inaplicable en la
práctica, Kamarkar(1984) presento el método de punto interior que resuelve
problemas lineales en tiempo polinomial y además mencionaron que dispo-
nen de una implementación computacional que compite con el método del
Simplex.
Ahora que pasa si restringimos el conjunto se soluciones exclusivamente
a vectores enteros, es decir, vectores del tipo x ∈ Zn . Muchos problemas de
optimización pueden describirse como un problema de optimización lineal
sobre vectores enteros en algún poliedro P = {x : Ax ≤ b}. Este tipo de
problemas puedes ser escritos como:

máx{ct x : Ax ≤ b, x ∈ Zn } o mı́n{cT x : Ax ≥ b, x ∈ Zn }

Tales problemas son llamados problemas enteros(PE). Claramente la siguien-


te desigualdad se tiene:

máx{ct x : Ax ≤ b, x ∈ Zn } ≤ máx{ct x : Ax ≤ b, x ∈ Rn }

o en el sentido de minimización

min{cT x : Ax ≥ b, x ∈ Rn } ≤ min{cT x : Ax ≥ b, x ∈ Zn }

Y en la relación de dualidad generalmente se tendrá:

máx{cT x : Ax ≤ b, x ∈ Zn } ≤ min{y T b : y ≥ 0, y T A = c, y ∈ Zn }

Ningún algoritmo polinomial es conocido para resolver problema enteros en


general. De hecho la programación entera es un problema N P-completo,
dado que el problema SAT fácilmente puede ser modelado como un PE.

2.3. Definiciones básicas


Para modelar y resolver los problemas anteriores, introducimos la siguien-
te definición.

Definición 14 (Árbol generador) Sean G = (V, E) un grafo no dirigido


y H = (W, F ) un subgrafo. Se dice que H es un árbol generador si es un
árbol y W = V .
32 CAPÍTULO 2. ÁRBOLES GENERADORES DE PESO MÍNIMO

En la presente sección estamos interesados en resolver el siguiente problema:

ÁRBOL GENERADOR DE PESO MÍNIMO(MTS)

Instancia: Un grafo no dirigido con una función de costos sobre las


aristas c : E → R

Tarea: Encontrar un árbol generador en G de peso mı́nimo o decidir


que G no es conexo.

Usando programación lineal entera, el problema MTS puede ser formulado


de la siguiente forma:

X
mı́n ce xe
e∈E
s.a.r.
X
xe = n − 1
e∈E
X
xe ≤ |X| − 1, ∀∅ =
6 X ⊂V
e∈E(X)

xe ∈ {0, 1}

donde la variable xe = 1 si la arista e se encuentra en el árbol de expansión,


y xe = 0 caso contrario.
Dado que existen algoritmos combinatorios eficientes no es recomendable
resolver el problema usando Programación lineal. A pesar de la observación
anterior es interesante analizar el poliedro asociado al problema.

Teorema 11 Dado un grafo no dirigido G = (V, E), el poliedro:


n X X o
P = x ∈ [0, 1]|E| : xe = n − 1, xe ≤ |X| − 1, ∀ ∅ = 6 X⊂V
e∈E e∈E(X)

es entero. Sus vértices son exactamente el vector de incidencia del árbol ge-
nerador de G. P es llamado el poliedro del árbol generador de G.

Demostración: Sea T un árbol generador de G y sea x es vector de inci-


dencia de E(T ). Ya que T = (V, E(T )) es un grafo conexo sin ciclos, se tiene
que x ∈ P . Además, dado que x ∈ {0, 1}|E|, dicho punto debe ser un vértice
de P .
2.3. DEFINICIONES BÁSICAS 33

Por otro lado, sea x un vector entero de P .Entonces x es un vector in-


cidente de las aristas de algún subgrafo H con n − 1 aristas y sin ciclos.
Nuevamente, estas caracterı́sticas indica que H es un árbol generador.
Para completar la demostración debemos probar que P tiene vértices
enteros y lo podemos hacer verificando que tanto en modelo primal y dual
satisfacen las condiciones de holguras complementarias y las soluciones primal
y dual coinciden.
Para iniciar con el diseño de algoritmos eficientes para el problema MST,
debemos determinar las condiciones de optimalidad del problema. Ası́ se
presenta el siguiente resultado.

Teorema 12 Sea (G, c) una instancia del problema MTS, y sea T un árbol
generador de G. Entonces los siguientes enunciados son equivalentes:

a) T es óptimo.

b) Para todo e = {x, y} ∈ E(G) \ E(T ), no existen aristas en el camino


de x a y en T que tengan costo mayor a ce .

c) Para toda arista e ∈ E(T ), e es una arista de costo mı́nimo del corte
δ(V (C)), donde C es una componente conexa de E(T ) \ {e}.

Demostración: Consideramos los siguientes casos:

(a) → (b): Supongamos que el literal (b) es violado. Sea e = {x, y} ∈


E(G) \ E(T ) y sea f una arista en el camino de x a y en T tal que
c(f ) > c(e).Entonces el grafo con el conjunto de aristas E(T )∪{e}\{f }
es un árbol generador de menor costo.

(b)→ (c): Supongamos que el literal (c) es violado. Sea e ∈ E(T ) y C


una componente conexa de E(T ) \ {e}. Ya que (c) es violada, entonces
existe una arista f = {x, y} ∈ δ(V (C)) con c(f ) < c(e). Observe que el
camino de x ∈ V (C) a y ∈ V \ V (C) en el grafo T debe contener una
arista de δ(V (C)), pero la única arista en tal conjunto es e, revelando
que (b) es violada.

(c) → (a): Supongamos que T satisface (c), y sea T ∗ un árbol de genera-


dor óptimo con E(T ∗ ) ∩ E(T ) con el mayor número de aristas posible.
Si T = T ∗ se tiene el resultado. Ahora, supongamos que existe una
arista e = {x, y} ∈ E(T ) \ E(T ∗ ). Sea C una componente conexa de
E(T ) \ {e}. El grafo con aristas E(T ∗ ) ∪ {e} dispone de un ciclo D.
Dado que e ∈ E(D) ∩ δ(V (C)), al menos una arista más f 6= e en
D debe pertenecer a δ(V (C)). Observe que E(T ∗ ) ∪ {e} \ {f } es un
34 CAPÍTULO 2. ÁRBOLES GENERADORES DE PESO MÍNIMO

árbol generador. Como T ∗ es óptimo, c(e) ≥ c(f ). Por hipótesis sobre


T se tiene que c(f ) ≥ c(e). Por tanto concluimos que c(f ) = c(e) y
T ∗ ∪ {e} \ {f } es otro árbol generador, lo que es una contradicción ya
que este tiene una arista más en común con T .

Consideremos el siguiente problema que se encuentra directamente rela-


cionado al MST.
FORESTA DE PESO MÁXIMO (MWF)
Instancia: Un grafo no dirigido con una función de costos sobre las
aristas c : E → R.
Tarea: Encontrar una foresta en G de peso máximo.
Podemos afirmar que los problemas estudiados son equivalente generando
una transformación polinomial de una instancia del problema MST a una
instancia del MWF, es decir, necesitamos determinar si existen 2 funciones f
y g polinomiales, tal que f transforma una instancia x del problema MST a
una instancia f (x) del problema MWF, y g transforma una solución de f (x)
a una solución de x.
Proposición 5 El problema del árbol generador de peso mı́nimo y el proble-
ma de la foresta de peso máximo son equivalentes.
Demostración: Dado una instancia (G, c) del problema MWF, podemos
generar un grafo G′ sobre el mismo conjunto de nodos y transformando los
costos de la forma c′ (e) = −c(e), para todo e ∈ E y adherir un conjunto
mı́nimo de aristas F con pesos arbitrarios tal que (G′ = (V, E ∪ F ) sea
conexo. Entonces la instancia (G′ , c′ ) del problema MST es equivalente ya que
si eliminamos las aristas de F del árbol generador de peso mı́nimo, entonces
se obtiene la foresta de peso máximo en (G, c).
Dado una instancia (G, c) del problema MST, definimos c′ = K − c(e)
para toda arista e ∈ E, donde K = 1 + máxe∈E {c(e)}. Entonces la instancia
(G, c′ ) del problema MWF es equivalente ya que el grafo resultante es una
foresta conexa con n − 1 aristas.

2.4. Algoritmos
2.4.1. Algoritmo de Prim
Existen diversos algoritmos exactos para resolver el problema MST. A
continuación expondremos dos de ellos y luego analizaremos su eficiencia. El
2.4. ALGORITMOS 35

primer algoritmo que usaremos se basa en analizar los cortes de una lista de
nodos, seleccionando las aristas de menor costo.

Algorithm 4 Algoritmo de Prim


1: Entrada: G = (V, E) un grafo no dirigido y conexo.
2: Salida: T = (V, F ) un árbol generador de peso mı́nimo.
3: Inicialización: Seleccionar i ∈ V arbitrario y definir W := {i} y F := ∅

4: while W sea diferente de V do


5: Seleccionar e = {ij} ∈ δ(W ) con costo mı́nimo,
6: F = F ∪ {e}.
7: W = W ∪ {j}.
8: end while

Teorema 13 El algoritmo de Prim trabaja correctamente. Su tiempo de eje-


cución es O(n2 )

Demostración: La correctitud del algoritmo sigue del literal (c) del teorema
anterior que asegura la optimalidad del árbol generador si para toda arista
e ∈ E(T ), e es una arista de costo mı́nimo del corte δ(V (C)), donde C es
una componente conexa de E(T ) \ {e}.
Para determinar el tiempo de ejecución, tomamos la arista mas barata
de los arcos del corte δ(W ), es decir, seleccionamos la arista e = {v, u} tal
que v ∈ W , u ∈ V \ W y c(e) ≤ c(f ), con f ∈ δ(W ) \ {e}, los que serán
llamados los candidatos. La inicialización de los candidatos toma un tiempo
O(m) ya que en el peor de los casos hay que recorrer todas las aristas. Cada
selección de la arista más barata entre los candidatos toma un tiempo O(n).
La actualización del conjunto de candidatos puede ser realizado escaneando
las aristas incidentes a los vértice que fueron incluidos en el conjunto W , lo
que implica que toma un tiempo de orden O(n). Dado que la instrucción
while ejecuta n − 1 iteraciones, se tiene que el algoritmo es de orden O(n2 ).

A continuación aplicaremos este algoritmo a un grafo conexo.

Ejemplo 10 Sea G el grafo definido por la siguiente figura:


36 CAPÍTULO 2. ÁRBOLES GENERADORES DE PESO MÍNIMO

1 2
−5 11
3 6
2 8
10 5

7 5 5 7
−4
4
2
−3
8 9

Tenemos los siguientes pesos sobre las aristas:

Arista Peso Arista Peso


12 −5 35 10
13 2 57 −4
23 8 45 5
36 11 58 2
67 5 89 −3
24 7

Vamos a encontrar un árbol generador de peso mı́nimo en G. La idea


básica consiste en añadir, en cada paso, un nuevo nodo a un árbol previa-
mente construido. Este nuevo nodo se une al árbol anterior con la arista de
menor peso.
Seleccionamos un nodo inicial, por ejemplo 4, y definimos los conjuntos
W y F como
W = {4} F = ∅.
Seleccionamos la arista con el menor peso en el corte de 4. En este caso el
corte de 4 es
δ(4) = {42, 45}.
Gráficamente:
1

3 6
2

7 5 5 7

8 9

La arista de menor peso es 45. Procedemos a añadir 45 a F y 5 a W , de


modo que F = {45} y W = {4, 5}.
2.4. ALGORITMOS 37

Ahora el corte de W viene dado por


δ(W ) = δ{4, 5} = {42, 53, 58, 57}
y gráficamente viene representado por
1

3 6
2
10

7 5 7
−4
4
2
8 9

En este caso, tenemos que la arista con el menor peso es 57, con peso −4.
Ası́, modificamos a F y W :
F = {45, 57} W = {4, 5, 7}.
El nuevo corte de W corresponde a
δ(W ) = {42, 53, 58, 76},
de donde obtenemos la arista de costo mı́nimo 58 con costo 2 y
F = {45, 57, 58} W = {4, 5, 7, 8}.
Continuando con esta operación, la siguiente arista a añadirse será 89,
seguida de 76, 42 y 21; obtenemos
F = {45, 57, 58, 89, 76, 42, 21} W = {4, 5, 7, 8, 9, 6, 2, 1}.
Reordenando W en base al orden de los números naturales, tenemos que
W = {1, 2, 4, 5, 6, 7, 8, 9}, por lo tanto nos falta un nodo adicional. El corte
de W es
δ(W ) = {13, 53},
donde seleccionamos la arista 13. Por lo tanto
F = {45, 57, 58, 89, 76, 42, 21, 13} W = {1, . . . , 9}
y hemos obtenido el siguiente árbol generador de peso mı́nimo:
1 2
−5
3 6
2
5

7 5 5 7
−4
4
2
−3
8 9

el cual tiene peso


c(H) = 5 + (−4) + 2 + (−3) + 5 + 7 + (−5) + 2 = 9.
38 CAPÍTULO 2. ÁRBOLES GENERADORES DE PESO MÍNIMO

2.4.2. Algoritmo de Kruskal


Una forma de evitar el cálculo reiterativo de cortes es mediante el pre-
ordenamiento de las aristas de G. Esta es la idea central del siguiente algo-
ritmo:

Algorithm 5 Algoritmo de Kruskal


1: Entrada: G = (V, E) un grafo no dirigido y conexo.
2: Salida: H = (V, F ) un árbol generador de peso mı́nimo.
3: Inicialización: Definir F := ∅.
4: Reordenar las aristas de G de acuerdo a su costo:
e1  e2  . . .  em .
5: for ℓ ∈ {1, . . . , m}, do
6: if F ∪ {eℓ } no forma un ciclo, then
7: F = F ∪ {eℓ }.
8: end if
9: end for

Teorema 14 El algoritmo de Kruskal trabaja correctamente. El tiempo de


ejecución del algoritmo es O(mn).

Demostración: Es claro que el algoritmo construye un árbol generador de


peso mı́nimo. Esto también es garantizado por el enunciado (b) del teorema
de optimalidad que menciona que para todo e = {x, y} ∈ E(G) \ E(T ), no
existen aristas en el camino de x a y en T que tengan costo mayor a ce .
Para determinar el tiempo de ejecución, considere que las aristas pueden
ser ordenadas respecto a su costo en un tiempo O(m ∗ log(m)) y en cada
iteración la verificación de formación de ciclos tiene un tiempo O(n) al validar
si el nodo final de la arista que ingresa al árbol T se encuentra o no en V (T ).
Dado que el proceso se repite m veces se tiene que el tiempo de ejecución del
algoritmo es O(m ∗ log(m) + mn) = O(mn)

Ejemplo 11 Retomemos el grafo G definido en el ejercicio 10. En este caso


vamos a determinar el árbol generador de peso mı́nimo mediante el algoritmo
de Kruskal.
Lo primero que debemos hacer es ordenar las aristas de G por sus pesos y
de forma ascendente: La arista 12 tiene el menor peso, que es −5, le sigue 57
con un peso de −4. Siguiendo esta comparación obtienes el siguiente cuadro:
2.4. ALGORITMOS 39

Arista Peso Arista Peso 3 6


12 −5 45 5 2
57 −4 24 7
89 −3 23 8 5 7
58 2 35 10
4
13 2 36 11
67 5 8 9

Hemos acompañado al cuadro de un gráfico que contiene a todos los nodos


del grafo G. Finalmente, definimos F = ∅.
Empezamos seleccionando la arista de menor peso, que es 12, y que clara-
mente no forma ciclos. Ası́ F = {12}. Con esto podemos actualizar el cuadro
y añadir la arista al gráfico:

1
−5
Arista Peso Arista Peso 3 6
12 −5 45 5 2
57 −4 24 7
89 −3 23 8 5 7
58 2 35 10
4
13 2 36 11
67 5 8 9

Ahora tomaremos la siguiente arista que es 57. Notemos que el conjunto


F ∪ {57} = {12, 57} no forma ciclos, es más, genera un subgrafo no conexo.
De este modo F = {12, 57} y actualizamos el gráfico:
1
−5
Arista Peso Arista Peso 3 6
12 −5 45 5 2
57 −4 24 7
89 −3 23 8 5 7
−4
58 2 35 10
4
13 2 36 11
67 5 8 9

Una vez más: La siguiente arista a analizar es 89, la cual al unirse con
F no genera ciclos y F = {12, 57, 89}.
Prosiguiendo de esta forma con 58, 13, 67, 45 y 24, obtendremos que en
ningún caso se forman ciclos y
F = {12, 57, 89, 58, 13, 67, 45, 24};
40 CAPÍTULO 2. ÁRBOLES GENERADORES DE PESO MÍNIMO

con tabla y gráfico actualizados:


1 2
−5
Arista Peso Arista Peso 3 6
12 −5 45 5 2
5
57 −4 24 7
89 −3 23 8 7 5 5 7
−4
58 2 35 10
4
13 2 36 11 2
−3
67 5 8 9

Notemos que el algoritmo ya ha obtenido el mismo árbol generador de


peso mı́nimo que en el ejemplo 10; sin embargo, todavı́a no ha terminado
pues hay tres aristas por analizar.
La siguiente arista será 23. En este caso, el conjunto

F ∪ {23} = {12, 57, 89, 58, 13, 67, 45, 24, 23}

presenta un ciclo, puesto que podemos trazar el sendero P1 : 1 2 3 2 1 , el cual


es simple y cerrado, es un ciclo. Por ende, no puedes incluir esta arista en H.
Es más, a partir de este momento, las aristas 35 y 36 también generan ciclos
al unirse con F mediante los senderos P2 : 1 2 4 5 3 1 y P3 : 1 3 6 7 5 4 3 2 1 .
Concluimos que el grafo H del ejemplo 10 es nuevamente un árbol gene-
rador de peso mı́nimo en G y su costo es

c(H) = (−5) + (−4) + (−3) + 2 + 2 + 5 + 5 + 7 = 9.

2.5. Arborescencias de peso mı́nimo


Es posible definir la extensión de los problemas MWF y el MST sobre
grafos dirigidos. Para ello necesitamos introducir algunas definiciones adicio-
nales.
Sea D = (V, A) un grafo dirigido. Se dice que el dı́grafo D es conexo
si el subyacente grafo no dirigido es conexo. El dı́grafo D es una ramifica-
ción(branching) si la versión no dirigida es una foresta y cada vértice v tiene
a lo más una arista entrante. Una ramificación conexa es una arborescencia.
Por los resultados conocidos sobre árboles, una arborescencia con n nodos
tiene n − 1 arcos y por tanto tiene exactamente un nodo r con δ − (r) = ∅ y se
lo denomina el nodo raı́z. En este caso lo conoceremos como una arborecencia
con raı́z en r. Además, denominamos hojas a los nodos v ∈ V con δ + (v) = ∅.

Teorema 15 Sea D = (V, A) un garfo dirigido con n nodos. Los siguientes


literales son equivalentes.
2.5. ARBORESCENCIAS DE PESO MÍNIMO 41

a) D es una arborescencia con raı́z en r.

b) D es una ramificación con n − 1 arcos y δ − (r) = ∅

c) D tiene n − 1 arcos y todo nodo es alcanzable desde r.

d) Todo nodo es alcanzable desde r, pero eliminando algún arco se pierde


esta propiedad.

e) D es un grafo dirigido minimal con δ + (X) 6= ∅, para todo X ⊂ V y


r ∈ X.

f ) δ − (r) = ∅ y existe un único camino dirigido a v, para todo v ∈ V \ {r}.

g) δ − (r) = ∅, |δ − (v)| = 1, para todo v ∈ V \ {r} y D no contiene ciclos.

Demostración:

Los resultados de a) → b) y de c) → d) son consecuencia directa de los


resultados sobre árboles no dirigidos.

b) → c) : Tenemos que |δ − (v)| = 1, para todo v ∈ V \ {r}. Entonces


para algún v existe un camino desde r ya que siempre existe un arco
entrante a dicho nodo hasta alcanzar r.

d) → e) : Resulta del resultado sobre grafos no dirigidos

e) → f ) : Debido a que D es minimal se tiene que δ − (r) = ∅. Supon-


gamos que existen 2 caminos P y Q desde r hacia algún nodo v ∈ V .
Sea a el último arco de P que no pertenece a Q , entonces luego de
eliminar a el nodo v es alcanzable desde r. Este argumento contradice
que D es minimal.

f ) → g) → a) : es trivial.

Los problema en los que se centra la presente sección puede definirse de


la siguiente manera:

PROBLEMA DE RAMIFICACIÓN DE PESO MÁXIMO.

Instancia: Un grafo dirigido D con una función de costos sobre los


arcos c : A → R

Tarea: Encontrar una ramificación de peso máximo en D.


42 CAPÍTULO 2. ÁRBOLES GENERADORES DE PESO MÍNIMO

PROBLEMA DE LA ARBORESCENCIA DE PESO MÍNIMO.

Instancia: Un grafo dirigido D con una función de costos sobre los


arcos c : A → R

Tarea: Encontrar una arborescencia generadora de peso mı́nimo en D


o decidir que no existe

PROBLEMA DE LA ARBORESCENCIA CON RAÍZ DE PESO MÍNI-


MO.

Instancia: Un grafo dirigido D, un nodo r ∈ V y una función de costos


sobre las aristas c : A → R

Tarea: Encontrar una arborescencia generadora de peso mı́nimo en D


con raı́z en r o decidir que no existe

Para entender estos problemas, podemos presentar que los tres son equi-
valentes. Este resultado es una extensión de la versión no dirigida.

Proposición 6 Los 3 problemas anteriores son equivalentes

Demostración: Dada una instancia (D, c) del problema de la arborescencia


P
de peso mı́nimo, se define un costo c′ (e) = K −c(e) donde K = 2 e∈E |c(e)|.
Entonces la instancia con los nuevos costos del problema de la ramificación de
peso máximo es equivalente ya que para cualquier par de ramificaciones R1
y R2 con |E(R1 )| > |E(R2 )| se tiene que c′ (R1 ) > c′ (R2 ) y las ramificaciones
con n − 1 nodos son arborescencias.
Por otro lado, dado una instancia (D, c) del problema de ramificación de
peso máximo, se puede construir una instancia D ′ = (V ∪ {r}, A ∪ {(r, v) :
v ∈ V }). Definimos los costos c′ (e) = −c(e) para todo arco en D y c′ (e) = 0
para los arcos auxiliares que salen desde r. Entonces la instancia (D ′ , r, c′ )
del problema de la arborescencia de peso mı́nimo con raı́z en r es equivalente.
Finalmente, dado una instancia del problema de arborescencia de peso
mı́nimo, podemos construir una arborescencia de peso mı́nimo al definir D ′ =
(V ∪{s}, A∪{(s, r)} bajo los mismos costos de los arcos originales y c((s, r)) =
0.
Podemos reportar los siguientes resultados:

Proposición 7 Sea D = (V, A) un grafo dirigido con |δ − (v)| ≤ 1 para todo


nodo v ∈ V . Entonces D contiene un ciclo si y solo si el subyacente grafo no
dirigido contiene un ciclo.
2.5. ARBORESCENCIAS DE PESO MÍNIMO 43

Demostración: El resultado es directo ya que sı́ existe un ciclo en la versión


no dirigida se genera un ciclo dirigido en R por el hecho de que se tiene
siempre un arco entrante a los nodos del ciclo.
Ahora consideremos un grafo dirigido D = (V, A) y una función de costos
sobre los arcos c : A → R+ . Se estamos centrados en el problema de ramifica-
ción de peso máximo, entonces se pueden ignorar los arcos con costo negativo
dado que dichos arcos no aparecerán en la solución óptima. Ası́, la primera
idea para construir un algoritmo de solución puede aparecer al tomar el me-
jor arco entrante a cada nodo. Esto puede producir que en el grafo resultante
aparezcan ciclos y dado que en una ramificación esto no puede producirse,
se deberı́a eliminar un arco de dicho ciclo.
El siguiente resultado justifica lo anterior para el problema de ramificación
de peso máximo.

Proposición 8 Sea D = (V, A) un grafo dirigido y R0 un subgrafo de peso


máximo de D con |δ − (v)| ≤ 1 para todo nodo v ∈ V (R0 ). Entonces existe
una ramificación óptima R de D tal que cada circuito C en R0 , se tiene
|A(C) \ A(R)| = 1.

Demostración: Sea R una ramificación óptima de D usando el mayor núme-


ro de arcos de R0 . Sea C algún ciclo en R0 y definimos A(C) \ A(R) =
{(a1 , b1 ), . . . , (ak , bk )} con k ≥ 2 y los nodos a1 , b1 , a2 , b2 , . . . , ak , bk se en-
cuentran en este orden en C.

Podemos ver que en R existe un camino de bi a bi−1 para cada i = 1, . . . , k


(b0 = bk ). Sin embargo, esto es una contradicción ya que estos caminos (b2 a
b1 , de b3 a b2 , . . . ) forman una progresión cerrada de arcos en R y por tanto
se identifica que existen ciclos y una ramificación no puede tener este tipo de
estructuras.
Sea i ∈ {1, 2, . . . , k}. Consideremos el grado R′ = (V ′ , A′ ) con V ′ = V y
A′ = {(x, y) ∈ A(R) : y 6= bi } ∪ {(ai , bi )}. Se tiene que R′ no puede ser una
44 CAPÍTULO 2. ÁRBOLES GENERADORES DE PESO MÍNIMO

ramificación dado que este serı́a el óptimo y contiene más arcos de R0 que de
R. Por la forma de R0 implica que R′ contiene un ciclo, es decir, R contiene
un camino P de bi al nodo ai . Dado que k ≥ 2, P no esta completamente en
C y sea a el último arco de P que no pertenece a C. Obviamente a = (x, bi−1 )
para algún x ya que P contiene un camino de bi a bi−1 .
Usando la idea del resultado anterior, Edmonds propuso el siguiente al-
goritmo:

Algorithm 6 Algoritmo de Edmonds’


1: Entrada: Un grafo dirigido G = (V, E) y costos c : E → R+
2: Salida: Una ramificación de peso máximo R de G.
3: Inicialización: Definir i = 0, G0 = G, c0 = c.

4: Sea Ri el subgrafo de peso máximo de Gi con |δRi (v)| ≤ 1, para todo
v ∈ V (Ri ).
5: if Ri no contiene ciclos then
6: R = Ri ir a (16).
7: end if
8: Construir (Gi+1 , ci+1 ) de (Gi , ci ) realizando lo siguiente para cada ciclo
C de Ri :
9: Contraer C a un nodo vc en Gi+1
10: for cada arco e = (z, y) ∈ E(Gi ) con z 6∈ V (C), y ∈ V (C) do
11: Sea z ′ = vC ′ si z pertenece al ciclo C ′ de Bi o z ′ = z en otro caso.
12: Sea e′ = (z ′ , vC ) y Ψ(e′ ) = e
13: ci+1 (e′ ) = ci (e) − ci (α(e, C)) + ci (eC ), donde α(e, C) = (x, y) ∈ E(C)
y eC es el arco más barato de C.
14: end for
15: i = i + 1 y volver a (4)
16: Si i = 0, entonces parar.
17: for cada circuito C de Ri do
18: if existe un arco e′ = (z, vC ) ∈ E(R) then
19: E(R) = (E(R) \ {e′ }) ∪ Ψ(e′ ) ∪ (E(C) \ {α(Ψ(e′ ), C)})
20: else
21: E(R) = E(R) ∪ (E(R) \ {eC })
22: end if
23: end for
24: V (R) = V (Gi ), i = i − 1 y volver a (16)

Para el caso del problema de arborescencias de peso mı́nimo, podemos


visualizar el funcionamiento del algoritmo en el siguiente ejemplo. Se dispone
del siguiente grafo.
2.5. ARBORESCENCIAS DE PESO MÍNIMO 45

Seleccionamos el subgrafo de peso mı́nimo con |δR−i (v)| ≤ 1, para todo


v ∈ V (Ri ), y se obtiene:

Se puede identificar el ciclo C y su contracción en el nodo vC .

Sobre el grafo resultante, nuevamente identificamos el subgrafo de peso


mı́nimo:
46 CAPÍTULO 2. ÁRBOLES GENERADORES DE PESO MÍNIMO

Identificamos el ciclo C y contraemos dicho ciclo en el nodo vC :

En el siguiente paso ya no existen ciclos y se procede a extraer los ciclos,


eliminar los arcos sobrantes y se obtiene la arborecencia de peso mı́nimo.
Capı́tulo 3

Problema de caminos más


cortos

3.1. introducción
Supongamos que deseamos determinar la ruta más corta desde su casa
hasta la EPN incluyendo todas las calles y avenidas en la ciudad, es decir,
determinar las calles y las intersecciones (esquinas) que se debe seguir para
llegar al destino. Para lograr este objetivo, podrı́amos asociar un grafo con
la red vial de la ciudad, donde las intersecciones puedes ser representados
por nodos, las calles y avenidas por arcos (dirigidos) y los tiempos de viaje
sobre cada calle como el costo de los arcos. Entonces buscamos encontrar un
camino dirigido sobre el grafo desde un nodo origen hasta un destino tal que
el costo sea el mı́nimo posible.
En comparación con otros problemas de optimización combinatoria, como
el árbol generador de costo mı́nimo, el problema de asignación o el problema
de transporte, el problema del camino más corto inició relativamente tarde.
Esto podrı́a deberse al hecho de que el problema es elemental y relativa-
mente fácil. Sin embargo se pueden encontrar algunos trabajos relacionados
a la búsqueda de caminos (en laberintos) desde 1873 (Wiener [1873], Lucas
[1882]), donde se puede encontrar las bases de la búsqueda en profundidad.
El estudio de problemas asociados a la búsqueda de caminos tomaron
fuerza a inicios de la década de 1950 en el contexto de la ruta alternativa,
es decir, encontrar un segundo camino más corto si el primero se encuentra
bloqueado. Esto apareció debido al enrutamiento de llamadas telefónicas, ya
que en ese momento se automatizaron las llamadas de larga distancia en los
EE. UU. y se debı́a encontrar automáticamente rutas alternativas para las
llamadas telefónicas a través de la red telefónica. Citando a Jacobitti [1955]:

47
48 CAPÍTULO 3. PROBLEMA DE CAMINOS MÁS CORTOS

”When a telephone customer makes a long-distance call, the major pro-


blem facing the operator is how to get the call to its destination. In some
cases, each toll operator has two main routes by which the call can be started
towards this destination. The first-choice route, of course, is the most direct
route. If this is busy, the second choice is made, followed by other available
choices at the operator’s discretion. When telephone operators are concerned
with such a call, they can exercise choice between alternate routes. But when
operator or customer toll dialing is considered, the choice of routes has to
be left to a machine. Since the “intelligence” of a machine is limited to pre-
viously “programmed” operations, the choice of routes has to be decided upon,
and incorporated in, an automatic alternate routing arrangement.”
Además, podemos mencionar algunos trabajos importantes y que serán
estudiados en la presente sección:

1959 E.W. Dijkstra, A note on two problems in connexion with graphs, Nu-
merische Mathematik 1 (1959) 269–271.

1958 R. Bellman, On a routing problem, Quarterly of Applied Mathematics


16 (1958) 87–90.

1956 L.R. Ford, Jr, Network Flow Theory, Paper P-923, The RAND Corpo-
ration, Santa Monica, California, [August 14], 1956.

1955 E. Jacobitti, Automatic alternate routing in the 4A crossbar system,


Bell Laboratories Record 33 (1955) 141–145.

1882 É. Lucas, Récréations mathématiques, deuxième édition, Gauthier- Vi-


llars, Paris, 1882–1883.

1873 Chr. Wiener, Ueber eine Aufgabe aus der Geometria situs, Mathema-
tische Annalen 6 (1873) 29–30.

Formalmente el problema puede ser definido:

[SPP]: Problema de caminos más cortos


Sean D = (V, A) un grafo dirigido, c : A ⇒ R una función de costos
sobre los arcos, s ∈ V un nodo origen y t ∈ V un nodo destino. La
tarea consiste en encontrar un camino desde s hacia t cuyo costo sea el
menor posible.
3.2. FORMULACIÓN LINEAL ENTERA 49

3.2. Formulación lineal entera


El problema puede ser formulado usando programación lineal entera de
la siguiente forma: Usamos variables asociadas a cada uno de los arcos del
grafo (
1, si el arco a ∈ A se encuentra en el camino
xa =
0, caso contrario
y parámetros sobre los nodos que indican si es un nodo origen, destino o
nodo intermedio del camino.

−1, si v = s

bv = 0, si v ∈ V \ {s, t}


1, si v = t

Ası́, el modelo de programación lineal puede ser formulado:


X
mı́n c(a)xa
a∈A
s.a.r.
X X
xa − xa = bv , ∀v ∈ V
a∈δ+ (v) a∈δ− (v)

xa ∈ {0, 1}, ∀a ∈ A.

Al igual que en el caso de árboles generadores de peso mı́nimo, no es


recomendable usar el modelo entero ya que existen algoritmos polinomiales
eficientes para su solución.
El problema no es fácil de resolver si nosotros permitimos pesos arbitra-
rios. Por ejemplo, si todos los costos son -1, entonces el camino de s a t de
peso 1 − |V | es precisamente un camino Hamiltoniano de s a t.

3.3. Algoritmos
El problema más sencillo de resolver resulta al limitamos a dı́grafos con
pesos no negativos o al menos excluyan ciclos de peso negativo.

Definición 15 Sea G = (V, E) un grafo (dirigido o no dirigido) con costos


c : E → R. Los costos c se llaman conservativos si no existen ciclos de peso
total negativo.
50 CAPÍTULO 3. PROBLEMA DE CAMINOS MÁS CORTOS

Definición 16 Para alguna función de costos c : E → R y algún camino


P = v0 , a1 , v1 , a2 , . . . , am , vm , el costo total del camino P es definido por:
X
c(P ) = c(a)
a∈P

La distancia de s a t se denota por dist(s, t) y es la menor distancia entre este


par de puntos. Si dicho camino no existe, entonces se asigna dist(s, t) = ∞.

Todos los algoritmos de caminos más cortos están basados en el siguiente


resultado:
Proposición 9 Sea D un digrafo con costos conservativos y sean 2 nodos
s, w ∈ V . Si e = (v, w) es el arco final de algún camino más costo P de s a
w, entonces P \ {e} es el camino más corto de s a v.
Demostración: Supongamos que Q es un camino de s a v satisfaciendo que
c(Q) < C(P \ {e}). Si Q no visita a w, entonces c(Q) + c(e) < c(P ) y Q ∪ {e}
el camino más corto de s a w. Si w esta en Q, el camino Q ∪ {e} de s a w
tiene un ciclo y su costo será c(Q ∪ {e}) = c(Q) + c(e). Si notamos Qwv como
el camino de w a v usando arcos de Q, entonces Qwv ∪ {e} es un ciclo. Ya
que c es conservativo (c(Qwv ∪ {e}) > 0) se tiene que :
c(Q ∪ {e}) = c(Q) + c(e) − c(Qwv ∪ {e}) < c(P ) − c(Qwv ∪ {e}) ≤ c(P ),
En ambos casos tenemos una contradicción al asumir que P es un camino
más corto de s a w
El mismo resultado es aplicable para grafos no dirigidos con costos no
negativos y grafos acı́clicos con cualquier tipo de costos. La proposición an-
terior es la razón porque los siguientes algoritmos calculan el camino más
corto del nodo origen a todos los nodos del grafo.

3.3.1. Dijkstra
A continuación presentamos el primer algoritmo para este problema:

ALGORITMO DE DIJKSTRA
Entrada: Un grafo dirigido D = (V, A) con costos c : A → R+ y un
nodo s ∈ V .
El camino más corto de s a todos los nodos v ∈ V . Más precisamente,
el algoritmo obtiene (c(v), π(v)), ∀v ∈ V , donde c(v) es el costo del
camino más corto de s a v junto con los arcos (π(v), v). Si c(v) = ∞
implica que v no es alcanzable desde s y π(v) no es definido.
3.3. ALGORITMOS 51

Note que si los costos sobre los arcos son iguales a 1, el SPP es resulto usando
el Algoritmo de exploración. Usando esta referencia, podemos extender BFS
y construir un algoritmo que permita resolver el problema SPP. Ası́, reem-
plazando la verificación del color del nodo por una condición de comparación
de costos podemos encontrar un primer algoritmo genérico. Ası́, usando la
notación anterior se tiene el Algoritmo 7.

Algorithm 7 Camino más corto(G, c, s, t)


for u ∈ V \ {s} do
π[u] = NULL.
d[u] = ∞
end for
d[s] = 0, π[s] = NULL
Q = {s}
while Q 6= ∅ do
Extraer u de Q y eliminarla de la cola
for (u, v) ∈ Adj[u] do
if d[v] > d[u] + c(u, v) then
d[v] = d[u] + c(u, v)
π[v] = u
Q = Q ∪ {v}
end if
end for
end while

Ya que el algoritmo anterior esta basado en el BFS, un nodo puede ingre-


sar varias veces a la cola Q. Esto implica que si se selecciona un mal camino
inicial, el algoritmo puede identificar el mismo camino varias veces ralenti-
zando el comportamiento del mismo. Para eliminar este problema, Dijkstra
usa las ideas del algoritmo de Prim para el MST y sus pasos son establecidos
de acuerdo al Algoritmo .

Teorema 16 El algoritmo de Dijkstra trabaja correctamente y su tiempo de


ejecución es O(n2 )

Demostración: La correctitud del algoritmo es presentada. Trivialmente,


d(v) ≥ dist(s, v) para todo v ∈ V a través de las iteraciones. Probaremos
que en cualquier iteración d(v) = dist(s, v) para cada v ∈ V \ R.
En el inicio del algoritmo es trivial. Considere alguna iteración en (5).
Supongamos que d(u) > dist(s, u). Sea s = v0 , v1 , . . . , vk = u el camino más
corto de s a u y sea i el ı́ndice más pequeño con vi ∈ R. Entonces se tiene
52 CAPÍTULO 3. PROBLEMA DE CAMINOS MÁS CORTOS

Algorithm 8 Algoritmo de Dijkstra


1: d(s) = 0, d(v) := ∞, ∀v ∈ V \ {s}.
2: R = ∅.
3: Encontrar v ∈ V \ R tal que d(v) = mı́nw∈V \R d(w)
4: R = R ∪ {v}.
5: for w ∈ V \ R tal que (v, w) ∈ A do
6: if d(w) > d(v) + c((v, w)) then
7: d(w) = d(v) + c((v, w)) y π(w) := v.
8: end if
9: end for
10: if R 6= V (G) then
11: Ir a (3).
12: end if

que d(vi ) = d(s, vi ). En efecto, si i = 0, entonces se tiene d(s) = d(vi ) =


dist(s, s) = 0. Si i > 0, entonces como vi ∈ V \ R:

d(vi ) ≤ d(vi−1 ) + c(vi−1 , vi ) = dist(s, vi−1 ) + c(vi−1 , vi ) = dist(s, vi )

Esto implica que d(vi ) ≤ dist(s, vi ) ≤ dist(s, u) < d(u), contradiciendo la


elección de u.
El tiempo de ejecución es obvio, ya que se ejecutan n iteraciones y cada
iteración toma un tiempo O(n)
Consideremos el siguiente ejemplo con:

6
1 3
0 -1

5s 4 3 2 5

1 5
2 4
1

Sobre cada nodo v ∈ V almacenaremos los pares (d(v), π)


(∞,-1) (∞,-1) (0,s) (∞,-1)
6 6
1 3 1 3
0 -1 (∞,-1) (0,-1) 0 -1
(0,-1)
5s 4 5 5s 4 5 (∞,-1)
3 2 3 2

1 5 1 5
2 4 2 4
1 1
(∞,-1) (∞,-1) (1,s) (∞,-1)
3.3. ALGORITMOS 53
(0,s) (6,1) (0,s) (4,2)
6 6
1 3 1 3
0 -1 (∞,-1) (0,-1) 0 -1
(0,-1)
5s 4 5 5s 4 5 (∞,-1)
3 2 3 2

1 5 1 5
2 4 2 4
1 1
(1,s) (∞,-1) (1,s) (2,2)

(0,s) (2,2) (0,s) (4,2)


6 6
1 3 1 3
0 -1 (7,4) (0,-1) 0 -1
(0,-1)
5s 4 5 5s 4 5 (5,3)
3 2 3 2

1 5 1 5
2 4 2 4
1 1
(1,s) (2,2) (1,s) (2,2)

3.3.2. Algoritmo de Ford


Potenciales
Definición 17 (Potencial) Un potencial es una función y ∈ RV que satis-
face las siguientes propiedades:

1. Potencial nulo en el nodo raı́z:

ys = 0.

2. Diferencia de potencial entre extremos de un arco:

ci,j ≥ yj − yi ,

para todo (i, j) ∈ A.

Los potenciales serán de utilidad para construir caminos más cortos en


base a caminos ya conocidos.

Lema 9 Sea v ∈ V y P un camino desde s hasta v, y y ∈ RV un potencial


en D, entonces
c(P ) ≥ yv .
54 CAPÍTULO 3. PROBLEMA DE CAMINOS MÁS CORTOS

Demostración: Supongamos que P es de la forma


P : v0 a0 v1 . . . ak vk .
Luego, por la propiedad del potencial tenemos que
k
X ℓ
X
c(P ) = caℓ ≥ yvℓ − yvℓ−1 = yvk − yv0 ,
ℓ=1 k=1

pero P va desde s hasta v, entonces v0 = s y vk = v, por lo tanto


c(P ) ≥ yv − ys = yv .

Aquı́ es importante la pregunta ¿siempre existe un potencial? La respuesta


es negativa.
Ejemplo 12 Consideremos la siguiente red:

2
-3

5s -1

-2
3

Podemos intentar construir un potencial en esta red. Comencemos con ys =


0, luego requerimos que
−3 = cs2 ≥ y2 − y0 = y2 − 1 = c3s ≥ ys − y3 = −y3 .
Ası́ tenemos que y2 − y3 ≤ −3 − 1 = −4; es decir y3 − y2 ≥ 4, pero
−1 = c23 ≥ y3 − y2 ,
lo cual no es posible.
Concluimos que si un grafo contiene un ciclo dirigido de costo negativo,
entonces no es posible que exista un potencial. En adelante supondremos
que no existen ciclos de esta clase, es decir, se asume que los costos son
conservativos.
Usando la idea de potencial podemos construir caminos más cortos en D.
Notar que la red que contiene un camino de s hacia cualquier nodo forman
una arborescencia sobre D. Por otro lado, no todos las arborescencias en D
serán una solución factible del SPP, pues necesitamos un árbol generador
dirigido con raı́z en s y con caminos orientados hacia V \ s.
3.3. ALGORITMOS 55

Teorema 17 Sean D = (V, A) un grafo dirigido, s ∈ V un nodo raı́z y


c ∈ R|A| una función de costos. Entonces existe una ramificación con raı́z en
s que tiene los caminos más cortos desde s hacia los demás nodos alcanzables
del grafo.

Demostración: Sea W el conjunto de nodos comunicados con s, es decir,


si t ∈ W , entonces existe un camino entre s y t. Definimos B ⊆ A como el
conjunto de arcos más pequeño que contenga los caminos más cortos entre s
y los nodos de W . Además, supongamos que existe un nodo v ∈ W con grado
entrante 2, es decir, existen dos arcos en B que llegan al nodo v. En dicho
caso, uno de estos arcos puede ser eliminado, lo cual contradice la definición
de B. De igual manera, no hay arcos en B que ingresen a s. Por lo tanto,
(s ∪ W, B) es una foresta de caminos más cortos con raı́z en s.
En la anterior demostración, notemos que bajo la hipótesis de que D es un
grafo conexo tenemos que W = V . Por otro lado, si D es no conexo, entonces
no hay caminos entre s y V \ W a los cuales podemos asignar un costo de
+∞. Finalmente mencionamos que toda ramificación puede ser representada
|V |
mediante una función de predecesores π ∈ V ∪ {−1} .
Usando las ideas expuestas, podemos presentar el Algoritmo de Ford (Al-
goritmo 9) que se puede resumir de la siguiente forma: Mientras y no sea
un potencial, encontrar un arco que no cumpla la propiedad y corregirlo. El
criterio de parada viene dado por el Lema 9.

Algorithm 9 F-SP: Ford


1: Entrada: D = (V, A) un grafo dirigido, c ∈ RA una función de costos
sobre los arcos y s ∈ V un nodo raı́z.
2: πi = −1, para todo i ∈ V
3: yi = ∞ para todo i ∈ V \ {s}
4: ys = 0.
5: while exista un arco (i, j) ∈ A tal que cij < yj − yi , do
6: yj = yi + cij ,
7: πj = i.
8: end while

Ejemplo 13 Usar el algoritmo de Ford para encontrar una arborescencia


de caminos más cortos con raı́z en s para el grafo dirigido presentado más
adelante.
Comenzamos definiendo el candidato a potencial y y el indicador de pre-
decesores p:
56 CAPÍTULO 3. PROBLEMA DE CAMINOS MÁS CORTOS

Nodo i s 1 2 3 4 5
Potencial yi 0 ∞ ∞ ∞ ∞ ∞
Predecesor pi −1 −1 −1 −1 −1 −1

Arco Costo
(s, 1) 0
6 (s, 2) 1
1 3
0 -1 (1, 2) 4
(1, 3) 6
5s 4 3 2 5
(2, 3) 3
1 5
(2, 4) 1
2 4 (3, 5) −1
1
(4, 3) 2
(4, 5) 5

Tenemos que ∞ − ∞ es un término indefinido, por lo tanto los únicos


arcos donde podemos verificar la condición de potencial son (s, 1) y (s, 2),
donde
cs,1 < ∞ = y1 − ys cs,2 < ∞ = y2 − ys .
Ası́, corregimos y1 = 0 y y2 = 1 y modificamos los predecesores p1 = s y
p2 = s. Resumimos estos avances en la siguiente tabla:

i s 1 2 3 4 5
yi 0 0 1 ∞ ∞ ∞
pi −1 s s −1 −1 −1

Continuamos, donde podemos verificar que (1, 2) verifica la condición de


potencial. Por otro lado, (1, 3), (2, 3) y (2, 4) no verifican la condición de
potencial:

y3 = 0 + 6 p3 = 1,
y3 = 1 + 3 p3 = 2,
y4 = 1 + 1 p4 = 2.

En dicho caso tenemos que

i s 1 2 3 4 5
yi 0 0 1 4 2 ∞
pi −1 s s 4 2 −1
3.3. ALGORITMOS 57

Notemos que con el segundo cambio sobre 3, el arco (1, 3) sı́ satisface la
condición de potencial. Luego, como (4, 3) sı́ satisface la condición de poten-
cial, basta verificar (3, 5) y (4, 5). Si iniciamos corrigiendo (3, 5), tenemos
que y5 = 3 y p5 = 3, de donde (4, 5) ya satisface la condición de potencial:

i s 1 2 3 4 5
yi 0 0 1 4 2 3
pi −1 s s 4 2 3

Ya no existen arcos que no satisfagan la condición de potencial, por lo


tanto concluimos que y es un potencial y p nos indica las arborescencia de
caminos más cortos en el grafo D. Gráficamente:

1 3
0 -1

5s 3 5

1
2 4
1

Ahora analizaremos la validez del Algoritmo de Ford.

Lema 10 Se cumple lo siguiente durante cada iteración del Algoritmo F-SP,


para cada nodo v ∈ V :
1. Si yv 6= ∞, entonces yv es el costo de un camino elemental desde s
hasta v, y

2. si πv 6= −1, entonces π define un camino entre s e v de costo a lo más


yv .

Demostración: Sea yvl el valor del potencial del nodo v en la iteración l


y conocemos que yvl 6= ∞. Supongamos que el camino P hasta el nodo v
no es simple, entonces existe un ciclo v0 , v1 , . . . , vk = v0 y en las iteraciones
l1 , l2 , . . . , lk se tiene que:

yvlii = yvli−1
i−1
+ c(vi−1 ,vi ) 1≤i≤k
con un costo del camino resultante igual a:
X X
c(a) = (yvlii − yvli−1
i−1
) = (yvlkk − yvl00 )
a∈P (vi−1 ,vi )∈P
58 CAPÍTULO 3. PROBLEMA DE CAMINOS MÁS CORTOS

Pero yvk es menor en la iteración lk ya que el camino P tiene un ciclo de


costo negativo, lo que es una contradicción y el primer literal es probado.
La demostración del punto dos sigue el mismo argumento. Si πv no define
un camino de s a v, entonces existe un ciclo C = v0 , v1 , . . . , vk = v0 y πvi =
vi−1 para todo 1 ≤ i ≤ k el costo c(C) ≤ 0 dado que c((πv , v)) ≤ yv − yπv
siempre se tiene. Considerando la más reciente asignación del predecesor
sobre el camino, se tiene que yπ(v) es el más pequeño produciendo que la
desigualdad sea estricta y se tenga un ciclo de costo negativo, es decir, un
contradicción.
Finalmente es necesario presentar que un camino simple de s a v tiene
un costo yv . Sea P = v0 , e1 , v1 , . . . , ek , vk con s = v0 , vk = v y π(vi ) = vi−1
P 1 ≤ i ≤ k, entonces se tiene que el costo debe ser menor igual que
para
a∈P (yvi − yvi−1 ) = yv , que por la proposición anterior, se tiene el resultado.

En base a este lema tenemos que en efecto el algoritmo construye la


foresta, pero desconocemos sı́ culmina en un número finito de iteraciones.

Proposición 10 El algoritmo F-SP encuentra una ramificación con el ca-


mino más cortos en un número finito de iteraciones.

Demostración: En cada iteración, ocurre solo una de las siguientes opciones


para cada v ∈ V :

yv pasa de +∞ a un valor finito o

yv es sustituido por un valor estrictamente menor.

Por el lema anterior, los valores finitos de yv son costos de caminos elementales
desde s hasta v. Como el costo de estos caminos es finito, y como los valores
de yv se corrigen posiblemente en cada iteración en la dirección del óptimo,
tenemos que el número de correcciones posible es finito; ası́ el algoritmo
termina. Además, al terminar y es un potencial y p es la ramificación con el
caminos más cortos de s hasta v, cuyos costos coinciden con yv , puesto que
ya no se puede corregir nuevamente a y.
Por el lema 9, el algoritmo obtiene una ramificación que contiene todos
los caminos más cortos desde s hacia los demás nodos alcanzables en D.
A continuación veremos que el Algoritmo de Ford, pese a que puede ser
modificado para detectar circuitos de costo negativo, es ineficiente en térmi-
nos computacionales.

Lema 11 Si para cada arco a ∈ A el valor de ca es un entero en {−k. . . . , k}


con k ∈ N fijo, entonces el Algoritmo F-SP termina en O(kn2 ) operaciones.
3.3. ALGORITMOS 59

Demostración: Sean i ∈ V \s y k = máx{|ca | : a ∈ A}. Tenemos que, por el


Lema 10, los valores que toma yi durante la ejecución del algoritmo coinciden
siempre con el costo de un camino elemental desde s hasta i. Luego, como
un camino elemental tiene máximo n − 1 nodos, se sigue que
−(n − 1)k ≤ yi ≤ (n − 1)k.
Por lo tanto, el valor de yi puede corregirse máximo 2(n − 1)k veces. Ası́,
como en cada iteración se corrige el valor de yi para algún nodo, el algoritmo
termina en a lo mas 2(n − 1)nk iteraciones, por lo tanto es de orden O(n2 k).

3.3.3. Algortimo de Bellman-Ford


Consideremos un algoritmo para el caso general:

Algorithm 10 BF: Bellman – Ford


1: Entrada: D = (V, A) un grafo dirigido, c ∈ RA una función de costos
sobre los arcos y s ∈ V un nodo raı́z.
V
2: Inicialización: Definir π ∈ V ∪ −1 como un indicador de predeceso-
res.
3: πi = −1 para todo i ∈ V
4: yi = ∞ para i ∈ V .
5: ys = 0
6: for ℓ = 1 hasta n − 1, do
7: for (i, j) ∈ A, do
8: if cij < yj − yi , then
9: yj = yi + cij ,
10: πj = i.
11: end if
12: end for
13: end for
14: if existe (i, j) ∈ A tal que cij < yj − yi , then
15: Terminar: el grafo tiene un circuito de costo negativo.
16: end if

Aprovechamos que el tiempo de inspección por arco es constante para


concluir que
Lema 12 El Algoritmo BF resuelve el problema de caminos más cortos en
una iteración ℓ < n o determina que existen circuitos de costo negativo en
D en O(mn) iteraciones.
60 CAPÍTULO 3. PROBLEMA DE CAMINOS MÁS CORTOS

Notemos que esta variación del Algoritmo de Ford nos permite resolver
el problema [SPP] de forma eficiente cuando se presentan valores negativos
en c y se identifica si existen ciclos de costo negativo.
Ahora, si G contiene ciclos de costo negativo, no existe un algoritmo po-
linomial conocido para resolverlo ya que el problema es NP-Completo. El
principal problema se presenta que el criterio de optimalidad no se satisfa-
ce para costos generales. En vista de este hecho es importante preguntarse
como detectar ciclos de costo negativo. El siguiente resultado de Edmonds y
Karp(1972) es muy útil.
Definición 18 Sea D = (V, A) un grafo dirigido con costos c : A → R y sea
γ : V → R. Entonces, para algún arco (x, y) ∈ A se define el costo reducido
de (x, y) con respecto a γ por cγ ((x, y)) = c(x, y) + γ(x) − γ(y). Si cγ (a) ≥ 0
para todo a ∈ A, entonces γ es llamado un potencial factible.
Teorema 18 Sea D = (V, A) un grafo dirigido con costos c : A → R. Existe
un potencial factible de (D, c) si y solo si c es conservativo.
Demostración: Si γ es un potencial factible, para cada circuito C se tiene:
X X X
0≤ cγ (e) = c(e) + γ(x) − γ(y) = c(e),
e∈E[C] e=(x,y)∈E[C] e∈E[C]

ya que c es conservativo.
Por otro lado, si c es conservativo, entonces podemos añadir un nuevo
nodo s y arcos (s, v) con costo igual a cero para todo v ∈ V . Aplicamos el
Algoritmo 10 sobre esta nueva instancia y obtenemos los valores yv para cada
v ∈ V . Dado que yv es el valor del camino más costo entre s y v, entonces se
tiene que yw ≤ yv + c(v, w) para todo arco (v, w) ∈ A. Por tanto, la función
y es un potencial factible.
Corolario 2 Dado un grafo dirigido D = (V, A) con costos sobre los arcos
c : A → R. Podemos encontrar en O(mn) si existe un potencial factible o si
existe un ciclo de costo negativo.

3.4. Grafos acı́clicos


Supongamos que los nodos de D pueden ser ordenados de izquierda a
derecha, es decir, que exista un ordenamiento en V :
i1 ≺ i2 ≺ . . . ≺ in ,
de modo que {ik , iℓ } ∈ A implica que k ≤ ℓ. Diremos que ≺ es un ordena-
miento topológico.
3.4. GRAFOS ACÍCLICOS 61

Ejemplo 14 Consideremos el siguiente grafo dirigido:

51 3 5

4 6

La relación ≺ dada por



≺:= (i, j) ∈ V × V : 1 ≺ 2 ≺ 4 ≺ 5 ≺ 3 ≺ 6

define un ordenamiento topológico sobre el grafo de la figura, puesto que


(1,2) 1≺2
(1,3) 1≺3
(1,4) 1≺4
(2,3) 2≺3
(2,5) ⇒ 2≺5
(3,6) 3≺6
(4,3) 4≺3
(4,6) 4≺6
(5,6) 5≺6

Si ordenamos a V de izquierda a derecha en base a ≺, tendremos la siguiente


representación del grafo dirigido D:

51 2 4 5 3 6

Lema 13 Un grafo dirigido D admite un ordenamiento topológico si y sólo


si es acı́clico.

Demostración: Por un lado, notemos que si D contiene un ciclo entonces


dicho ciclo no puede ordenarse topológicamente, lo cual es obvio dado que
para un par de nodos i y j distintos se tendrı́a que i ≺ j y luego j ≺ i, lo
cual no es posible pues i 6= j.
Por otro lado, si D es acı́clico, entonces existe i ∈ V tal que δ + (i) = ∅;
es decir, no existen arcos entrantes a i. Sea i0 := i, notemos que el grafo
inducido D \ i0 es acı́clico, por lo tanto existe j ∈ V con grado entrante nulo
62 CAPÍTULO 3. PROBLEMA DE CAMINOS MÁS CORTOS

y definimos i1 := j. Repetimos este procedimiento hasta que la secuencia


(ik )k≤n contenga a todos los nodos en V . El orden de esta secuencia anterior
es un ordenamiento topológico sobre V , ya que hemos eliminado la posibilidad
de que hayan arcos entrantes que impidan la comparación entre arcos.
Notemos que la demostración anterior nos proporciona un algoritmo para
determinar si existe un ordenamiento topológico en O(m) iteraciones:

Algorithm 11 OT: Ordenamiento topológico


1: Entrada:
 D = (V, A) un grafo dirigido.

2: W := i ∈ V : |δ (i)| = 0 ,i.e.,no existen arcos entrantes a i.
3: U := ∅ que almacenará un orden en V .
4: while W sea diferente del vacı́o, do
5: Seleccionar i ∈ W ,
6: W = W \ i,
7: U = (U, i),
8: for (i, j) ∈ A, do
9: Eliminar (i, j).
10: if |δ − (j)| = 0, then
11: W = W ∪ j.
12: end if
13: end for
14: end while
15: if existe (i, j) que no fue eliminado, then
16: Error: el grafo tiene un circuito.
17: end if

Para clarificar el orden del algoritmo anterior, añadimos s al grafo D y los


arcos (s, i) para todo i ∈ V . Como |δ − (s)| = 0, el algoritmo comienza sobre
s y luego todos los nodos que se pueden alcanzar desde s serán examinados.
En el caso del grafo D, al ser acı́clico, todos sus arcos son alcanzados desde
s, y si existe un camino desde un nodo i y hasta otro j, pero no desde j hacia
i, entonces j será procesado antes de que i lo sea.
Usando la no existencia de ciclos, se puede pensar en un algoritmo que
permite reducir el tiempo de cómputo de una arborescencia que contenga los
caminos más cortos. Ası́, el Algoritmo 12 permite encontrar el caminos más
cortos desde un nodo inicial a cualquier nodo alcanzable.
Lema 14 El Algoritmo BF-OT resuelve el problema de caminos más cortos
para grafos acı́clicos en O(m) operaciones.
Demostración: Sea S la sucesión de los arcos corregidos por el algoritmo.
Sea P un camino elemental desde s hasta i ∈ V , donde s = ı́nf ≺ V . Basta
3.4. GRAFOS ACÍCLICOS 63

Algorithm 12 BF-OT: Caminos más cortos en grafos acı́clicos


1: Entrada: D = (V, A) un grafo dirigido y acı́clico.
2: Salida: Camino más corto de s a v ∈ V \ {s}
3: πi = −1 para todo i ∈ V ;
4: yi = ∞ para i ∈ V salvo ys = 0.
5: Construir un ordenamiento topológico i1 ≺ . . . ≺ in para D usando
BF-OT.
6: for ℓ = 1 hasta n − 1, do
7: for (iℓ , ik ) ∈ δ − (iℓ ), do
8: if yik > yiℓ + c(iℓ , ik ), then
9: yik = yiℓ + c(iℓ , ik ),
10: pik = iℓ .
11: end if
12: end for
13: end for

notar que a(P ) está incrustada en S. El orden se hereda de OT puesto que


el ordenamiento topológico indica que la arborescencia será determinada en
una iteración del algoritmo de Bellman – Ford.

Ejemplo 15 Encontremos la arborescencia de caminos más cortos con raı́z


s del siguiente grafo dirigido:
3
1 4
3 1 8
4
s
5 -5 3 6
5
2 0 -10
2 5
7

Si utilizarı́amos el Algoritmo de Bellman – Ford, tendrı́amos que realizar


aproximadamente un múltiplo de 77 operaciones para determinar la arbores-
cencia con raı́z en s. Veamos si es posible determinar un re-ordenamiento
topológico que nos permita reducir la búsqueda. Por ende, aplicamos el Algo-
ritmo OT, donde tendremos que

U= s 2 5 6 3 1 4 ,

mientras que todos los arcos en D son eliminados. Ası́, la secuencia ordenada
U determina ≺, por lo tanto hemos encontrado un ordenamiento topológico
y procedemos a utilizar BF-OT:
64 CAPÍTULO 3. PROBLEMA DE CAMINOS MÁS CORTOS

3
4
0
s5 2 5 6 3 1 4
2 7 -10 5 1 3

-5 8

Nodo i s 2 5 6 3 1 4
Potencial yi 0 ∞ ∞ ∞ ∞ ∞ ∞
Predecesor pi −1 −1 −1 −1 −1 −1 −1

Iteraciones
1. Buscamos (i, j) ∈ δ + (s) que verifique yj > yi + ci,j , lo cual ocurre
tanto con (s, 1) como con (s, 2), por lo que asignamos y1 = ys + cs,1 ,
y2 = ys + cs,2 , p1 = s y p2 = s.

i s 2 5 6 3 1 4
yi 0 2 ∞ ∞ ∞ 3 ∞
pi −1 s −1 −1 −1 s −1

2. Continuamos con δ + (2) = (2, 1), (2, 3), (2, 5) , donde obtendremos
que y1 = −3, y3 = 2, y5 = 9, y además p1 = 2, p3 = 2, p5 = 2.

i s 2 5 6 3 1 4
yi 0 2 9 ∞ 2 −3 ∞
pi −1 s 2 −1 2 2 −1

3. Es el turno de δ + (5) = (5, 6) , donde claramente y6 = −1 y p6 = 5.

4. Procedemos a analizar δ + (6) = (6, 3), (6, 4) , donde basta modificar
4:

i s 2 5 6 3 1 4
yi 0 2 9 −1 2 −3 7
pi −1 s 2 5 2 2 6

5. Ahora es turno de δ + (3) = (3, 1), (3, 4) , donde nuevamente modifi-
camos 4.

6. Finalmente, δ + (1) = (1, 4) y se modifica 4 por última vez.
3.5. CAMINO MÁS CORTO ENTRE TODOS LOS NODOS 65

i s 2 5 6 3 1 4
yi 0 2 9 −1 2 −3 0
pi −1 s 2 5 2 2 1

Notemos que de este modo el camino más corto entre s y 4 está dado por
la secuencia
2 −5 3
s−→ 2 −→ 1 −→ 4.

3.5. Camino más corto entre todos los nodos


Supongamos que deseamos encontrar el camino más corto para todos los
pares de nodos s − t del grafo dirigido.
Un grafo dirigido D = (V, A) con costos conservativos c : A → R
Encontrar números lst y nodos πst para todo s, t ∈ V con s 6= t, tal que
lst es la longitud del camino más corto de s at, y (πst , t) es el arco final
de tal camino, si existe.
En efecto, podrı́amos pensar que la solución del problema puede obtenerse al
correr n veces el algoritmo de Bellman-Ford, una vez para cada nodo inicial s,
generando un tiempo de ejecución de orden O(n2 m). Sin embargo es posible
mejorarlo bajo el siguiente resultado.

Teorema 19 El problema de todos los caminos más cortos puede ser resuelto
en O(mn + n2 log(n)).

Demostración: Primero podemos calcular el potencial sobre cada nodo


yv , ∀v ∈ V , lo cual es posible en un tiempo O(mn) por el algoritmo de
Bellman-Ford. Entonces para cada s ∈ V calculamos el camino más corto
desde s usando el costo reducido cγ . Para algún nodo t el camino resultante
es también el camino más corto usando c). Dado que los costos cγ son no
negativos, podemos usar el algoritmo de Dijkstra en cada paso. Por tanto el
tiempo de ejecución del algoritmo es O(mn + n(m + n ∗ log(n)))
Para terminar la sección podemos presentar un algoritmo sencillo que per-
mite resolver el presente problema denominado Floyd-Walshall, cuya princi-
pal ventaja es su sencillez. Asumiremos que los nodos son nombrados 1, 2, . . . , n
Un digrafo D = (V, A) con V = {1, 2, . . . , n} y costos conservativos
c:A→R
Matrices L y Π, donde lij es la longitud del camino más corto desde i
a j, y (πij , j) es el arco final de tal camino(si existe).
66 CAPÍTULO 3. PROBLEMA DE CAMINOS MÁS CORTOS

Algorithm 13 Floyd-Warshall
1: lij = c(ij), ∀(i, j) ∈ A
2: lij = +∞, ∀(i, j) 6∈ A con i 6= j
3: lii = 0, ∀i ∈ V
4: πij = i, ∀i, j ∈ V
5: for j = 1 hasta n do
6: for i = 1 hasta n con i 6= j do
7: for k = 1 hasta n con k 6= j do
8: if lik > lij + ljk then
9: lik = lij + ljk
10: πik = πjk
11: end if
12: end for
13: end for
14: end for

Teorema 20 El orden del algoritmo de Floyd-Warshall es O(n3 ).

Hallar el camino mı́nimo desde el vértice 3 hasta 4 en el grafo con la siguiente


matriz de distancias:
 
0 3 5 1 ∞ ∞
 3 0 ∞ ∞ 9 ∞
 
5 ∞ 0 7 7 1
D=
 
 1 ∞ 7 0 ∞ 4 

 ∞ 9 7 ∞ 0 ∞
∞ ∞ 1 4 ∞ 0

Aplicamos el algoritmo de Floyd-Warshall.


A partir del presente grafo se aplica el algoritmo anterior y se tiene las
siguientes matrices:
Inicialización:
   
0 3 5 1 ∞ ∞ 1 1 1 1 1 1
 3 0 ∞ ∞ 9 ∞  2 2 2 2 2 2 
   
5 ∞ 0 7 7 1  3 3 3 3 3 3 
L=
  Π= 
 1 ∞ 7 0 ∞ 4 


 4 4 4 4 4 4 

∞ 9 7 ∞ 0 ∞  5 5 5 5 5 5 
∞ ∞ 1 4 ∞ 0 6 6 6 6 6 6
3.5. CAMINO MÁS CORTO ENTRE TODOS LOS NODOS 67

Aplicando los pasos del algoritmo anterior, se tiene:


   
0 3 5 1 12 5 0 1 1 1 2 4
 3 0 8 4 9 8  1 0 1 1 2 4 
   
 5 8 0 5 7 1  1 1 0 6 3 3 
L=  1 4 5 0 12 4
 Π = 
 1

   1 6 0 3 4 

12 9 7 12 0 8  2 2 3 3 0 3 
5 8 1 4 8 0 4 4 3 4 3 0
68 CAPÍTULO 3. PROBLEMA DE CAMINOS MÁS CORTOS
Capı́tulo 4

Problema de flujo máximo

Podemos mencionar algunas referencias importantes:

4.1. introducción
1954 L. R Ford, D. R Fulkerson, Maximal Flow through a Network, Re-
search Memorandum RM-1400, The RAND Corporation, Santa Moni-
ca, California, [19 November] 1954 [published in Canadian Journal of
Mathematics 8 (1956) 399–404].

1955 L. R Ford, Jr., D. R Fulkerson, A Simple Algorithm for Finding Maxi-


mal Network Flows and an Application to the Hitchcock Problem, Re-
search Memorandum RM-1604, The RAND Corporation, Santa Moni-
ca, California, [29 December] 1955 [published in Canadian Journal of
Mathematics 9 (1957) 210–218].

1962 L. R Ford, Jr., D. R Fulkerson, Flows in Networks, Princeton University


Press, Princeton, New Jersey, 1962.

4.2. Definiciones Básicas


En el siguiente capı́tulo estudiaremos el problema del flujo máximo y
algunos problemas derivados de éste dentro de un grafo dirigido y conexo.
Para ello, describiremos lo que es un flujo y un camino x-aumentante. En lo
que resta del capı́tulo, D = (V, A) será un grafo dirigido.

Definición 19 (Red capacitada) Una red capacitada R = (V, A, u) con-


siste en un grafo dirigido D = (V, A) y una función no negativa de capaci-
dades sobre los arcos u ∈ RA .

69
70 CAPÍTULO 4. PROBLEMA DE FLUJO MÁXIMO

En la presente sección siempre trabajaremos sobre una red capacitada R


y dos nodos especı́ficos que notaremos s y t, denominados nodo fuente y
nodo sumidero. Adicionalmente, supondremos que δ − (s) = ∅ y δ + (t) = ∅, es
decir, no existen arcos de entrada a s o arcos de salida desde t. La principal
motivación es transportar cuanto más sea posible simultáneamente desde s
a t. Ası́, una solución del problema será conocida como flujo y formalmente
definido de la siguiente forma:

Definición 20 Un st–flujo sobre una red capacitada es una función x ∈ RA


que satisface
1. Propiedad de conservación de flujo
X X
xij − xji = 0,
(i,j)∈δ+ (i) (j,i)∈δ− (i)

para todo i ∈ V \ {s, t}.

2. Lı́mite de capacidades
0 ≤ xij ≤ uij ,
para todo (i, j) ∈ A.

A continuación definimos una extensión de la restricción de conservación


de flujo, la cual será útil para definir el problema principal de la sección.

Definición 21 Sea x ∈ RA . El flujo neto de x sobre el nodo i está dado por


X X
f (i) := xij − xji .
(i,j)∈δ+ (i) (j,i)∈δ− (i)

El flujo neto de x sobre la red será notado por:


X X
|x| = f (s) = x(δ + (s)) − x(δ − (s)) = xji − xsi .
(s,i)∈δ+ (s) (i,s)∈δ− (s)

Notemos que la condición de conservación exige que el flujo neto de un st-


flujo sea cero en todo i ∈ V \ {s, t}. Con las definiciones anteriores podemos
introducir formalmente el problema de flujo máximo:

[MFP]: Problema de flujo máximo


Sean R = (V, A, u) una red capacitada, s ∈ V un nodo fuente y t ∈ V un
nodo sumidero. Queremos encontrar un st–flujo con flujo neto máximo
|x|.
4.3. CORTES Y GRAFOS RESIDUALES 71

El problema de flujo máximo puede ser formulado como un modelo de


programación entera:
X
máx f (s) = xsi
(s,i)∈δ+ (s)

sujeta a
X X
f (j) = xij − xji = 0, ∀i ∈ V \ {s, t},
(i,j)∈δ+ (i) (j,i)∈δ− (i)

0 ≤ xi,j ≤ ui,j , ∀(i, j) ∈ A.

Proposición 11 El problema MFP siempre tiene solución óptima.

Demostración: Dado que el LP esta obviamente acotado y se puede notar


que una solución con flujo igual a cero siempre es factible.

4.3. Cortes y grafos residuales


Sea U ⊆ V un subconjunto de nodos. Se define:

δ + (U) = {(v, w) ∈ A : v ∈ U, w ∈ V \ U}

y
δ − (U) = {(v, w) ∈ A : v ∈ V \ U, w ∈ U}
como el conjunto de arcos salientes y entrantes al conjunto U, respectiva-
mente. Si U separa la fuente del sumidero (s ∈ U y t ∈ V \ U), entonces
δ + (U) es llamado el st − corte. La capacidad del st−corte esta definido por:
X
u(δ + (U)) = u(a)
a∈δ+ (U )

Lema 15 Sea x ∈ RA un st−f lujo que respeta las condiciones de capacidad


x(a) ≤ u(a), ∀a ∈ A y considera un subconjunto de nodos U ⊆ V \ {t}.
Entonces el valor neto del flujo x inducido por U está acotado por:

|x| ≤ u(δ + (U))

Además, la igualdad se obtiene si y solo si x(a) = u(a), ∀a ∈ δ + (U) y x(a) =


0, ∀a ∈ δ − (U)
72 CAPÍTULO 4. PROBLEMA DE FLUJO MÁXIMO

Demostración: Definimos el exceso de U como el monto neto del flujo en-


trando a U, es decir,

f (U) = x(δ + (U)) − x(δ − (U))

La conservación de flujo asegura que f (v) = 0 para todo nodo intermedio


v ∈ V \ {s, t}. Es fácil notar que:
X
f (U) = f (v) = f (s)
v∈U

Como una consecuencia inmediata se obtiene:

|x| = f (s) = f (U) = x(δ + (U)) − x(δ − (U)) ≤ u(δ + (U))

En particular , |x| = u(δ + (U)) si y solo si x(δ + (U)) = u(δ − (U)) y x(δ − (U)) =
0
Ahora pasamos a definir el grafo residual de un flujo. Sea R = (V, A, u)
una red capacitada y x : A → R+ un flujo sobre R y definimos el grafo
Dx = (V, Ax ) de la siguiente forma. Para un arco a = (u, w) ∈ A se denota
el correspondiente arco en reversa a = (w, v) y el conjunto A = {a : a ∈ A}.
Para un flujo x con x(a) ≤ u(a), se define los arcos residuales como:

Ax = {a ∈ A : x(a) < u(a)} ∪ {a ∈ A : x(a) > 0}

Para un arco a ∈ Ax se define la capacidad residual ux (a) como sigue:


(
u(a) − x(a), si a ∈ A
ux (a) =
x(a), si a ∈ A

Entonces, Dx = (V, Ax ) es llamado el grafo residual respecto al flujo x. Sobre


esta nueva estructura introducimos uno de los conceptos más importantes en
flujos sobre redes:

Definición 22 Dado una red R = (V, A, u), dos nodos s, t ∈ V y un st-flujo


x : A → R+ . Un camino aumentante es un camino de s a t en el grafo
residual Dx .

Dado un flujo x y un camino aumentante P de s a t en el grafo residual Dx ,


aumentar flujo en el camino P por γ unidades implica hacer lo siguiente para
cada arco a ∈ A(P ):

Si a ∈ A, entonces incrementar el flujo en γ unidades sobre el arco.


4.3. CORTES Y GRAFOS RESIDUALES 73

Si a ∈ A, entonces restar el flujo en γ unidades sobre el arco.

Usando esta idea es natural construir un algoritmo para el problema de flujo


máximo que será reportado en la siguiente sección.

Ejemplo 16 Consideremos la red capacitada dada por el siguiente gráfico,


donde los valores del flujo sobre los arcos incluyen el subı́ndice x y las capa-
cidades de los arcos son de color rojo:

1
10x 5x
10 11
s
5 5 5x t
11 10
5x 10x
2

Describimos el gráfico en la siguiente tabla:


Flujo x en la red (V, A, u)
Arco Flujo Capacidad
(s, 1) 10 10
(s, 2) 5 11
(1, 2) 5 5
(1, t) 5 11
(2, t) 10 10

El conjunto A contiene dos tipos de arcos: aquellos en la red con flujo


menor a su capacidad máxima; es decir

(s,2), (1, t) ∈ A

y la antiparalela de aquellos donde hay flujo:

(1, s), (2, s), (2, 1), (t, 1), (t, 2) ∈ A.

Conociendo los arcos del grafo residual, ya podemos calcular su capacidad:

Arco Capacidad
(s, 2) 6
(1, t) 6
(1, s) 10
(2, s) 5
(2, 1) 5
(t, 1) 5
(t, 2) 10
74 CAPÍTULO 4. PROBLEMA DE FLUJO MÁXIMO

Representamos gráficamente a la red residual se tiene:

1 6
10
5
s5 6 5 t

10
5 2

Finalmente, podemos identificar un camino aumentante sobre Dx : P = s, 2, 1, t.

4.4. Teorema de flujo máximo-corte mı́nimo


Lema 16 Un st-flujo x(a) ≤ u(a) es máximo si y solo si no existen caminos
de s a t (caminos aumentantes) en el grafo residual Dx . Se define U como
el conjunto de nodos alcanzables desde s en Dx . Entonces, |x| = u(δ + (U)) y
en particular x es un st−flujo de valor máximo.

Demostración: Si existe un camino aumentante P , entonces podemos enviar


γ > 0 unidades de flujo de s a t usando P y x no es máximo. Si no existen
caminos aumentantes , esto significa que t no es alcanzable desde s en el grafo
residual y no podemos enviar flujo extra.
Por definición de U, se tiene que x(a) = u(a) para todo a ∈ δ + (U) y
x(a) = 0 para todo a ∈ δ − (U). Ahora por el lema (15) se tiene que:

|x| = u(δ + (U))

lo que determina que x es máximo.


Ahora estamos listos para demostrar el teorema de flujo máximo - corte
mı́nimo.

Teorema 21 (Flujo máximo – corte mı́nimo) El valor de un st−flujo


de valor máximo es igual a la capacidad de un st−corte mı́nimo.

Demostración: Sea x ∈ R|A| un st-flujo, con x(a) ≤ u(a) para todo a ∈ A.


Podemos iniciar argumentando que no existe un camino de s a t en el grafo
residual Dx . Entonces por el lema (16) se tiene el resultado, ya que se puede
encontrar un conjunto U ⊂ V \ {t} tal que |x| = u(δ + (U)).
Si asumimos que existe un camino P de s a t en el grafo residual Dx . La
capacidad residual o capacidad de cuello de botella ux (P ) es la capacidad
mı́nima de los arcos en P , es decir, ux (P ) = mina∈P {ux (a)}. Un arco para
4.4. TEOREMA DE FLUJO MÁXIMO-CORTE MÍNIMO 75

el cual este mı́nimo es obtenido se denomina arco de cuello de botella de


P . Notar entonces que ux (P ) > 0, es decir, la capacidad de P es mayor
a cero sobre el grafo residual. Entonces podemos definir un nuevo st-flujo
x′ : A → R+ como sigue:

x(a) + ux (P ), si a ∈ P


x (a) = x(a) − ux (P ), si a ∈ P


x(a), otro caso.

Ası́, el flujo x′ es obtenido de x aumentando ux (P ) unidades de flujo sobre


los arcos del camino P en el grafo residual. P también es llamado un camino
aumentante. Es fácil ver que x′ respeta las restricciones de capacidad y las
de conservación de flujo. Además, |x′ | = |x| + ux (P ) > |x|, contradiciendo la
optimalidad del flujo x y concluyendo la demostración.

Ejemplo 17 Para ilustrar los conceptos anteriores, analicemos el camino


ilustrado a continuación:
4
1x 1 3 1x

3
5s 1x 1x 7 t
5

2 4
1x

En el gráfico hemos incluido únicamente la capacidad de los arcos que inter-


vienen dentro del camino, pero supongamos que
us,1 = 3, u1,3 = 4, u4,3 = 7, u4,t = 5, u1,2 = 1, u2,4 = 1, u3,t = 1.
Adicionalmente, mostramos el flujo – (s, t) marcado con lı́nea entrecortada
xs,1 = 1, x1,2 = 1, x2,4 = 1, x4,3 = 1, x3,t = 1,
donde los arcos restantes (1, 3) y (4, t) tienen flujo 0.
El camino P : s 1 3 4 t se descompone en dos conjuntos
 
P = (s, 1), (1, 3), (4, t) ∪ (3, 4) ;
de donde ux (P ) = mı́n{2, 4, 1, 5} = 1 por lo que P es un camino aumentante.
Notemos que si se incrementa ux (P ) = 1 en los arcos hacia adelante y lo
retiramos de los arcos en reversa, tendremos un nuevo flujo x′ dado por
xs,1 = 2, x1,2 = 1, x2,4 = 1, x4,3 = 0, x3,t = 1, x1,3 = 1, x4,t = 1.
76 CAPÍTULO 4. PROBLEMA DE FLUJO MÁXIMO

Entonces el flujo neto sobre t es mayor que el original, puesto que


|x| = 1 y |x′ | = 2.
Incluimos un gráfico del nuevo flujo x′ :
4
2x′ 1 3 1x′

3 1x′
5s 1x′ 7 t
5

2 4 1x′
1x′

4.5. Algoritmo de Ford – Fulkerson


El ejemplo de la sección anterior nos proporciona una idea de como po-
demos construir un algoritmo al ir aumentando el flujo dentro de una red
capacitada. Ası́, podemos presentar el siguiente algoritmo para resolver el
problema [MFP]:

Algorithm 14 FF(R,s,t)
1: Entrada: R = (V, A, u) una red capacitada y dos nodos s, t ∈ V .
2: Salida: Flujo máximo x ∈ RA sobre la red R.
3: Asignar el valor xa = 0 a cada arco a ∈ A.
4: while exista una camino aumentante P en Dx , do
5: Calcular ux (P ) = mı́na∈P {u(a)}.
6: Actualizar
 x aumentando ux (P ) unidades de flujo en P
x(a) + ux (P ), si a ∈ P

xa = x(a) − ux (P ), si a ∈ P


x(a), otro caso.
7: end while

Notemos que en la iteración del algoritmo FF debemos buscar caminos


aumentantes. Esto nos plantea dos incógnitas:
1. ¿Cómo encontramos un camino aumentante?
2. ¿Podemos asegurar que el algoritmo termina en tiempo finito?
3. ¿Podemos mejorar al algoritmo?
A continuación nos centraremos en responder estas preguntas.
4.5. ALGORITMO DE FORD – FULKERSON 77

4.5.1. Buscando caminos aumentantes


Un camino de s a t en Dx puede encontrarse por medio de un algoritmo
de marcaje con complejidad O(m), el cual presentamos a continuación:

Algorithm 15 Marcaje de caminos (s, t)


1: Entrada: Un grafo residual Dx .
2: Salida: Un camino de s a t en Dx .
3: Q := {s}.
4: Crear una lista de nodos procesados P = ∅.
5: πi = −1 para todo i ∈ V .
6: while Q no sea vacı́o, do
7: Retirar un nodo i ∈ Q.
8: for cada (i, j) ∈ δ + (i), do
9: if j ∈
/ P , then
10: Q = Q ∪ {j}.
11: πj = i.
12: end if
13: end for
14: P = P ∪ {i}.
15: end while

Notemos que si πt 6= −1, entonces P permite reconstruir un camino de s


hacia t.

Ejemplo 18 Apliquemos el Algoritmo 15 sobre la red residual del ejemplo


anterior, la cual representamos previamente mediante el siguiente gráfico:

1 6
10
5
s5 6 5 t

10
5 2

Iniciamos Q = {s}, P = ∅ y π = −1V .


Empezamos
 retirando al nodo s de la lista por procesar Q y notamos que
+
δ (s) = (s, 2) . Luego, como la lista de nodos procesados P se encuentra
vacı́a, procedemos a añadir 2 a Q, marcar su componente en p e incrementar
P:
Q = {2}, p2 = s y P = {s}.
78 CAPÍTULO 4. PROBLEMA DE FLUJO MÁXIMO

En la vecindad de salida de 2 se encuentran (2, 1) y (2, s). No podemos se-


leccionar (2, s), puesto que s se encuentra en P , pero 2 no está en P , ası́

Q = {1}, p1 = 2 y P = {s, 2}.

Luego, en la vecindad de 1 se encuentran los arcos (1, t) y (1, s). Nuevamente,


como s se encuentra en P , seleccionamos (1, t) y actualizamos

Q = {t}, pt = 1 y P = {s, 2, 1}.

Finalmente, δ + (t) = (t, 2). Pero 2 se encuentra en P , por lo tanto

Q = ∅, p = (−1, 2, s, 1) y P = {s, 2, 1, t}.

Notemos que p nos indica el orden de las conexiones entre los nodos de
P , ası́ hemos obtenido el camino s, 2, 1, t en G(x) que corresponde al camino
P : s, 2, 1, t en R, la cual es aumentante. Usando la observación anterior,
la capacidad de este camino es ux (P ) = u2,1 = 5, por lo que es x – aumen-
tante y podemos ingresarla dentro de la iteración del Algoritmo 14, de donde
obtenemos el flujo actualizado:

Arco Flujo Capacidad


1
(s, 1) 10 10 10x 10x
(s, 2) 10 11 10 11
5s 5 0x t
(1, 2) 0 5 11 10
(1, t) 10 11 10x 10x
2
(2, t) 10 10

¿El flujo actual es máximo? La respuesta es sı́ por dos razones:

1. Consideremos la capacidad del corte saliente de los conjuntos {s, 2},


{s, 1} y {s, 1, 2}. Notemos que el corte saliente de {s, 2} es mı́nimo
con capacidad 10 y el corte entrante tiene flujo nulo.

2. La red residual del nuevo flujo – (s, t) no posee más caminos desde s
hacia t. Notemos que el arco (2, 1) no está incluido en el grafo residual,
solo consta su antiparalela (1, 2). Esta es la única diferencia con la red
residual anterior.

Ası́ concluimos que no hay caminos aumentantes en R, por ello el flujo actual
es máximo.
4.5. ALGORITMO DE FORD – FULKERSON 79

Se puede construir instancias con capacidades irracionales para las cuales


el algoritmo nunca termina. Varios ejemplos, presentados por Zwich en 19951
presentaron redes simplificadas donde esto ocurre.

Ejemplo 19 El primer ejemplo presentado por Zwich consiste en la siguien-


te red capacitada:

1 Arco Capacidad
(s, 1) v
r
v v (s, 3) v
2
v
(s, 4) v
a1 √
1
s5 1 t 5−1
v a2 2
3 a3 1
v 1 v (1, t) v
(2, t) v
4 (4, t) v

Notamos tres arcos especiales a1 = (3, 4), a2 = (1, 2) y a3 = (3, 2), los cuales
tienen capacidad 1, r y 1, respectivamente.
√ El valor de r es tomado a modo
que r 2 = r − 1, es decir r = 5−12
. Adicionalmente, el valor de v es mayor o
igual que 2. Notemos que el valor del flujo máximo es 2v + 1.
Aplicamos el algoritmo de Ford – Fulkerson comenzando con el flujo nulo
x = 0A . En dicho caso las capacidades residuales de los arcos especiales
corresponden a su capacidad original. Utilizando el algoritmo de marcaje,
podemos seleccionar tres arcos iniciales para cadenas diferentes entre s y t.
Eligiendo la cadena P0 : s, 3, 2, t, tenemos que a3 se satura y se envı́a una
unidad de flujo. Ası́ el flujo residual de los arcos especiales viene a ser 1, r
y 0, respectivamente.
Ahora definamos las cadenas P1 : s 1 2 3 4 t , P2 : s 3 2 1 t y P3 : s 4 3 2 t ,
las cuales se encuentran dentro del grafo residual. Presentamos una figura
con estas cadenas a continuación:

1
Uri Zwick(1999)The smallest networks on which the Ford-Fulkerson maximum flow
procedure may fail to terminate. Theoretical Computer Science. Volume 148, Issue 1, Pages
165-170.
80 CAPÍTULO 4. PROBLEMA DE FLUJO MÁXIMO

P1 P2 P3

Al elegir la cadena P1 , requeriremos de r unidades de flujo. Ası́ las ca-


pacidades residuales son 1 − r = r 2 , 0 y r. Luego, elegimos la cadena P2 , la
cual indica que necesitamos enviar r unidades adicionales y tenemos capaci-
dades residuales son r 2 , r y 0. Volvemos a tomar la cadena P1 y obtenemos
capacidades 0, r 3 y r 2 . Ahora aplicamos P3 con capacidad r 2 y obtenemos r 2 ,
r 3 y 0. Resumimos este procedimiento en la siguiente tabla:

a1 a2 a3
0 — 0 r0 r1 r0
1 P0 r0 r0 r1 0
2 P1 r1 r2 0 r1
3 P2 r1 r2 r1 0
4 P1 r2 0 r3 r2
5 P3 r2 r2 r3 0

Notemos que en la selección anterior de cadenas x – aumentantes siempre


obtuvimos que la capacidad residual era r n , r n+1 o 0, para algún n ∈ N ∗ . Es
más, la iteración 5 indica que tomar la sucesión P1 → P2 → P1 → P3 nos
lleva a las capacidades de P0 multiplicadas por r 2 . Ası́, podemos continuar
tomando esta sucesión de cadenas indefinidamente, puesto que r n < r para
n ∈ N ∗ . El flujo neto sobre t para el quinto paso es 1 + 2(r 1 + r 2 ) y al
continuar con la sucesión de cadenas tendremos que
X r
fx (t) = 1 + 2r rn = 1 + 2 = 1 + 2(1 + r) = 3 + 2r ≈ 4,2361,
n∈N
1−r

por lo tanto el algoritmo nunca termina y no converge al valor del flujo


máximo.

Sin embargo, si las capacidades son números racionales se puede asegurar


la terminación del algoritmo.
4.6. ALGORITMO DE EDMONDS-KARP 81

Teorema 22 Si las capacidades de los arcos son racionales, entonces el al-


goritmo de Ford-Fulkerson termina con el st−flujo máximo.
Demostración: Sin perdida de generalidad podemos asumir que todos los
arcos tienen capacidades enteras. Por inducción se sigue que calculando el
flujo x y su capacidad residual ux (P ) son enteros en cada iteración del al-
goritmo. En particular, si existe un camino aumentante en Dx siempre se
tiene que ux (P ) ≥ 1 y el número máximo de iteraciones esta acotado por el
valor del flujo máximo. Por escalamiento, basta multiplicar a u por su mı́ni-
mo común múltiplo.Ası́, obtendremos un vector entero con un flujo máximo
entero, el cual dividimos para el factor de conversión de u y ese será el flujo
máximo de la red original.

Corolario 3 Si todas las capacidades son enteras, entonces existe un flujo


máximo el cual es entero, y consecuentemente el valor del flujo sobre todos
los arcos es un valor entero.

Dado que estamos interesados en algoritmo eficientes, que es algoritmos


que es algoritmos con tiempo de ejecución polinomial respecto al tamaño de
la instancia, el algoritmo de Ford-Fulkerson no cumple dichas propiedades.
Con una instancia pequeña, el comportamiento del algoritmo puede ser muy
mala:
Dada la siguiente red R = (V, A, u) con V = {1, 2, 3, 4} y arcos A =
{(1, 2), (1, 3), (2, 3), (2, 4), (3, 4)} con capacidades u(1, 2) = u(1, 3) = u(2, 4) =
u(3, 4) = M y u(2, 3) = 1. El valor del flujo máximo es 2M. Si el algoritmo
escoge el camino aumentante 1, 2, 3, 4 y 1, 3, 2, 4 el flujo siempre se aumenta
solo en 1 unidad en cada iteración, generando 2M iteraciones para que el
algoritmo termine. Dado que M puede ser arbitrariamente grande(incluso
exponencial), se tiene que el orden de Ford-Fulkerson depende de O(M) pro-
duciendo un algoritmo no satisfactorio.

4.6. Algoritmo de Edmonds-Karp


Decimos que un camino aumentante es el más pequeño si tiene el mı́ni-
mo posible de arcos entre s y t dentro del grafo residual. Resulta ser que
si seleccionamos los caminos más pequeñas dentro del algoritmo de Ford
– Fulkerson, tendremos una mejora sustancial en el proceso iterativo. Este
resultado es debido a Dinitz y mejorado por Edmonds y Karp2 .
2
Edmonds, J. and Karp, R.M. (1972) Theoretical Improvements in Algorithmic Effi-
ciency for Network Flow Problems. Journal of the Association for Computing Machinery,
19, 248-264.
82 CAPÍTULO 4. PROBLEMA DE FLUJO MÁXIMO

Para demostrar este resultado vamos a considerar el aumento de un flujo


x a un flujo x′ usando un camino aumentante más pequeña. Dado un flujo
arbitrario x y dos nodos u, v ∈ V , notaremos por dx (u, v) al menor número
de arcos que tiene un camino aumentante desde u hasta v en el grafo residual
Dx .
Lema 17 Para todo v ∈ V , la distancia dx (s, v) nunca decrece en el algorit-
mo de Edmonds-Karp.
Demostración: Por contradicción asumimos que la distancia dx (s, v) ha
decrecido para algún nodo v ∈ V en alguna iteración del algoritmo. Además
asumimos que v tiene la distancia mı́nima dx (s, v) entre todos los nodos cuya
distancia ha decrecido en esta iteración. Denotamos por x′ el st-flujo antes
de esta iteración.
Consideremos el camino más corto P de s a v en Dx y denotemos por w
el predecesor de v en el camino. Por la selección de v, se tiene que:
dx′ (s, w) ≤ dx (s, w) = dx (s, v) − 1 < dx′ (s, v) − 1 (4.1)
y podemos concluir que el arco (w, v) ∈ Ax no estaba contenido en Ax′ . Esto
implica que el arco en reversa (v, w) fue incluido en el camino aumentante
más pequeño de la última iteración. Ası́ se tiene que:
dx′ (s, w) = dx′ (s, v) + 1 > dx′ (s, w) + 2
Por (4.1) lo cual claramente es una contradicción.
Teorema 23 Si en cada iteración del algoritmo de Ford – Fulkerson se selec-
ciona el camino aumentante más pequeña en Dx en cada iteración, entonces
el algoritmo termina en O(m2 n) iteraciones.
Demostración: Del lema (17) se tiene que el número de arcos sobre un
camino más corto en el grafo residual Dx nunca decrece en cada iteración del
algoritmo. Dado que este número puede incrementarse a lo más n − 1 veces,
queda por mostrar que se incrementa al menos una vez en cada una de las
m iteraciones consecutivas.
Sea A′x ⊆ Ax denota el subconjunto de arcos que tiene en algún camino
más corto de s a t en Dx . Notar que A′x ≤ m. Si dx (s, t) no cambia luego
de alguna iteración, es fácil ver que ningún nuevo arco ha entrado en A′x
en esta iteración. Por otro lado, al menos un arco(arco cuello de botella del
camino P ) debe ser eliminado de A′x . Dado que un camino aumentante más
corto puede ser encontrado en O(m) se tiene que el tiempo de ejecución del
algoritmo de Edmonds-Karp es O(m2 n).
Para concluir esta sección, incluiremos un ejemplo completo:
4.6. ALGORITMO DE EDMONDS-KARP 83

Ejemplo 20 Vamos a encontrar el flujo máximo en la siguiente red capaci-


tada:

Arco Capacidad
(s, 1) 15
15 (s, 2) 5
1 3
15 5 (1, 3) 15
(1, 4) 5
5s 10 t
10 5 (2, 1) 10
5 15
(2, 3) 10
2 4 (2, 4) 15
15
(3, t) 5
(4, t) 15

Empezamos asignando un flujo total de 0 a cada arco de la red capaci-


tada, de este modo el grafo residual coincide con el grafo de la red original.
Aplicamos el algoritmo de marcaje, el cual adaptamos para elegir un camino
aumentante más pequeño, la cual a lo más tendrá 3 arcos, y resumimos el
proceso en la siguiente tabla:

0 {s} ∅
1 {1, 2} {s}
2 {1, 3, 4} {s, 2}
3 {1, 4, t} {s, 2, 3}
4 ∅ {s, 2, 3, t}

Ası́ hemos encontrado la cadena P : s, 2, 3, t en R. La capacidad de este


camino es ε(P ) = u3,t = 5, por lo que es aumentante. Calculamos el nuevo
flujo (s, t) mediante



xa + ε(P ) si a ∈ P ,

xa = xa − ε(P ) si a ∈ P ↓ ,


xa si a ∈
/ P.

para todo arco a ∈ P , de donde obtenemos el flujo actualizado:


84 CAPÍTULO 4. PROBLEMA DE FLUJO MÁXIMO

Arco Capacidad Flujo


(s, 1) 15 0
15 (s, 2) 5 5
1 3
15 5 (1, 3) 15 0
5x 5x (1, 4) 5 0
5s 10 t
5x 10 5 (2, 1) 10 0
5 15 (2, 3) 10 5
2 4
15 (2, 4) 15 0
(3, t) 5 5
(4, t) 15 0

Los arcos (s, 2) y (3, t) están saturados, por lo cual solo el (2, 3) se incluye
en reversa en la red residual:

Arco Capacidad
(s, 1) 15
(2, s) 5
15 (1, 3) 15
1 3
15 5 5 (1, 4) 5
5s 10 5 5 t (2, 1) 10
(2, 3) 5
5 15
2
15
4 (3, 2) 5
(2, 4) 15
(t, 3) 5
(4, t) 15

Aplicamos nuevamente el algoritmo de marcaje como se muestra en la


siguiente tabla:

0 {s} ∅
1 {1} {s}
2 {4, 3} {s, 1}
3 {3, t} {s, 1, 4}
4 ∅ {s, 1, 4, t}

Hemos encontrado la cadena P : s 1 4 t en R, con capacidad ε(P ) = u1,4 = 5,


y tenemos
4.6. ALGORITMO DE EDMONDS-KARP 85

Arco Capacidad Flujo


(s, 1) 15 5
15 (s, 2) 5 5
1 3
15 5 (1, 3) 15 0
5x
5x 5x 5x (1, 4) 5 5
5s 10 t
5x 10 5 5x (2, 1) 10 0
5 15 (2, 3) 10 5
2 4
15 (2, 4) 15 0
(3, t) 5 5
(4, t) 15 5

Esto induce a la siguiente red residual:

Arco Capacidad
(s, 1) 10
(1, s) 5
(2, s) 5
15 (1, 3) 15
5 1 3
5 5 (4, 1) 5
10
5s 10 5 5 5 t (2, 1) 10
(2, 3) 5
5 2
15
4 10 (3, 2) 5
(2, 4) 15
(t, 3) 5
(4, t) 10
(t, 4) 5

Aplicamos el algoritmo de marcaje una vez más y obtenemos el camino


aumentante P : s, 1, 3, 2, 4, t, con capacidad ε(P ) = u3,2 = 5. Ası́ obtenemos
el nuevo flujo

Arco Capacidad Flujo


(s, 1) 15 10
15 (s, 2) 5 5
1 3
15 5x 5 (1, 3) 15 5
10x
5x 5x (1, 4) 5 5
5s 10 t
5x 10 5 10x (2, 1) 10 0
5 5x 15 (2, 3) 10 0
2 4
15 (2, 4) 15 5
(3, t) 5 5
(4, t) 15 10
86 CAPÍTULO 4. PROBLEMA DE FLUJO MÁXIMO

A este punto es bueno notar que varios arcos ya están saturados. La red
residual es

Arco Capacidad
(s, 1) 5
(1, s) 10
(4, 1) 5
5 (2, s) 5
10 1 10 3 (1, 3) 10
5
5
5
(3, 1) 5
10
5s 10 10
t (2, 1) 10
5 (2, 3) 10
5 2 4
10 5 (2, 4) 10
(4, 2) 5
(t, 3) 5
(4, t) 5
(t, 4) 10

Finalmente, buscamos un camino entre s y t mediante el algoritmo de


marcaje:
0 {s} ∅
1 {1} {s}
2 {3} {s, 1}
4 ∅ {s, 1, 3}

Mediante el algoritmo de marcaje hemos determinado que no existen más


caminos aumentantes; mas se encontró el corte (s, t) siguiente:

W = {s, 1, 3},

donde los arcos que salen tienen flujo constante 5 en R, y los arcos entrantes
tienen flujo saliente 0. Ası́, concluimos que el flujo actual sobre R es máximo.
Existen varios algoritmos que resuelven el problema en menor tiempo
de ejecución. Dinits(1970) presento una mejora al algoritmo resolviendo el
problema de flujo máximo en O(n2 m) iteraciones.

4.7. Descomposición de caminos


En la formulación anterior hemos considerado un st-flujo asignando flujos
no negativos a cada arco de la red capacitada respetando las restricciones de
conservación de flujo y capacidad. Por otro lado, uno puede también describir
4.7. DESCOMPOSICIÓN DE CAMINOS 87

un st− flujo asignando valores de flujo a caminos y ciclos en D. En lo siguiente


denotaremos el conjunto de caminos simples de s a t en D por P y el conjunto
de ciclos dirigidos por C. Notar que la cardinalidad de P y C es en el peor de
los casos exponencial.
Una descomposición en caminos de un st−flujo x : A → R+ es una
función x : P ∪ C → R+ tal que:
X
x(a) = x(p), ∀a ∈ A.
p∈P∪C:
a∈p

Usando la descomposición en caminos, el problema de flujo máximo puede


ser formulado de la siguiente forma:
X
máx x(p)
p∈P∪C
X
x(p) ≤ u(a), ∀a ∈ A
p∈P∪C:
a∈p

x(p) ≥ 0, ∀p ∈ P ∪ C.

Iniciamos probando el siguiente lema:

Lema 18 Dado un st−flujo x 6= 0, existe un camino o un ciclo p ∈ P ∪ C


con x(a) > 0 para todo a ∈ p.

Demostración: Considere un flujo arbitrario sobre un arco a0 ∈ A. Empe-


zando en el nodo inicial a0 = s, construimos un camino dirigido únicamente
por los arcos que transportan flujo hasta que se alcance t o se genere un
ciclo. Esto es posible debido a la conservación de flujo. Si tenemos un ciclo,
tenemos uno de los resultados posibles del lema. En otro caso, nos dirigimos
al nodo final e iniciamos la construcción de un camino en reversa hasta que
alcancemos la fuente o se forme otro ciclo. Esto nuevamente es posible por
la conservación de flujo.

Teorema 24 Para un st−flujo x, existe siempre una descomposición en ca-


minos x usando a lo más m caminos y ciclos:

|{p ∈ P ∪ C : x(p) > 0}| ≤ m

Demostración: El siguiente algoritmo calcula la descomposición en cami-


nos. Notar que el número de iteraciones del algoritmo es a lo más m dado
que en toda iteración el valor el flujo en al menos un arco cae a cero.
88 CAPÍTULO 4. PROBLEMA DE FLUJO MÁXIMO

Algorithm 16 Descomposición en caminos


1: Entrada: Un st− flujo
2: Salida: Una descomposición en caminos x

3: while x 6= 0 do
4: Calcular un camino de transporte de flujo p ∈ P ∪ C, es decir, p =
a1 , . . . , ak con xa1 > 0, . . . , xak > 0
5: Calcular x(p) = mı́n{x(a) : a ∈ p}
6: for a ∈ p do
7: x(a) = x(a) − x(p)
8: end for
9: end while
10: retornar x(p)

4.8. Algoritmo de Goldberg-Tarjan


En la presente sección describimos el algoritmo Push-Relabel diseñado
por Goldberg-Tarjan en 19883 . Por definición, un flujo x es máximo si y solo
las siguientes condiciones son satisfechas:

x(a) ≤ u(a), ∀a ∈ A
P P
Conservación de flujo a∈δ+ (i) xij = a∈δ− (i) xji , ∀i ∈ V \ {s, t}

No existe caminos aumentantes

En los algoritmos anteriores las primeras dos condiciones se cumplen en cada


iteración del algoritmo y termina cuando la tercera condición se cumple. En el
presente algoritmo iniciamos cumpliendo la primera y la tercera condición y
termina cuando la conservación de flujo en cada nodo es respetada. Dado que
x no será un st-flujo durante la ejecución del algoritmo( excepto al finalizar
el mismo), definimos una relajación:

Definición 23 Dado una red R = (V, A, u) y dos nodos s, t ∈ V , un st-


preflujo es una función x : A → R+ satisfaciendo que x(a) ≤ u(a) para todo
a∈Ay X X
f (i) = xij − xji ≥ 0, ∀i ∈ V \ {s, t}
a∈δ+ (i) a∈δ− (i)

LLamaremos un nodo i ∈ V \ {s, t} como activo si f (i) > 0.


3
Andrew V. Goldberg, Robert E. Tarjan(1988), A new approach to the maximum-flow
problem. Journal of the ACM. Volume 35. Issue 4, pp 921–940
4.8. ALGORITMO DE GOLDBERG-TARJAN 89

Obviamente, un st-preflujo es un st-flujo si no existen nodos activos.


La idea del nuevo algoritmo es la siguiente: Iniciamos con un preflujo x
con exceso positivo sobre los nodos distintos de s y t. Intentamos empujar
flujo desde un nodo activo a otros nodos cercanos a la fuente o al sumidero.
Si en algún punto en el tiempo transformamos el preflujo en un flujo, para
todos los nodos, entonces el flujo es máximo. Para visualizar el proceso,
podemos imaginar el flujo como agua y las etiquetas de distancias como
alturas. Entonces el flujo es siempre enviado hacia abajo. En algún punto en
el tiempo podrı́amos llegar a la situación en la que un nodo activo i no es
capaz de eliminar su exceso dado que todos sus sucesores en la red tienen
una altura mayor a la de i. En este caso, levantamos lo suficiente el nodo i
para permitir que el exceso de flujo salga.
Antes de describir el algoritmo, debemos responder dos preguntas:
Cómo mover el exceso de flujo de un nodo a otro?.
Cómo estimar la distancia de un nodo a la fuente o al sumidero?
Para ello usamos el grafo residual. Si el nodo tiene un exceso positivo y el par
(v, w) tiene capacidad residual positiva, entonces el monto de flujo en exceso
ǫ = mı́n{f (v), ux(v, w)} puede moverse de v a w reduciendo su flujo.
La segunda pregunta es estimar la distancia entre un nodo y el nodo
fuente o el nodo sumidero. Para este propósito definimos una función de
etiquetado de nodos.

Definición 24 Un etiquetado (distancia) es una función d : V → N tal que


d(t) = 0, d(s) = n y d(i) ≤ d(j) + 1 para todo arco residual a = (i, j). Un
arco (i, j) es llamado admisible si a ∈ Dx y d(i) = d(j) + 1.

Nos referiremos a las condiciones de la definición anterior como condicio-


nes de validez y d(i) es la etiqueta de distancia del nodo i. Sea P = {i =
i1 , i2 , . . . , ik = s} un camino de i a s en el grafo residual Dx . Las condiciones
de validez implican que:
d(i) = d(i1 ) ≤ d(i2 ) + 1 ≤ . . . . . . ≤ d(s) + (n − 1) = 2n − 1
Por tanto, la etiqueta de distancia d(i) es a lo más la longitud del camino
(en número de arcos) del nodo i a s en el grafo residual. Además, si P es
un camino arbitrario podemos afirmar que d(i) es una cota inferior para la
distancia de i a s y si d(i) ≥ n, entonces d(i) − n es una cota inferior a la
distancia a t en el grafo residual.

Lema 19 Sea d la función de etiquetado con respecto a Dx y d(s) ≥ n.


Entonces x es un flujo máximo
90 CAPÍTULO 4. PROBLEMA DE FLUJO MÁXIMO

Demostración: Si existe un camino aumentante en Dx , entonces existe uno


que no contenga ciclos y su etiqueta de distancia será a lo más n − 1. Dado
que d(s) ≥ n podemos deducir que no existe tal camino aumentante de s a t
y por tanto el flujo debe ser máximo.
El algoritmo inicia con un pre-flujo x, donde se asigna un flujo igual a
la capacidad si los arcos dejan s y cero para el resto de arcos y con algún
etiquetado inicial d. El algoritmo repetidamente ejecuta las operaciones de
presionado (push) y etiquetado(relabel). Cuando no existan flujos activos,
entonces el algoritmo termina. La operación push de v a w incrementa el
flujo x(v, w) y el exceso f (w) por ǫ = mı́n{f (v), ux(v, w)} y se reduce x(w, v)
y f (v) por el mismo monto. La operación relabel de v configura la etiqueta
de v igual al mayor valor permitido por la restricción de etiquetado válido.
Ası́, los pasos descritos anteriormente pueden ser encontrados en el Algo-
ritmo 17.
Algorithm 17 Algortimo Push-Relabel
1: Entada: Una red R = (V, A, u) y dos nodos s, t ∈ V
2: Salida: Un st-flujo máximo.

3: x(a) = u(a), para cada a ∈ δ + (s)


4: x(e) = 0 para cada A \ δ + (s)
5: d(s) = n y d(i) = 0 para todo i ∈ V \ {s}
6: while Exista un nodo activo do
7: Sea i un nodo activo
8: if Ningún a ∈ δ + (i) es admisible en Dx then
9: RELABEL(i)
10: else
11: Sea a ∈ δ + (i) un arco admisible en Dx
12: PUSH(a)
13: end if
14: end while

15: RELABEL(i)
16: Sea d(i) = mı́n{d(j) + 1 : a = (i, j) ∈ Ax }

17: PUSH(a)
18: Definir ǫ = mı́n{f (i), ux(a)}, donde i es el nodo con a ∈ δ + (i) en Dx
19: aumentar x sobre a en ǫ unidades de flujo.
4.8. ALGORITMO DE GOLDBERG-TARJAN 91

Lema 20 Si x es un pre-flujo, d es una función de etiquetado para x, y v


un nodo activo, una operación push o relabel es aplicable a v.

Demostración: Para algún arco residual (v, w), la definición de un etique-


tado válido implica que d(v) ≤ d(w) + 1. Si la operación push no es aplicable
a v, entonces d(v) < d(w) + 1 para todo arco residual (v, w). Por la integra-
bilidad de la función d, d(v) ≤ d(w) para todos los arcos residuales (v, w) y
el etiquetado es aplicable a v.

Proposición 12 Durante la ejecución del algoritmo, x es siempre un st-


preflujo y d es siempre la etiqueta de distancia respecto a x

Demostración: Es claro que luego del proceso PUSH, x es aún un st-preflujo


y la ejecución el proceso RELABEL no cambia el flujo x. Además, luego de
RELABEL , d es aún un etiquetado de distancias.
Queda por mostrar que luego de PUSH, d es aún una etiqueta de dis-
tancias respecto al nuevo preflujo, es decir, tenemos que verificar que d(i) ≤
d(j) + 1 para todo nuevo arco (i, j) en Dx . Pero si aplicamos PUSH(e) para
algún arco e = (i, j) el único posible nuevo arco en Dx es el arco en reversa
(j, i) y se tiene que d(j) = d(i) − 1 dado que e es admisible.

Lema 21 Si x es un st-preflujo y d es la distancia respecto a x, entonces:

s es alcanzable desde algún nodo activo i en Dx

Si j es alcanzable desde i en Dx , para algún par de nodos i, j ∈ V ,


entonces d(i) ≤ d(j) + n − 1

t no es alcanzable desde s

Demostración:

Sea i un nodo activo, y R el conjunto de nodos alcanzables desde i en


el grafo residual. Entonces, x(a) = 0 para todo a ∈ δ + (R):
X X X
f (j) = x(a) − x(a) ≤ 0
j∈R a∈δ+ (R) a∈δ− (R)

pero v es activo, lo que implica que f (i) > 0 y además debe existir
un nodo j ∈ R con f (j) < 0. Dado que x es un preflujo, este nodo
obligatoriamente debe ser s.
92 CAPÍTULO 4. PROBLEMA DE FLUJO MÁXIMO

Suponga que existe un camino de i a j en Dx denotado por P = i =


i0 , i1 , . . . , ik = j. Dado que existe una distancia d con respecto a x, se
cumple que d(il ) ≤ d(il+1 ) + 1, para todo l = 0, 1, . . . , k − 1. Ya que
d(i) ≤ d(j) + k se tiene que k ≤ n − 1
Se sigue de (b) como d(s) = n y d(t) = 0

El último literal del lema anterior nos ayuda a probar el siguiente resul-
tado:
Teorema 25 Cuando el algoritmo termina, x es un st-flujo máximo
Demostración: x es un st-flujo debido a que no existen nodos activos, es
decir, se respeta la conservación de flujo. Por el literal (c) del lema anterior se
tiene que no existe caminos aumentantes, lo que determina que x es máximo.

Podrı́amos analizar el número de repeticiones de la rutina Push. Distin-


guimos entre push saturando (x(a) = u(a)) y cuando el arco no se satura
luego de la rutina (x(a) < u(a)).
Lema 22 El número de rutinas push saturando el arco es a lo más 2mn.
Demostración: Luego de ejecutar la rutina push saturando el arco (v, w),
otra rutina de este tipo no puede ocurrir hasta que la etiqueta del nodo w se
incremente en al menos 2, una operación push de w a v ocurre y la etiqueta
de v crece en al menos 2. Por los literales (a) y (b) del lema anterior prueba
que existen a lo más n operaciones saturando en arco (v, w) ∈ Ax .

Lema 23 Para algún nodo v, la etiqueta d(v) nunca decrece.

Demostración: Dado que la etiqueta de un nodo cambia únicamente cuando


la rutina Relabel es ejecutada, debemos probar que Relabel(v) implica que
se genera un incremento de d(v). Supongamos que Relabel(v) es aplicable,
entonces para todo w tal que v, w) ∈ Ax se tiene que d(w) ≥ d(v). Ya que el
valor se actualiza a d(v) = mı́n{d(w) + 1 : a = (v, w) ∈ Ax } se tiene que d(v)
debe crecer.
Por un resultado anterior se conoce cotas superiores para d(v) ≤ 2n − 1,
podemos identificar el número de operaciones ejecutas por el algoritmo.
Lema 24 El número de repeticiones de Relabel es a lo más (2n − 1)(n − 2)
Demostración: Por el lema anterior, se conoce las cotas en las etiquetas de
cada nodo. Entonces si se aplica para cada nodo v ∈ V \ {s, t} se tiene que
el número total es igual a (2n − 1)(n − 2) < 2n2 .
4.8. ALGORITMO DE GOLDBERG-TARJAN 93

Teorema 26 El orden del algoritmo es O(n2 m)

Para visualizar el funcionamiento del algoritmo, consideremos el siguiente


ejemplo:

Ejemplo 21 Para visualizar la ejecución del algoritmo anterior, considere-


mos el siguiente ejemplo:
2
4 4

1 3 4

2 1
3
Figura 4.1: Red R=(V,A,u) y definimos s = 1 y t = 4

(0,0)
2
4 4

(4,0) (0,0)
1 3 4

2 1
3
(0,0)
Se dispone de la primera red residual para el preflujo x = 0 y el etiquetado
de distancias. El par sobre el nodo i representa (d(i), f (i)), es decir, el nodo
2 tiene d(2) = f (2) = 0. Las capacidades residuales son presentadas sobre
cada arco. Luego del proceso de inicialización, se toma el nodo 3 y luego el
nodo 2 como nodos activos y se actualizan las etiquetas. Arcos no admisibles
son identificados con lı́neas punteadas.

.
94 CAPÍTULO 4. PROBLEMA DE FLUJO MÁXIMO
(1,4)
2
4 4

(4,-6) (0,0)
1 3 4

2 1
3
(1,2)
Usamos el nodo 3 como nodo activo y el arco (3, 4) como arco admisible. Se
incrementa ǫ = 1 unidad de flujo sobre el arco.
(1,4)
2
4 4

(4,-6) (0,1)
1 3 4

2 1
3
(2,1)
Nuevamente, el nodo 3 es tomado como nodo activo. En este tiempo, no
hay arcos admisibles saliendo de 3, y aplicando Relabel la etiqueta es incre-
mentada a d(3) = 1 + mı́n{1, 4} = 2. De esta forma el arco (3, 2) se vuelve
admisible.
(1,4)
2
4 4

(4,-6) (0,1)
1 3 4

2 1
3
(2,1)
En esta iteración, el nodo 2 es tomado como activo, siendo el único arco
admisible (2, 4). Aplicando push, 4 unidades de flujo son empujadas sobre el
arco.
4.8. ALGORITMO DE GOLDBERG-TARJAN 95
(1,0)
2
4 4

(4,-6) (0,5)
1 3 4

2 1
3
(2,1)
El nodo 3 es seleccionado como activo, entonces una unidad de flujo es em-
pujada sobre el arco admisible (3, 2).
(3,1)
2
4 4

(4,-6) (0,5)
1 2 1 4

2 1
3
(2,0)
En la siguiente iteración, el único nodo activo es 2. No existen arcos admi-
sibles lo que causa una operación de re-etiquetado del nodo 2 de la forma
d(2) = 1 + mı́n{4, 2} = 3. El arco (2, 3) ahora es admisible y una unidad de
flujo es empujada sobre este arco.
(3,0)
2
4 4

(4,-6) (0,5)
1 3 4

2 1
3
(2,1)
El único nodo activo es 3, y su etiqueta es incrementada d(3) = 1 +
mı́n{3, 4} = 4. El arco (3, 2) es admisible y una unidad de flujo es empu-
jada por dicho arco.
96 CAPÍTULO 4. PROBLEMA DE FLUJO MÁXIMO

(5,1)
2
4 4

(4,-6) (0,5)
1 2 1 4

2 1
3
(4,0)
El nodo 2 es seleccionado como nodo activo y aplicando Relabel la etiqueta
es incrementada a d(2) = 1 + mı́n{4, 4} = 5. Ahora una unidad es empujada
por el arco (2, 1).

1 (5,0)
2
3 4

(4,-5) (0,5)
1 2 1 4

2 1
3
(4,0)
No existen nodos activos y el algoritmo termina con un flujo máximo. Ası́, el
flujo es determinado:

2
(3,4) (4,4)

1 (1,3) 4

(2,2) (1,1)
3

Figura 4.2: Solución de la instancia.


Capı́tulo 5

Problemas de flujo de costo


mı́nimo

Consideremos el siguiente problema: UNLIMITED Comp. fabrica el mis-


mo producto en n plantas distintas y después tendrá que enviarlo a m diferen-
tes clientes. La red de distribución disponible para el envı́o de este producto
depende de la red vial. Cada fábrica dispone de un número determinado de
unidades disponibles y los clientes solicitan una cantidad determinada de
producto. Se conoce el costo por unidad enviada a través de cada arco y las
cantidades máximas que se pueden enviar por estos trayectos. El objetivo es
minimizar el costo total de envı́o respetando las capacidades de la red vial.

5.1. Formulación
Iniciamos introduciendo el concepto de un flujo en el que se permiten
varias fuentes y varios sumideros.

Definición 25 Dado un grafo dirigido D P = (V, A), capacidades sobre los


+
arcos u :→ R y números b : V → R con v∈V b(v) = 0, un b-flujo en la red
R = (V, A, u) es una función x : A → R+ con x(a) ≤ u(a) para todo a ∈ A
y:
X X
x(a) − x(a) = b(v), ∀v ∈ V
a∈δ+ (v) a∈δ− (v)

La función b(v) es llamado el balance de v. Nodos con b(v) > 0 son


llamados fuentes(ofertas) y nodos con b(v) < 0 son llamados sumideros (de-
mandas). Si se tiene un b−flujo con b(v) = 0, entonces se dice que es una
circulación.

97
98 CAPÍTULO 5. PROBLEMAS DE FLUJO DE COSTO MÍNIMO

Note que un b-flujo puede ser encontrado usando algún algoritmo de


flujo máximo: La transformación considera adherir dos super nodos s y t y
arcos (s, v) con capacidad u(s, v) = b(v) si v es una fuente y arcos (v, t) con
capacidad u(v, t) = −b(v) si v es un sumidero. Entonces algún flujo de valor
P
v∈V u(s, v) corresponde a un b-flujo en D. El problema de flujo de costo
mı́nimo consiste en encontrar un b-flujo de costo mı́nimo.

[MCF]: Problema de flujo de costo mı́nimo


Dado un grafo dirigido D = (V, A), capacidades sobre los arcos u : A →
R+ , una función de demanda sobre los nodos b : V → R y una función
de costos sobre los arcos c : A → R. La tarea consiste en encontrar un
flujo x : A → R+ tal que:
X
c(x) = c(a)x(a)
a∈A

sea minimizada

El problema MCF puede ser formulado como un modelo de programación


lineal de la siguiente forma:

X
mı́n c(a)x(a)
a∈A
sujeta a
X X
x(a) − x(a) = b(v), ∀v ∈ V
a∈δ+ (v) a∈δ− (v)

0 ≤ x(a) ≤ u(a), ∀a ∈ A;

5.2. Criterio de optimalidad


En la presente sección reportamos algunos resultados que serán básicos
para el diseño de algoritmos de solución. Nuevamente usamos los conceptos
de grafo residual y caminos aumentantes. Una función de costos c : A → R es
canónicamente extendido sobre un grafo residual Dx de un flujo x con x ≤ u
definiendo: (
c(a), si a ∈ A ∩ Ax
c(a) =
−c(a), si a ∈ A ∩ Ax
La definición esta basada en la intuición del envı́o de una unidad de flujo
sobre un arco en reversa (w, v) ∈ A ∩ Ax implica que la unidad de flujo que
5.2. CRITERIO DE OPTIMALIDAD 99

se mueve por el arco original (v, w) es retornada al nodo inicial v y el costo


debe ser reducido. Esta definición tiene la ventaja de que es independiente
de los flujos en Dx .
Iniciamos con el siguiente resultado:
Proposición 13 Sea D un grafo dirigido con capacidades u : A → R+ . Sea
x y x′ b-flujos en D. Entonces el flujo g definido por g(a) := máx{0, x′ (a) −
x(a)} y g(a−1 ) = máx{0, x(a) − x′ (a)} para todo a ∈ A
1. g es una circulación en D.

2. g(a) = 0 para todo a 6∈ Ax

3. c(g) = c(x′ ) − c(x).


Demostración: En cada nodo v ∈ V se tiene:
X X X X
g(a) − g(a) = (x′ (a) − x(a)) − (x′ (a) − x(a))
a∈δ+ (v) a∈δ− (v) a∈δ+ (v) a∈δ− (v)
X X  X X 
= x′ (a) − x′ (a) − x(a) − x(a)
a∈δ+ (v) a∈δ− (v) a∈δ+ (v) a∈δ− (v)

= b(v) − b(v)
= 0

concluyendo que g es una circulación en D.


Para cada a ∈ A \ Ax consideramos 2 casos:
Si a ∈ A entonces x(a) = u(a), con x′ (a) ≤ x(a) implicando x′ (a) −
x(a) ≤ 0 y por tanto g(a) = 0 .

Si a = a0 para algún a0 ∈ A, entonces dicho arco tiene capacidad igual


a cero y x(a0 ) = 0 y ası́ g(a) = 0.
El último literal es fácilmente verificado:
X X
c(g) = c(a)g(a) = c(a)(x′ (a) − x(a)) = c(x′ (a)) − c(x(a))
a∈A a∈A

Extendiendo el concepto de caminos aumentantes presentamos la siguien-


te definición.

Definición 26 Dado un grafo dirigido D = (V, A) con capacidades sobre los


arcos y un b-flujo x. Se conoce como un ciclo aumentante a un ciclo sobre el
grafo residual Dx
100 CAPÍTULO 5. PROBLEMAS DE FLUJO DE COSTO MÍNIMO

Usando la idea de ciclos aumentantes, el siguiente resultado permite estable-


cer las bases para la construcción de algoritmos que nos permitan encontrar
un b-flujo de costo mı́nimo.
Teorema 27 Dada una instancia del problema del flujo de costo mı́nimo,
un b-flujo es de costo mı́nimo si y solo si no existe ciclos aumentantes de
costo negativo.
Demostración: Asumimos que existe un ciclo dirigido C en Dx con costo
negativo c(C) < 0. Definimos la capacidad residual o capacidad del cuello de
botella del ciclo ux (C) = mı́na∈C {ux (a)} > 0}. Aumentando ux (C) unidades
de flujo sobre los arcos del ciclo C y obtenemos un nuevo flujo x′ ≤ u:

x(a) + ux (C), si a ∈ C


x = x(a) − ux (C), si a−1 ∈ C


x(a), si a 6∈ C

El costo del nuevo flujo es:

c(x′ ) = c(x) + c(C)ux (C) < c(x)

ya que c(C) < 0 lo que contradice la optimalidad de x.


Por otro lado, podemos asumir que x′ ≤ u es un b-flujo con c(x′ ) < c(x).
Consideremos la circulación x′ −x ≤ ux en Dx la cual puede ser descompuesta
en flujos sobre ciclos dirigidos en Dx (descomposición en ciclos y caminos),
es decir, si x : P ∪ C → R+ es una descomposición en caminos del flujo x,
entonces X
c(x) = c(x) = c(p)x(p)
p∈P∪C

Es fácil observar que c(x ) − c(x) < 0 y que al menos uno de estos ciclos
debe tener costo negativo.
Corolario 4 Dada una instancia del problema de flujo de costo mı́nimo. Un
b-flujo x con x ≤ u es de costo mı́nimo si y solo existe una función y : V → R
(potencial factible) tal que:

c(a) ≥ y(w) − y(v), ∀a = (v, w) ∈ Ax

Demostración: Sea C = (v1 , v2 , . . . , vq , v1 ) un ciclo dirigido en Dx . Entonces:


q−1
X
c(C) ≥ (y(vi+1 ) − y(vi )) + (y(v1) − y(vq )) = 0
i=1
5.2. CRITERIO DE OPTIMALIDAD 101

Ası́, x tiene costo mı́nimo por el teorema anterior y por tanto no tiene ciclos
de costo negativo.
Por otro lado, usando el teorema anterior podemos asumir que la red
residual no contiene ciclos de costo negativo. Entonces para cada v ∈ V defi-
nimos y(v) como el mı́nimo costo de algún camino dirigido en Dx finalizando
en el nodo v. Es fácil verificar que cada arco a = (v, w) del camino se cumple
que c(a) ≥ y(w) − y(v) finalizando la demostración.
Un potencial factible también puede ser visto como el dual del proble-
ma de flujo de costo mı́nimo. Presentamos una segunda demostración del
corolario (4).
Demostración: El problema de flujo de costo mı́nimo puede ser formu-
lado de la forma(P):
X X
mı́n c(a)x(a) = máx −c(a)x(a)
a∈A a∈A
sujeta a
X X
x(a) − x(a) = b(v), ∀v ∈ V
a∈δ+ (v) a∈δ− (v)

x(a) ≤ u(a), ∀a ∈ A
x(a) ≥ 0, ∀a ∈ A;
El modelo dual puede ser escrito de la siguiente forma (D):
X X
mı́n b(v)y(v) + u(e)z(e)
v∈V e∈E
sujeta a
y(v) − y(w) + z(a) ≥ −c(a), ∀a = (v, w) ∈ A
z(a) ≥ 0, ∀a ∈ A
Sea x ∈ R|A| un b-flujo y una solución factible del modelo primal (P). Por
el teorema de holguras complementarias, x es óptimo si y solo si existe una
solución dual (y, z) que cumplan las ecuaciones:

z(e)(u(e)−x(e)) = 0 y x(e) c(e)+z(e)+y(v)−y(w) = 0 ∀e = (v, w) ∈ A
Por tanto, x es óptimo si y solo si existe un par de vectores (y, z) con:
0 = −z(e) ≤ c(e) + y(v) − y(w), para e = (v, w) ∈ A con x(a) ≤ u(a)

Esto es equivalente a la existencia del vector potencial y(v) tal que c(a) +
y(v) − y(w) ≥ 0 para todos los arcos a = (v, w) en el grafo residual Dx .
Los resultados anteriores nos permiten construir algunos algoritmos para
resolver el problema de flujo de costo mı́nimo.
102 CAPÍTULO 5. PROBLEMAS DE FLUJO DE COSTO MÍNIMO

5.3. Algoritmo de Cancelación de ciclos ne-


gativos
El teorema 27 nos sugiere un algoritmo simple para resolver el proble-
ma de encontrar un b-flujo de costo mı́nimo, es decir, usaremos la idea de
construir ciclos aumentantes y eliminar aquellos que tengan costo negativo.

Algorithm 18 Algoritmo de cancelación de ciclos negativos


1: Entrada: Una instancia del problema de flujo de costo mı́nimo.
2: Salida: Un b-flujo de costo mı́nimo.

3: Calcular algún b-flujo x con x ≤ u


4: while exista un ciclo C en Dx con c(C) < 0 do
5: Modificar x aumentando ux (C) unidades de flujo sobre los arcos de C.
6: end while
7: retornar x.

Para visualizar el funcionamiento el algoritmo consideremos el siguiente


ejemplo:

Ejemplo 22 Dada la siguiente red:

-5
2 Arco Capacidad Costo Nodo Demanda
5 10 (1, 2) 5 2 1 −5
2 2 (1, 3) 5 2 2 −5
-5 51 5 1 4 6 (2, 4) 10 2 3 4
2 1
(3, 2) 5 1 4 6
5 5 (3, 4) 5 1
3
4

Iniciamos comprobando que b(V ) = b1 + b2 + b3 + b4 = 0, luego notemos


que el siguiente flujo es factible:
1 6
x: 1−
→2−
→4
4
1−
→ 3,

y tiene costo
c⊤ x := 1c1,2 + 6c2,4 + 4c1,3 = 22.
5.4. ALGORITMO DE CANCELACIÓN DE CICLOS DE COSTO MEDIO MÍNIMO103

Por otro lado, consideremos el ciclo P : 1 3 4 2 1 al cual asignaremos el


costo
cp := (c1,3 + c3,4 ) − (c2,4 + c1,2 ) = −1.
| {z } | {z }
arcos hacia adelante arcos en reversa

Si retiramos cp a los arcos hacia adelante y lo aumentamos en los arcos en


reversa, obtendremos el flujo
5 1
x: 1−
→3−
→4
5
2−
→ 4,

y este flujo tiene costo

c⊤ x = 5c2,4 + 5c1,3 + 1c3,4 = 12,

el cual es menor al del flujo anterior.

El algoritmo termina cuando x sea de costo mı́nimo por el Teorema 27.


Sin embargo, similar al caso del algoritmo de Ford-Fulkerson, es necesario
especificar la elección de los ciclos de costo negativo para obtener tiempos de
ejecución polinomiales.

5.4. Algoritmo de cancelación de ciclos de cos-


to medio mı́nimo
El algoritmo inicia construyendo un b-flujo. Dicho flujo puede ser cons-
truido generando una transformación al problema de flujo máximo. Luego se
ingresa a un lazo que identifica en cada iteración ciclo de costo negativo y
termina cuando ya no existan. La diferencia con el algoritmo anterior es que
se selecciona ciclos de costo medio mı́nimo en cada iteración lo que produce
un comportamiento polinomial. El costo medio de un ciclo dirigido C en Dx
es definido como
P
c(C) ca
ςm (C) = = a∈C ,
|C| |C|

donde |C| denota la longitud del ciclo. El Algoritmo 19 describe el algoritmo


de cancelación de ciclos de costo medio mı́nimo.
Por el teorema de optimalidad tenemos el siguiente resultado:

Teorema 28 Un b-flujo x es óptimo si y solo si ςm (x) ≥ 0.


104 CAPÍTULO 5. PROBLEMAS DE FLUJO DE COSTO MÍNIMO

Algorithm 19 Algoritmo de cancelación de ciclos de costo medio mı́nimo


1: Entrada: Una instancia del problema de flujo de costo mı́nimo
2: Salida: Un b-flujo de costo mı́nimo

3: Calcular algún b-flujo x con x ≤ u


4: while exista un ciclo C en Dx cuyo peso medio es mı́nimo do
5: Calcular ux (C) = mı́na∈E(C) {ux (a)}
6: Modificar x aumentando ux (C) unidades de flujo sobre los arcos de C.
7: end while
8: retornar x.

Ahora, el objetivo de la sección es probar la polinomialidad del Algoritmo


19.
Iniciamos presentando que el costo medio mı́nimo en cada iteración del
algoritmo es no decreciente.

Lema 25 Sea x1 , x2 , . . . , xt una secuencia de b-flujos tal que xi+1 resulta de


xi por incremento de flujo sobre el ciclo Ci , para todo i = 1, . . . , t−1. Además,
sea Ci el ciclo de costo medio mı́nimo en Dxi con ςm (Ci ) < 0 . Entonces:

1. ςm (Ck ) ≤ ςm (Ck+1 ) para todo k


n
2. ςm (Ck ) ≤ n−2 ςm (Cl ) para todo k < l tal que Ck ∪ Cl contiene un par de
aristas en reversa.

Demostración:

1. Sean xk y xk+1 dos b-flujos consecutivos en la secuencia. Es posible


construir un grafo Euleriano H = (V, A(Ck ) ∪ A(Ck+1 )) mediante la
eliminación de los arcos en reversa y arcos que aparecen en los 2 ciclos
son contados 2 veces. El grafo H es un subgrafo de Dk ya que los arco
en A(Dk+1 ) \ A(Dk ) deben ser arcos en reversa en A(Ck ). Ya que H es
Euleriano puede ser descompuesto en ciclos donde cada uno de estos
ciclos tiene costo medio de al menos ςm (Ck ). Por tanto se tiene que
c(A(H)) ≥ ςm (Ck ) × |A(H)| ya que ςm (Ck+1 ) es mayor. Dado que el
costo total de cada par de arcos en reversa es cero, se tiene:

c(A(H)) = c(A(Ck ))+c(A(Ck+1 )) = ςm (Ck )×|A(Ck )|+ ςm (Ck+1 )×|A(Ck+1 )|

k ))
haciendo c(A(Ck )) = c(A(C
|A(Ck )|
|A(Ck )| = ςm (Ck )|A(Ck )|. Dado que el sub-
grafo H tiene menos arcos que los 2 ciclos |A(H)| ≤ |A(Ck )| + |A(Ck+1)|
5.4. ALGORITMO DE CANCELACIÓN DE CICLOS DE COSTO MEDIO MÍNIMO105

por la eliminación de arcos y ςm (Ck ) < 0, se concluye:


ςm (Ck )(|A(Ck )| + |A(Ck+1 )|) ≤ ςm (Ck )|A(H)|
≤ c(A(H))
= ςm (Ck )|A(Ck )| + ςm (xk+1 )|A(Ck+1 )|

concluyendo que ςm (Ck ) ≤ ςm (Ck+1 )


2. Por el literal anterior, es suficiente probar el lema para k, l, tal que
k < i < l y Ci ∪Cl no contienen pares de arcos en reversa. Consideremos
el grafo H del literal anterior. Ası́, H es un subgrafo de Dk debido a
que algún arco en A(Cl )\A(Dk ) debe ser el arco en reversa en alguno de
los ciclos Ck , . . . , Cl−1 . Debido a la selección de k y l, solo Ck entre estos
tiene un arco en reversa en Cl . Usando c(A(H)) ≥ ςm (Ck ) × |A(H)| ,
c(A(H)) = ςm (Ck ) × |A(Ck )| + ςm (Cl ) × |A(Cl ) y dado que |A(H)| ≤
|A(Ck )| + n−2
n
|A(Cl )| por la eliminación de al menos 2 arcos, se obtiene:
n−2 
ςm (Ck ) |A(Ck )| + |A(Cl )| ≤ ςm (Ck )|A(H)|
n
≤ c(A(H))
= ςm (Ck )|A(Ck )| + ςm (Cl )|A(Cl )|
n
implicando que ςm (Ck ) ≤ ς (C ).
n−2 m l

Corolario 5 Durante la ejecución del algoritmo de cancelación de ciclos de


costo medio mı́nimo, | ςm (C)| decrece por lo menos en un factor de 1/2 cada
mn iteraciones.
Demostración: Sea Ck , Ck+1 , . . . , Ck+m una secuencia de ciclos de iteraciones
consecutivas del algoritmo. Dado que cada uno de estos ciclos dispone de un
arco que es cuello de botella, es decir, será removido del grafo residual y se
incluirá el arco en reversa. Podemos usar los ciclos Ci y Cj con k ≤ i < j ≤
k + m cuya unión tiene un par de arcos en reversa. Por el literal (b) del lema
anterior se tiene que:
n n
ςm (Ck ) ≤ ςm (Ci ) ≤ ςm (Cj ) ≤ ςm (Ck+m )
n−2 n−2
Ası́ | ςm (C)| decrece por un factor de n−2
n
en cada una de las m iteraciones.
Como resultado se sigue que:
n − 2 m 1
≤ e−1 <
n 2
106 CAPÍTULO 5. PROBLEMAS DE FLUJO DE COSTO MÍNIMO

El problema de encontrar ciclos de costo medio mı́nimo puede ser resuelto


usando programación dinámica, de forma similar al problema de caminos más
cortos.
Como conclusión de la presente sección y usando el teorema anterior se
tiene el tiempo de ejecución del algoritmo del flujo de costo mı́nimo:

Teorema 29 Un b−flujo de costo mı́nimo puede ser encontrado en O(n2 m3 log(n)).


Si b y u son enteros, entonces el flujo x también es entero.

5.5. Algoritmo de caminos más cortos conse-


cutivos
En la presente sección se reporta un algoritmo alternativo para calcular el
flujo de costo mı́nimo el que es basado en algoritmos de caminos más cortos.
Por simplicidad asumiremos que todos los arcos tienen costo no negativo(c :
A → R+ ). El siguiente teorema nos proporciona una idea para un nuevo
algoritmo.

Teorema 30 Dada una instancia del problema de flujo de costo mı́nimo y


sea x un b−flujo de costo mı́nimo. Sea P un camino más corto respecto a
c en Dx para algún s, t ∈ V y x′ el flujo obtenido cuando se aumenta al
flujo sobre los arcos del camino P en a lo más el mı́nimo de las capacidades
residuales de los arcos de P . Entonces x′ es un b′ −flujo de costo mı́nimo,
para algún b′ .

Demostración: Sea x′ un b′ −flujo para algún b′ ∈ R|V | . Supongamos de


que b′ no es un flujo de costo mı́nimo. Entonces por el teorema del criterio
de optimalidad, existe un ciclo C en Dx con costo negativo. Consideremos el
grafo H = (V, A(C) ∪ A(P )) eliminando pares en reversa. Esto es posible ya
que siempre existen los arcos cuello de botella.
Para algún arco a ∈ Ax′ \ Ax , el arco en reversa de a debe estar en
P y además se conoce que A(C) ∪ A(P ) ⊆ Ax . Tenemos que c(A(H)) =
c(C) + c(P ) ≤ c(P ) ya que C es de costo negativo. Pero dado que A(H) ⊆ Ax ,
ninguno de los ciclos puede tener costo negativo, ya que otro caso x no serı́a
de costo mı́nimo. Por tanto H y Dx contienen un st−camino de menor costo
que P contradiciendo la elección de P .

Lema 26 Sea x ≤ u un b-flujo en D, s, t ∈ V y P el camino más corto de


s a t en Dx . Aumentando γ ≤ ux (P ) unidades de flujo sobre los arcos de P ,
5.5. ALGORITMO DE CAMINOS MÁS CORTOS CONSECUTIVOS 107

se obtiene un nuevo b′ −flujo x′ ≤ u en D con:



b(v) + γ, si v = t


b (v) = b(v) − γ, si v = s


b(v), otro caso

Demostración: Sea y(v) el camino más corto de s a v en el grafo residual


Dx . Entonces:

c((v, w)) ≥ y(w) − y(v), ∀(v, w) ∈ Ax

y la igualdad se tiene para todo arco en P . En particular, en los arcos en


reversa:
c(a) = −c(a) = y(v) − y(w), ∀a = (v, w) ∈ P
Dado que el conjunto de arcos en el grafo residual de x′ esta contenido en el
conjunto de arcos del grafo residual del flujo x unido a los arcos en reversa
del camino P (Ax′ ⊆ Ax ∪ {a : A ∈ P }) determina que la propiedad del
potencial sobre los nodos p se verifica también sobre el flujo x′ , es decir, es
de costo mı́nimo.
Usando estas ideas se plantea el siguiente algoritmo:

Algorithm 20 Algoritmo de caminos más cortos sucesivos


1: x(a) = 0, para todo a ∈ A.
2: while b 6= 0 do
3: Escoger s, t ∈ V con b(s) > 0 y b(t) < 0
4: Calcular el camino más corto entre s y t en Dx
5: Calcular γ = mı́n{b(s), −b(t), ux (P )}
6: Aumentar el flujo
( x en γ unidades sobre los arcos de P
x(a) + γ, si a ∈ P ∩ A
7: x(a) =
x(a) − γ, si a ∈ P ∩ A
8: Actualizar b(s) = b(s) − γ y b(t) = b(t) + γ
9: end while

Si permitimos capacidades arbitrarias se generan algunos problemas co-


mo en el algoritmo de Ford-Fulkerson. Por tanto unicamente nos remitimos
a capacidades u y demandas b enteras. Usando este dato, es claro que el
algoritmo de caminos más cortos sucesivos para luego de a lo más
1X
B= |b(v)|
2 v∈V
108 CAPÍTULO 5. PROBLEMAS DE FLUJO DE COSTO MÍNIMO

y por los teoremas anteriores el b-flujo es óptimo.


Cada incremento de flujo requiere el cálculo de un camino más corto,
donde se puede usar Dikjstra o el algoritmo de Ford-Bellman si los costos
son conservativos, generando un tiempo de ejecución de orden O(Bmn). Sin
embargo si los costos son no negativos se tiene:

Teorema 31 Si las capacidades y las demanda son enteras, entonces el al-


goritmo de caminos más cortos sucesivos puede ser implementado en orden
O(nm + B(m + nlog(n))).

Ejemplo 23 Encontrar un flujo de costo mı́nimo en la siguiente red:

-2 -6
10
2 4
5 3 10
5 10
-5 1
5 10 5 5 3 6 8
10 5
5 10 5
3 5
10
-5 10

Arco Capacidad Costo Nodo Demanda


(1, 2) 5 5 1 −5
(1, 3) 5 10 2 −2
(2, 4) 10 3 3 −5
(3, 2) 10 5 4 −6
(3, 5) 10 10 5 10
(4, 5) 5 3 6 8
(4, 6) 10 10
(6, 5) 5 5

Comenzaremos con el siguiente flujo factible:


5 10
x: 1−
→3−
→5
2 8
2−
→4−
→ 6,

con costo
c⊤ x = 5c1,3 + 10c3,5 + 2c2,4 + 8c4,6 = 236.
Encontramos el grafo residual:
5.5. ALGORITMO DE CAMINOS MÁS CORTOS CONSECUTIVOS 109

Arco Costo
(1, 2) 5
3
(3, 1) −10
2 4 10 (2, 4) 3
5 -3 (4, 2) −3
-10
3
(3, 2) 5
51 5 6
(5, 3) −10
-10 5 (4, 5) 3
3 5 (4, 6) 10
-10
(6, 4) −10
(6, 5) 5

Aquı́ debemos buscar un circuito de costo negativo. Por ejemplo, está

C: 1 2 4 5 3 1,

el cual tiene costo c(C) = 5 + 3 + 3 − 10 − 10 = −9, y capacidad



ε(C) = mı́n {5, 8, 5}, {10, 10} = 5.

Como C es un circuito de costo negativo en la red residual, procedemos a


calcular un nuevo flujo sobre la red mediante:


xa + ε(C) si a ∈ C ,

xa = xa − ε(C) si a ∈ C ↓ ,


xa si a ∈
/ C.

Ası́ obtenemos que

5 7 8
x: 1−
→2−
→4−
→6
5
4−
→5
5
3−
→ 5,

con costo
c⊤ x = 5c1,2 + 7c2,4 + 8c4,6 + 5c4,5 + 5c3,5 = 191.

Este flujo es de costo inferior al anterior y nos da paso al siguiente grafo


residual:
110 CAPÍTULO 5. PROBLEMAS DE FLUJO DE COSTO MÍNIMO

Arco Costo
(2, 1) −5
(1, 3) 10
3
2 4 10 (2, 4) 3
-5 -3 (4, 2) −3
-10
(3, 2) 5
1
5 5 -3 6
(3, 5) 10
10 10 5 (5, 3) −10
3 5 (5, 4) −3
-10 (4, 6) 10
(6, 4) −10
(6, 5) 5

Si inspeccionamos el grafo, podemos darnos cuenta que aparentemente no


existen ciclos de costo negativo. Sin embargo, por completitud vamos a aplicar
el Algoritmo de Bellman – Ford BF para construir un potencial, en caso de
existir dicho potencial, entonces podremos asegurar que el flujo x es de costo
mı́nimo.
Definimos s := 1, aunque esta selección es arbitraria, creamos el candi-
dato a potencial y y los predecesores p como

Nodo i s 2 3 4 5 6
Potencial yi 0 ∞ ∞ ∞ ∞ ∞
Predecesor pi −1 −1 −1 −1 −1 −1

Iteraciones

1. Buscamos (i, j) ∈ Ax que verifique yj > yi + ci,j : Este es el caso de


(1, 3) y ası́ redefinimos y3 = ys + c1,3 y p3 = 1.

i s 2 3 4 5 6
yi 0 ∞ 10 ∞ ∞ ∞
pi −1 −1 0 −1 −1 −1

2. Repetimos la búsqueda y modificamos (3, 2) y (3, 5), de donde

i s 2 3 4 5 6
yi 0 15 10 ∞ 20 ∞
pi −1 3 0 −1 3 −1

3. En este caso, los arcos a actualizar son (2, 4) y (5, 4), entonces
5.6. FLUJO SOBRE TIEMPO 111

i s 2 3 4 5 6
yi 0 15 10 17 20 ∞
pi −1 3 0 5 3 −1

4. Ahora nos movemos por (4, 2) y (4, 6):

i s 2 3 4 5 6
yi 0 14 10 17 20 27
pi −1 4 0 5 3 4

5. Para este paso, notemos que el algoritmo ha llegado a su fin, pues no


hay más nodos por actualizar; es decir, no necesitamos revisar siquie-
ra los potenciales de nuevo para notar que no existen ciclos de costo
negativo.

Arco Costo Diferencia de potencial


(i, j) ci,j yj − yi
(2, 1) −5 −14
(1, 3) 10 10
(2, 4) 3 3
(4, 2) −3 −3
(3, 2) 5 4
(3, 5) 10 10
(5, 3) −10 −10
(5, 4) −3 −3
(4, 6) 10 10
(6, 4) −10 −10
(6, 5) 5 −7

Notemos que adicionalmente el flujo x satisface:

ci,j > 0 implica xi,j = 0,


ci,j < 0 implica xi,j = ui,j .

Podemos concluir que x es un flujo de costo mı́nimo.

5.6. Flujo sobre tiempo


En la presente sección consideramos una versión dinámica del flujo, el
llamado flujo sobre tiempo. En esta versión el valor del flujo sobre cada arco
112 CAPÍTULO 5. PROBLEMAS DE FLUJO DE COSTO MÍNIMO

puede cambiar en el tiempo y el flujo entrando en cada arco llega al nodo final
luego de un determinado tiempo. En cada tiempo a lo más u(a) unidades de
flujo puede ser enviado por el arco y toma τ (a) unidades de tiempo atravesar
el arco a.

Definición 27 Un flujo dinámico en D = (V, A) es una función x : A×R →


R+ respetando la restricción de capacidad:

x(a, θ) ≤ u(a)

para todo a ∈ A y θ ∈ R

Interpretamos x(a, θ) como el flujo sobre el arco a en el tiempo θ. El costo


de un flujo dinámico es definido como:
X Z +∞
c(x) = c(a) x(a, θ)dθ
a∈A −∞

Diremos que un flujo dinámico satisface la propiedad de conservación de


flujo en el nodo i ∈ V en el tiempo θ si:
X Z θ X Z θ
x(a, z − τ (a))dz ≥ x(a, z)dz
a∈δ+ (i) −∞ a∈δ− (i) −∞

La restricción anterior indica que en el tiempo θ, el monto del flujo a la


izquierda del nodo i(derecha de la ecuación anterior), es a lo más el flujo
que alcanza el nodo i hasta el tiempo θ (izquierda de la ecuación anterior).
Observe que es posible generar esperas del flujo sobre un nodo i hasta que
exista capacidad suficiente para ser transportado.
Un flujo dinámico con horizonte de tiempo T > 0 es un flujo dinámico x
tal que:
x(a, θ) = 0, ∀a ∈ A, ∀θ 6∈ [T − τ (a)]
indicando que ningún flujo es enviado luego del horizonte T
Los problemas anteriores pueden ser extendidos a flujos sobre tiempo:

FLUJO MÁXIMO SOBRE TIEMPO

Una red R = (V, A, u), dos nodos s, t ∈ V , tiempos de tránsito τ :


A → R+ y un horizonte de tiempo T ∈ R+ .

Encontrar un st-flujo sobre tiempo x tal que |x| = f (t, T ) sea maximi-
zado.
5.6. FLUJO SOBRE TIEMPO 113

Para resolver el problema podemos considerar una versión discretizada y


presentar la idea de una red expandida.
Para muchas aplicaciones las variantes discretas son de mucho interés. En
esta variante x(a, θ) : A × {0, 1, . . . , T } → R+ que es un flujo que solo puede
ser enviado en momentos enteros θ ∈ {0, 1, . . . , T } sobre el arco a y alcanza
el final del arco en el tiempo θ + τ (a) entero.
Definición 28 (Flujo dinámico discreto con horizonte de tiempo T)
Un flujo dinámico en tiempo discreto con horizonte de tiempo T > 0 es una
función x : A × {0, 1, . . . , T } → R+ respetando la restricción de capacidad:

x(a, θ) ≤ u(a), para todo a ∈ A y para todo θ ∈ {0, 1, . . . , T − 1}

Ası́, fácilmente el costo puede ser transformado del caso continuo definido
por:
XX T −1
c(x) = x(a, θ)
a∈A θ=0

La conservación de flujo en el nodo i ∈ V en el tiempo θ es:


T −τ (a) T −τ (a)
X X X X
x(a, z) = x(a, z)
a∈δ+ (i) z=0 a∈δ− (i) z=0

El valor del flujo dinámico discreto es:


T −τ (a)
X X
|x| = x(a, z)
a∈δ+ (s) z=0

Existe un nuevo aspecto de la versión discreta comparado con la versión


continua que facilita los cálculos y la construcción de algoritmos. Ası́, el pro-
blema de flujo sobre tiempo en una red R = (V, A, u) puede ser transformada
a una red expandida en el tiempo D T = (V T , AT ). La idea hacer copias de
cada nodo V en cada momento en el tiempo:

V T = {iθ : i ∈ V, θ = 0, 1, . . . , T − 1}
AT = {(iθ , jθ+τ (i,j) ) : (i, j) ∈ A, θ = 0, 1, . . . , T − 1 − τ (i, j)}

Si se consideran esperas en cada nodo, entonces incluimos arcos (iθ , iθ+1 ).


Las capacidades y costos de los arcos son derivados de la red original. Los
arcos de espera tienen costo cero y capacidad infinita.
Dada la red original en la figura ??, la red expandida puede ser visualizada
en la figura ??.
114 CAPÍTULO 5. PROBLEMAS DE FLUJO DE COSTO MÍNIMO

Teorema 32 Sea R = (V, A, u) una red costos c, tiempo de tránsito τ y


horizonte de tiempo T . Todo flujo dinámico continuo g con horizonte de
tiempo T corresponde a un flujo discreto g ′ equivalente con horizonte de
tiempo T , y viceversa. En particular los costos son los mismos y las esperas
y no esperas pueden ser consideradas.

2
2 1

1 4 4

3 1
3
Figura 5.1: Red R=(V,A,τ ) con T = 5 y definimos s = 1 y t = 4
5.6. FLUJO SOBRE TIEMPO 115

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

(1,4) (2,4) (3,4) (4,4)

(1,3) (2,3) (3,3) (4,3)

(1,2) (2,2) (3,2) (4,2)

(1,1) (2,1) (3,1) (4,1)

(1,0) (2,0) (3,0) (4,0)

Figura 5.2: Red expandida


116 CAPÍTULO 5. PROBLEMAS DE FLUJO DE COSTO MÍNIMO
Capı́tulo 6

Emparejamiento

6.1. Introducción
El problema de emparejamiento es uno de los problemas clásicos y más
importantes en la optimización combinatoria. Para este problema, todos los
grafos serán no dirigidos. Un emparejamiento sobre un grafo G = (V, E) es
un conjunto de aristas disjuntas por pares. Ası́, nuestro principal problema
será el siguiente:

[MP]: Problema de emparejamiento máximo


Sean G = (V, E) un grafo no dirigido, c : A → R una función de costos
sobre los arcos. La tarea consiste en encontrar un emparejamiento de
cardinalidad máximo sobre G

Podemos mencionar la siguiente aplicación asociada al problema de asig-


nación de trabajos: Dado un conjunto de J con n trabajos y un conjunto S
con m empleados. Cada trabajo tiene un tiempo de procesamiento ti ∈ R+ y
cada trabajador dispone de un subconjunto de trabajos que puede ejecutar.
La tarea consiste en una asignación de trabajos a empleados tal que el tiempo
total de procesamiento sea minimizado.
Dado un grafo bipartito G =P (V, E) con partición V = A ∪ B, tenemos
+
que encontrar x : E → R con e∈δ(i) xij = 1 para cada trabajo i ∈ A y
P
e∈δj xij ≤ 1 para cada empleado j ∈ B. Podemos escribir esto como un
sistema de desigualdad lineal {x ≥ 0, Mx ≤ 1, M ′ x ≥ 1}, donde las filas
de M y M ′ son filas de la matriz de incidencia nodo-arista de G. Se conoce
que estas matrices son totalmente unimodulares y podemos concluir que si
existe alguna solución x, entonces dicha solución es entera. Ahora observe
que las soluciones integrales del sistema de desigualdad lineal anterior son

117
118 CAPÍTULO 6. EMPAREJAMIENTO

precisamente los vectores de incidencia de las coincidencias en G que cubren


el conjunto A.

Definición 29 Sea G un grafo y M un emparejamiento en G. Decimos que


un nodo v es cubierto por M si v es un extremo de e ∈ M. M se llama un
emparejamiento perfecto si todos los vértices están cubiertos por M.

Iniciamos nuestro estudio considerando emparejamientos sobre grafos bi-


partitos.

6.2. Emparejamiento sobre grafos bipartitos


Iniciamos esta unidad presentando algunos resultados importantes asocia-
dos a casos particulares del problema de flujos sobre redes en los cuales todos
los arcos tienen capacidades iguales a 1. Bajo estas condiciones, todos los st-
flujos son enteros y pueden ser descritos como una colección de st-caminos.
Presentamos los siguientes resultados reportados por Menger(1927). Llama-
mos a dos caminos disjuntos por aristas si no tienen una arista en común.

Teorema 33 Sea G un grafo (dirigido o no dirigido), s y t dos nodos, y


k ∈ N . Entonces hay k st-caminos disjuntos por aristas si y solo si después
de eliminar cualquier k − 1 aristas todavı́a se puede llegar de s a t.

Demostración: La necesidad es obvia. Para probar la suficiencia en el caso


dirigido, definimos la red capacitada (G, u, s, t) con capacidades unitarias
para todo arco en G tal que t es alcanzable desde s incluso después de eliminar
k−1 aristas. Esto implica que la capacidad mı́nima de un st−corte es al menos
k. Por los resultados del capı́tulo anterior, se conoce que existe un st-flujo
entero de valor al menos k y puede ser puede ser descompuesto en caminos
con flujo entero de s a t (y posiblemente en algunos circuitos). Dado que
todas las capacidades son 1, debemos tener al menos k st−caminos disjuntos
de aristas.
Para probar la suficiencia en el caso no dirigido, sea G un grafo no diri-
gido con dos vértices s y t tales que t es alcanzable desde s incluso des-
pués de eliminar k − 1 aristas. Esta propiedad obviamente sigue siendo
cierta si reemplazamos cada arista no dirigida e = {v, w} por cinco arcos
(v, xe), (w, xe), (xe, ye), (ye, v), (ye, w) donde xe y ye son nodos auxiliares.
Ahora tenemos un dı́grafo G′ y por la primera parte, k st−caminos disjun-
tos por aristas existen en G′ . Estos se pueden transformar fácilmente en k
st−caminos disjuntos por aristas en G.
6.2. EMPAREJAMIENTO SOBRE GRAFOS BIPARTITOS 119

Ahora consideramos la versión disjunta de nodos del teorema de Menger.


Llamamos a dos caminos disjuntos por nodos si no tienen una arista ni un
nodo en común (pueden tener uno o dos puntos finales comunes).

Teorema 34 Sea G un grafo (dirigido o no dirigido), sean s y t dos nodos


no adyacentes, y k ∈ N. Entonces hay k st−caminos disjuntos por nodos sı́
y solo si después de eliminar cualquier k − 1 nodos (distintos desde s y t) t
sigue siendo alcanzable desde s.

Demostración: Nuevamente la necesidad es trivial. La suficiencia en el caso


dirigido se sigue de la parte dirigida del anterior por la siguiente construcción
elemental: reemplazamos cada nodo v ∈ V (G) por dos nuevos nodos v 1 y v 2
y una arista (v 1 , v 2 ). Cada arista (v, w) ∈ E(G) se reemplaza por (v 2 , w 1 ).
Cualquier conjunto de k − 1 aristas en el nuevo grafo G′ cuya eliminación
hace que t1 sea inalcanzable desde s2 implica un conjunto de a lo sumo k − 1
nodos en G cuya eliminación hace que t no sea alcanzable desde s. Además,
los s2 − t1 −caminos disjuntos por aristas en el nuevo grafo corresponden a
st−caminos disjuntos de nodos en el anterior.
Asumiremos para esta sección que G = (V, E) es bipartito, conexo y
admite un partición V = A ∪ B. Ası́, este problema puede ser reducido
fácilmente al problema de flujo máximo de la siguiente forma: Creamos dos
super nodos s, t que serán conectados con los nodos del conjunto A y con los
nodos del conjunto B respectivamente. Las capacidades de los arcos serán
fijadas a 1 para todos los arcos y buscaremos el st-flujo máximo.
Para un grafo G, definimos ν(G) la cardinalidad máxima de un empareja-
miento en G, mientras que τ (G) es la cardinalidad mı́nima de un cubrimiento
de nodos en G.

Teorema 35 (König [1931])Si G es bipartito, entonces ν(G) = τ (G).

Demostración: Considere el grafo de la transformación anterior. Entonces


ν(G) es el número máximo de caminos de s a t disjuntos, mientras que τ (G)
es el número mı́nimo de nodos cuya eliminación hace que t sea inalcanzable
desde s. El teorema ahora se sigue inmediatamente por los resultados de
Menger.
Evidentemente se tiene que ν(G) ≤ τ (G) para cualquier grafo, bipartito
o no, pero no se tiene igualdad in general. Podemos considerar un triángulo
con nodos u, v, w, donde el emparejamiento usa una sola aristas mientras que
para un cubrimiento necesitamos dos nodos.
Notaremos por N(X) al conjunto de vecinos de X y es definido por
N(X) := {v ∈ V (G) \ X : E(X, {v}) 6= ∅}. Presentamos algunos resultados:
120 CAPÍTULO 6. EMPAREJAMIENTO

Teorema 36 Sea G = (V, E) un grafo bipartito con V = A ∪ B. Entonces


G tiene un emparejamiento cubriendo el conjunto A si y solo si:

|N(X)| ≥ |X|, para todo X ⊂ A (6.1)

Demostración: Para probar la suficiencia podemos asumir que G no tiene


emparejamientos cubriendo A, es decir, ν(G) < |A|. Por el resultado anterior
se tiene que τ (G) < |A|.
Sea A1 ⊆ A, B 1 ⊆ B tal que A1 ∪ B 1 cubre todas las aristas y |A1 ∪ B 1 | <
|A|. Obviamente N(A \ A1 ) ⊆ B 1 . Además |N(A \ A1 )| ≤ |B 1 | < |A| − |A1 | =
|A \ A1 |, y la condición (6.1) es violada, demostrando el resultado.
Un caso especial es el llamado teorema del matrimonio.

Teorema 37 Sea G = (V, E) un grafo bipartito con V = A ∪ B. Entonces G


tiene un emparejamiento perfecto si y solo si |A| = |B| y N(X)| ≥ |X| para
todo X ⊆ A.

La demostración del teorema de König nos da una idea de como podemos


proponer un algoritmo de solución para el problema.

Teorema 38 El problema de emparejamiento de cardinalidad máxima para


un grafo bipartito G = (V, E) puede ser resuelto en un tiempo O(|V ||E|)

Demostración: Aplicando la transformación del grafo bipartito a una ins-


tancia del problema de flujo máximo, podemos aplicar el algoritmo de Edmonds-
Karp y encontrar un st-flujo máximo y por tanto un emparejamiento máximo
luego de encontrar |V |/2 caminos aumentantes. Dado que encontrar un ca-
mino toma un tiempo igual a O(|E|), se tiene el resultado.
Podemos reformular la idea de un camino aumentante al contexto del
problema de emparejamiento.

Definición 30 Sea G = (V, E) un grafo no dirigido(bipartito o no) y sea


M algún emparejamiento en G. Un camino P es un M−camino alternan-
te si E(P ) \ M es un emparejamiento. Un M−camino alternante es M−
aumentante si sus puntos extremos no están cubiertos por M

Inmediatamente se puede verificar que un M− aumentante tiene longitud


impar.

Teorema 39 (Berge[1957]) Sea G = (V, E) un grafo no dirigido con algún


emparejamiento M. Entonces M es máximo si y solo si no existen caminos
M−aumentantes.
6.2. EMPAREJAMIENTO SOBRE GRAFOS BIPARTITOS 121

Demostración: Sı́ existe un camino M− aumentante P , la diferencia E(P )\


M es un emparejamiento y tiene cardinalidad mayor que M, por tanto M no
es máximo. Por otro lado, si existe un emparejamiento M 1 tal que |M 1 | >
|M|, la diferencia entre M 1 y M es la unión disjunta de nodos y caminos
alternos, donde al menos un camino debe ser M−aumentante.

6.2.1. Formulación lineal entera


El problema de emparejamiento consiste en la selección de un subconjunto
de aristas sujeto a restricciones de grado sobre los nodos. El caso más simple
es el caso en que cada nodo puede tener a lo más una arista adyacente y
lo notaremos como 1-emparejamiento o solo emparejamiento. Todo grafo G
contiene un emparejamiento M = ∅
Una obvia generalización del problema anterior es el b− emparejamiento
en el cual el nodo i ∈ V puede ser adyacente a no más de bi aristas, donde bi
es un número entero positivo.Un b− emparejamiento es llamado perfecto si en
las restricciones de grado sobre cada nodo se tiene igualdad. Otra variante
sobre los emparejamiento es cuando se requiere al menos bi aristas sobre
cada nodo i ∈ V . Al igual que en la versión simple, el problema es llamado
el problema de cubrimiento de nodos.
Formalmente el problema puede ser definido:

[MP]: Problema de emparejamiento


Sean D = (V, E) un grafo, c : A ⇒ R una función de costos sobre las
aristas y una función b : V → Z + . El problema de b-emparejamiento
ponderado consiste en encontrar un b-emparejamiento de peso máximo,
es decir, cada nodo i es adyacente con a lo más bi aristas.

En el caso de un emparejamiento perfecto, también se puede modificar el sen-


tido de la optimización y buscar el emparejamiento de peso mı́nimo. Cuando
ce = 1, para toda arista en E, el problema es llamado como no ponderado o
el problema de cardinalidad.
El problema puede ser formulado usando programación lineal entera de
la siguiente forma: Usamos variables asociadas a cada uno de los arcos del
grafo
(
1, si la arista e ∈ E se encuentra en el emparejamiento
xe =
0, caso contrario
122 CAPÍTULO 6. EMPAREJAMIENTO

Ası́, el modelo de programación lineal puede ser formulado:


X
máx ce xe
e∈E
s.a.r.
X
xe ≤ bv , ∀v ∈ V
e∈δ(v)

xe ∈ {0, 1}, ∀e ∈ E.

Matricialmente el problema puede ser expresado:

máx cx
s.a.r.

Ax ≤ b
x ∈ {0, 1}|E|

donde A es la matriz de incidencia nodo-arista.


La propiedad importante de la matriz A para el problema es que en
cada
P columna contiene exactamente dos valores distintos de cero, es decir,
j∈V aje = 2, para todo e ∈ E. Notar que si el grafo es bipartito, entonces
la matriz A es totalmente unimodular, lo que implica que la relajación lineal
del problema anterior retorna siempre valores enteros. Sin embargo, cuando
G contiene ciclos de longitud impar, las restricciones de loa relajación lineal
pueden contener puntos extremos fraccionarios. Ası́, si se tiene un grafo com-
pleto con tres nodos, la solución del problema lineal es x = (1/2, 1/2, 1/2),
usando c = (1, 1, 1) y b = (1, 1, 1).
La clásica aplicación del problema de emparejamiento consiste en juntar
elementos de distintos conjuntos (matrimonio, asignación, etc) y puede apa-
recer como subproblema en problemas de mayor complejidad(agente viajero).
Los problemas de emparejamiento son los primeros problemas de la his-
toria de la optimización combinatoria para los que se obtuvieron algoritmos
polinomiales. Estos algoritmos utilizan una clase de desigualdades válidas pa-
ra determinar la envolvente convexa del problema de emparejamiento y, de
hecho, prueban que estas desigualdades, junto con las restricciones de grado
de cada nodo y la no negatividad, dan una descripción de desigualdad lineal
de la envolvente convexa del problema.
Podemos enfocarnos en el emparejamiento modelado de la siguiente for-
ma:
6.2. EMPAREJAMIENTO SOBRE GRAFOS BIPARTITOS 123

X
máx ce xe
e∈E
s.a.r.
X
xe ≤ 1, ∀v ∈ V
e∈δ(v)

xe ∈ {0, 1}, ∀e ∈ E.
y matricialmente el problema puede ser expresado:
máx cx
s.a.r.

Ax ≤ 1
x ∈ {0, 1}|E|
Sea U ⊆ V se dice un conjunto impar |U| ≥ 3 y |U| impar. Se define una
desigualdad válida llamada restricción de conjunto impar :
X |U|
xe ≤ ⌊ ⌋, U ⊂ V . impar
2
e∈E[U ]

para la envolvente convexa del emparejamiento. Estas desigualdades son váli-


das dado que las aristas del emparejamiento usan siempre 2 nodos. Por su-
puesto, también son válidos cuando |U| es siete, pero no son interesantes
porque se pueden obtener como una combinación lineal no negativa de las
restricciones de grado y no negatividad. Los principales resultados de este
capı́tulo están ligados a la obtención de un algoritmo polinomial para el pro-
blema y una descripción de desigualdad lineal de la envolvente convexa. El
algoritmo resuelve el siguiente programa lineal

X
máx ce xe
e∈E
s.a.r.
X
xe ≤ 1, ∀v ∈ V
e∈δ(v)
X |U|
xe ≤ ⌊ ⌋, U ⊆V
2
e∈E[U ]

xe ∈ [0, 1], ∀e ∈ E.
124 CAPÍTULO 6. EMPAREJAMIENTO

y obtiene una solución entera óptima, que es un emparejamiento, para todo


vector c. Ası́, esto provee una demostración que la envolvente convexa del
problema del emparejamiento está dada por el grado de los nodos, la no
negatividad de las variables y las restricciones de conjunto impar.

6.3. Emparejamiento de cardinalidad máxi-


ma
En capı́tulos anteriores se indicó las condiciones necesarias y suficientes
para que un flujo sea máximo en términos de caminos aumentantes, es decir,
el flujo puede ser aumentado si y solo si existe un camino aumentante sobre
el grafo residual. Se conocen procedimientos eficientes para encontrar dichos
caminos o determinar que no existen. Podemos usar la misma idea para
encontrar emparejamientos de cardinalidad máxima. Iniciamos definiendo la
idea de camino aumentante con respecto al emparejamiento.
Dado un grafo G y un emparejamiento M, un camino en G se dice al-
ternante si sus arcos alterna entre M y E \ M. Un nodo v se dice que es
expuesto a M si ninguna arista de M es adyacente a v. Un camino en G
es aumentante relativo a M si éste es alternante y sus nodos extremos son
expuestos. Esta definición es natural, dado que si existe un camino aumen-
tante relativo a M , un nuevo emparejamiento M ′ con una arista adicional es
obtenido eliminando de M las aristas coincidentes en el camino y sumando
a M ′ las aristas no coincidentes en el camino.

Teorema 40 Un emparejamiento no es máximo si y solo si existe un camino


aumentante relativo a M.

Demostración: Sea E ′ el conjunto de arcos del camino aumentante y sea


M ′ = (M ∪ E ′ ) \ (M ∩ E ′ ). Entonces M ′ es un emparejamiento, y se tiene
|M ′ | = |M|+1. Eso formalmente establece la afirmación sobre la existencia de
un camino aumentante lo que implica que el emparejamiento no es máximo.
Ahora presentemos que si M no es máximo, entonces existe un camino
aumentente relativo a M. Si M no es máximo, existe un emparejamiento
M ′ con |M ′ | = |M| + 1. Sea D la diferencia simétrica de M y M ′ , esto es,
D = (M ∪ M ′ ) \ (M ∩ M ′ ). Ası́,

|D| = |M| + |M ′ | − 2|M ∩ M ′ | = 2|M| + 1 − 2|M ∪ M ′ |

por lo que se concluye que |M| es impar.


Consideremos el subgrafo G(D) = (V, D). Dado que M y M ′ son empare-
jamientos, el grado de cada nodo no es mayor a 2, y si el grado es 2, entonces
6.3. EMPAREJAMIENTO DE CARDINALIDAD MÁXIMA 125

una arista es de M y otra es de M ′ . Por tanto, cada componente de G(D)


es ya sea un nodo aislado, un ciclo conteniendo un número par de aristas, o
un camino alternante relativo a M y M ′ . Dado que |D| es impar, existe al
menos un camino camino alternante de longitud impar. Además, dado que
|M ′ | = |M| + 1, uno de estos caminos alternantes de longitud impar debe ser
aumentante con respecto a M.
La idea básica del algoritmo de caminos aumentantes es construir un árbol
de caminos aumentantes con raı́z en un nodo expuesto. Ası́, si una hoja del
árbol es también expuesta, un camino aumentante ha sido encontrado. Ini-
ciamos describiendo un algoritmo para encontrar caminos aumentantes para
grafos bipartitos ya que encontrar uno en este tipo de grafos es mucho más
fácil que encontrar uno en un grafo general. El camino puede ser determinan-
do encontrando mediante una transformación al problema de flujo máximo.
El siguiente algoritmo es esencialmente un algoritmo de flujos descrito con
la terminologı́a de caminos aumentantes.

Algorithm 21 Cardinalidad máxima para grafos bipartitos


Entrada: Un grafo bipartito G = (V, E) y un emparejamiento M.
Salida: Un emparejamiento M ′ con |M ′ | > |M|, si existe alguno.
Hacer un grafo dirigido DM = (U ∪ W, A) orientando cada arista {u, w} ∈
E, con u ∈ U, w ∈ W , de la forma:

si e ∈ M, entonces orientar la arista (w, u)

si e 6∈ M, entonces orientar la arista (u, w)

Sea UM ⊂ U y WM ⊂ W los conjuntos de nodos no usados por M.


Encontrar un camino M- aumentante en DM de algún nodo en UM a WM .
Si existe, entonces se tiene un emparejamiento de longitud mayor que M.

La correctitud de este algoritmo es inmediato. Dado que un camino diri-


gido puede ser encontrado en un tiempo O(m), el camino aumentante puede
ser encontrado en dicho tiempo. Entonces tenemos el siguiente resultado.
Teorema 41 Un emparejamiento máximo en un grafo bipartito puede ser
encontrado en un tiempo O(nm)
Usando el algoritmo BFS e iniciando en cada nodo del grafo, se tiene el
resultado.
El problema anterior puede ser resuelto mediante una transformación a
un problema de flujo máximo.
Teorema 42 Un emparejamiento de cardinalidad máxima puede ser encon-
trado por una transformación al problema de flujo máximo
126 CAPÍTULO 6. EMPAREJAMIENTO

Demostración: Sea G = (V, E) un grafo bipartito, donde V = U ∪ W .


Hacemos un grafo dirigido D = (V, A)como sigue. Orientamos todas las
aristas de U.a W e incluimos dos nodos adicionales s, t y arcos (s, u), ∀u ∈ U y
(w, t), ∀w ∈ W . Entonces el flujo máximo de s a t es igual al emparejamiento
de cardinalidad máxima.

También podría gustarte