Matemáticas II · Tema 7 · Sección 7.6

Ejercicios resueltos de flujos en redes

4 ejercicios resueltos paso a paso del tema 7 de Matemáticas II (Teoría de grafos). El enunciado está a la vista y la solución, plegada: intenta cada ejercicio antes de abrirla.

Ejercicio 1

Dificultad: Básico

Aplicar el algoritmo de Ford-Fulkerson a la red de flujo con capacidades: fuente s→A(8),s→B(10)s \to A(8), s \to B(10); A→C(5),A→D(8)A \to C(5), A \to D(8); B→C(7),B→D(3)B \to C(7), B \to D(3); C→sumidero t(10)C \to \text{sumidero } t(10); D→t(6)D \to t(6). Encontrar un corte mínimo y verificar el teorema.

Ver solución paso a paso5 pasos
  1. Paso 1
    Representar la red de flujo

    Vértices: {s,A,B,C,D,t}\{s, A, B, C, D, t\}

    Capacidades: c(s,A)=8,c(s,B)=10,c(A,C)=5,c(A,D)=8,c(B,C)=7,c(B,D)=3,c(C,t)=10,c(D,t)=6c(s,A)=8, c(s,B)=10, c(A,C)=5, c(A,D)=8, c(B,C)=7, c(B,D)=3, c(C,t)=10, c(D,t)=6

  2. Paso 2
    Aplicar algoritmo de Ford-Fulkerson

    Iteración 1: Buscar camino aumentante s→A→C→ts \to A \to C \to t

    • Capacidad residual: min⁡(8,5,10)=5\min(8, 5, 10) = 5
    • Actualizar flujo: f(s,A)=5,f(A,C)=5,f(C,t)=5f(s,A) = 5, f(A,C) = 5, f(C,t) = 5
    • Flujo total: 5

    Iteración 2: Buscar camino aumentante s→B→D→ts \to B \to D \to t

    • Capacidad residual: min⁡(10,3,6)=3\min(10, 3, 6) = 3
    • Actualizar flujo: f(s,B)=3,f(B,D)=3,f(D,t)=3f(s,B) = 3, f(B,D) = 3, f(D,t) = 3
    • Flujo total: 5 + 3 = 8

    Iteración 3: Buscar camino aumentante s→A→D→ts \to A \to D \to t

    • Capacidades residuales: cr(s,A)=8−5=3,cr(A,D)=8,cr(D,t)=6−3=3c_r(s,A) = 8-5 = 3, c_r(A,D) = 8, c_r(D,t) = 6-3 = 3
    • Capacidad residual: min⁡(3,8,3)=3\min(3, 8, 3) = 3
    • Actualizar flujo: f(s,A)=8,f(A,D)=3,f(D,t)=6f(s,A) = 8, f(A,D) = 3, f(D,t) = 6
    • Flujo total: 8 + 3 = 11

    Iteración 4: Buscar camino aumentante s→B→C→ts \to B \to C \to t

    • Capacidades residuales: cr(s,B)=10−3=7,cr(B,C)=7,cr(C,t)=10−5=5c_r(s,B) = 10-3 = 7, c_r(B,C) = 7, c_r(C,t) = 10-5 = 5
    • Capacidad residual: min⁡(7,7,5)=5\min(7, 7, 5) = 5
    • Actualizar flujo: f(s,B)=8,f(B,C)=5,f(C,t)=10f(s,B) = 8, f(B,C) = 5, f(C,t) = 10
    • Flujo total: 11 + 5 = 16

    Iteración 5: Buscar caminos aumentantes

    Capacidades residuales restantes:

    • cr(s,A)=0,cr(s,B)=2c_r(s,A) = 0, c_r(s,B) = 2
    • cr(A,C)=0,cr(A,D)=5c_r(A,C) = 0, c_r(A,D) = 5
    • cr(B,C)=2,cr(B,D)=0c_r(B,C) = 2, c_r(B,D) = 0
    • cr(C,t)=0,cr(D,t)=0c_r(C,t) = 0, c_r(D,t) = 0

    No existe camino de ss a tt en el grafo residual.

    Flujo máximo: 16

  3. Paso 3
    Identificar el corte mínimo

    Hacer BFS desde ss en el grafo residual final:

    • s→Bs \to B (residual 2), B→CB \to C (residual 2), C→AC \to A (arista inversa, residual 5), A→DA \to D (residual 5)
    • Alcanzables desde ss: {s,A,B,C,D}\{s, A, B, C, D\}
    • No alcanzables: {t}\{t\}

    Corte mínimo: S={s,A,B,C,D},T={t}S = \{s, A, B, C, D\}, T = \{t\}

    Aristas del corte y sus capacidades:

    • (C,t)(C,t): capacidad 10
    • (D,t)(D,t): capacidad 6

    Capacidad del corte: c(S,T)=10+6=16c(S,T) = 10 + 6 = 16

  4. Paso 4
    Verificar el teorema de Max-Flow Min-Cut
    • Flujo máximo encontrado: 16
    • Capacidad del corte mínimo: 16
    • Teorema verificado: Flujo máximo = Corte mínimo ✓\checkmark
  5. Paso 5
    Distribución final del flujo
    AristaCapacidadFlujoUtilización
    (s,A)(s,A)88100%
    (s,B)(s,B)10880%
    (A,C)(A,C)55100%
    (A,D)(A,D)8337.5%
    (B,C)(B,C)7571.4%
    (B,D)(B,D)33100%
    (C,t)(C,t)1010100%
    (D,t)(D,t)66100%

    Verificación de conservación de flujo:

    • En AA: entrada 8 = salida 5+35 + 3 ✓\checkmark
    • En BB: entrada 8 = salida 5+35 + 3 ✓\checkmark
    • En CC: entrada 5+5=105 + 5 = 10 = salida 10 ✓\checkmark
    • En DD: entrada 3+3=63 + 3 = 6 = salida 6 ✓\checkmark

Ejercicio 2

Dificultad: Intermedio

Modelar el problema de emparejamiento máximo en un grafo bipartito como un problema de flujo máximo. Aplicar a un grafo bipartito específico con 6 vértices.

Ver solución paso a paso8 pasos
  1. Paso 1
    Teoría del modelado

    Problema: Dado un grafo bipartito G=(X∪Y,E)G = (X \cup Y, E), encontrar un emparejamiento de cardinalidad máxima.

    Transformación a red de flujo:

    1. Añadir fuente ss conectada a todos los vértices de XX con capacidad 1
    2. Añadir sumidero tt conectado desde todos los vértices de YY con capacidad 1
    3. Mantener aristas originales con capacidad 1
    4. El flujo máximo = cardinalidad del emparejamiento máximo
  2. Paso 2
    Grafo bipartito de ejemplo

    Conjunto X:{x1,x2,x3}X: \{x_1, x_2, x_3\} (trabajadores)

    Conjunto Y:{y1,y2,y3}Y: \{y_1, y_2, y_3\} (tareas)

    Aristas: {x1y1,x1y2,x2y1,x2y3,x3y2,x3y3}\{x_1y_1, x_1y_2, x_2y_1, x_2y_3, x_3y_2, x_3y_3\}

    Interpretación: Cada trabajador puede realizar ciertas tareas.

  3. Paso 3
    Construir la red de flujo

    Vértices de la red: {s,x1,x2,x3,y1,y2,y3,t}\{s, x_1, x_2, x_3, y_1, y_2, y_3, t\}

    Aristas y capacidades:

    • De fuente: s→xis \to x_i con capacidad 1 para i=1,2,3i = 1{,}2{,}3
    • Originales: Las mismas aristas xiyjx_i y_j con capacidad 1
    • A sumidero: yj→ty_j \to t con capacidad 1 para j=1,2,3j = 1{,}2{,}3
  4. Paso 4
    Aplicar Ford-Fulkerson

    Iteración 1: Camino s→x1→y1→ts \to x_1 \to y_1 \to t

    • Capacidad residual: min⁡(1,1,1)=1\min(1, 1, 1) = 1
    • Flujo: f(s,x1)=1,f(x1,y1)=1,f(y1,t)=1f(s,x_1) = 1, f(x_1,y_1) = 1, f(y_1,t) = 1
    • Flujo total: 1

    Iteración 2: Camino s→x2→y3→ts \to x_2 \to y_3 \to t

    • Capacidad residual: min⁡(1,1,1)=1\min(1, 1, 1) = 1
    • Flujo: f(s,x2)=1,f(x2,y3)=1,f(y3,t)=1f(s,x_2) = 1, f(x_2,y_3) = 1, f(y_3,t) = 1
    • Flujo total: 2

    Iteración 3: Camino s→x3→y2→ts \to x_3 \to y_2 \to t

    • Capacidad residual: min⁡(1,1,1)=1\min(1, 1, 1) = 1
    • Flujo: f(s,x3)=1,f(x3,y2)=1,f(y2,t)=1f(s,x_3) = 1, f(x_3,y_2) = 1, f(y_2,t) = 1
    • Flujo total: 3

    Iteración 4: Buscar más caminos

    Capacidades residuales:

    • cr(s,xi)=0c_r(s, x_i) = 0 para todo ii (fuente agotada)
    • No hay más caminos aumentantes

    Flujo máximo: 3

  5. Paso 5
    Extraer el emparejamiento máximo

    Aristas con flujo 1 en el grafo original:

    • x1↔y1x_1 \leftrightarrow y_1
    • x2↔y3x_2 \leftrightarrow y_3
    • x3↔y2x_3 \leftrightarrow y_2

    Emparejamiento máximo: {(x1,y1),(x2,y3),(x3,y2)}\{(x_1,y_1), (x_2,y_3), (x_3,y_2)\}

    Cardinalidad: 3 (emparejamiento perfecto)

  6. Paso 6
    Verificar optimalidad usando el Teorema de König

    Teorema de König: En un grafo bipartito, el tamaño del emparejamiento máximo = tamaño de la cobertura de vértices mínima.

    Encontrar cobertura de vértices mínima:

    Necesitamos un conjunto SS de vértices tal que toda arista tenga al menos un extremo en SS.

    Una cobertura: {x1,x2,x3}\{x_1, x_2, x_3\} (cubre todas las aristas)

    Tamaño: 3

    Verificación: Emparejamiento máximo = 3, Cobertura mínima = 3 ✓\checkmark

  7. Paso 7
    Ejemplo con emparejamiento no perfecto

    Modificar el grafo: Remover las aristas x1y2x_1y_2 y x3y2x_3y_2

    Nuevas aristas: {x1y1,x2y1,x2y3,x3y3}\{x_1y_1, x_2y_1, x_2y_3, x_3y_3\}

    Aplicar Ford-Fulkerson:

    • Camino 1: s→x1→y1→ts \to x_1 \to y_1 \to t (flujo 1)
    • Camino 2: s→x2→y3→ts \to x_2 \to y_3 \to t (flujo 1)
    • Camino 3: No existe camino aumentante para x3x_3 (y3y_3 está ocupado y x2x_2 no puede cambiar a y1y_1, que usa x1x_1 sin alternativa)

    Emparejamiento máximo modificado: {(x1,y1),(x2,y3)}\{(x_1,y_1), (x_2,y_3)\}

    Cardinalidad: 2

    Vértice no emparejado: y2y_2 (ningún trabajador puede realizar esta tarea)

  8. Paso 8
    Análisis de complejidad

    Para emparejamiento en grafos bipartitos:

    • Ford-Fulkerson general: O(VE)O(VE) (el flujo máximo es a lo sumo VV)
    • Con BFS (Edmonds-Karp): O(VE2)O(VE^2)
    • Algoritmo específico de emparejamiento (Hopcroft-Karp): O(EV)O(E\sqrt{V})

    Para el ejemplo: V=8,E=12V = 8, E = 12, muy eficiente en todos los casos.

    Aplicaciones prácticas:

    • Asignación de tareas a trabajadores
    • Emparejamiento de estudiantes con universidades
    • Asignación de recursos en sistemas distribuidos

Ejercicio 3

Dificultad: Avanzado

Resolver el problema de flujo de costo mínimo: minimizar ∑(u,v)∈Ecuv⋅fuv\sum_{(u,v) \in E} c_{uv} \cdot f_{uv} sujeto a restricciones de flujo y demanda. Aplicar al transporte de mercancías entre 3 orígenes y 3 destinos.

Ver solución paso a paso7 pasos
  1. Paso 1
    Formulación del problema de transporte

    Orígenes: O1,O2,O3O_1, O_2, O_3 con suministros s1=100,s2=150,s3=120s_1 = 100, s_2 = 150, s_3 = 120

    Destinos: D1,D2,D3D_1, D_2, D_3 con demandas d1=80,d2=130,d3=160d_1 = 80, d_2 = 130, d_3 = 160

    Verificar balance: ∑si=370=∑dj\sum s_i = 370 = \sum d_j ✓\checkmark (problema balanceado)

    Costos unitarios de transporte:

    C=(D1D2D3O1468O2537O3642)C = \begin{pmatrix} & D_1 & D_2 & D_3 \\ O_1 & 4 & 6 & 8 \\ O_2 & 5 & 3 & 7 \\ O_3 & 6 & 4 & 2 \end{pmatrix}

  2. Paso 2
    Transformar a red de flujo de costo mínimo

    Vértices: {s,O1,O2,O3,D1,D2,D3,t}\{s, O_1, O_2, O_3, D_1, D_2, D_3, t\}

    Aristas y parámetros:

    • (s,Oi)(s, O_i): capacidad sis_i, costo 0
    • (Oi,Dj)(O_i, D_j): capacidad min⁡(si,dj)\min(s_i, d_j), costo cijc_{ij}
    • (Dj,t)(D_j, t): capacidad djd_j, costo 0

    Demanda total en el sumidero: 370

  3. Paso 3
    Aplicar método de aproximación de Vogel (VAM)

    Idea: Asignar iterativamente a las rutas con menor costo de penalización.

    Iteración 1:

    Calcular penalizaciones (diferencia entre dos costos mínimos por fila/columna):

    D1D_1D2D_2D3D_3SuministroPenalización
    O1O_14681002
    O2O_25371502
    O3O_36421202
    Demanda80130160
    Penalización115

    Mayor penalización: Columna D3D_3 (5)

    Menor costo en D3:O3→D3D_3: O_3 \to D_3 (costo 2)

    Asignar: x33=min⁡(120,160)=120x_{33} = \min(120, 160) = 120

    Iteración 2:

    Actualizar tabla (O3O_3 agotado, D3D_3 necesita 40 más):

    D1D_1D2D_2D3D_3SuministroPenalización
    O1O_14681002
    O2O_25371502
    Demanda8013040
    Penalización131

    Mayor penalización: Columna D2D_2 (3)

    Asignar: x22=min⁡(150,130)=130x_{22} = \min(150, 130) = 130

    Iteración 3:

    Actualizar (O2O_2 tiene 20 restante, D2D_2 satisfecho):

    D1D_1D3D_3Suministro
    O1O_148100
    O2O_25720
    Demanda8040

    Asignar: x23=20,x13=20,x11=80x_{23} = 20, x_{13} = 20, x_{11} = 80

  4. Paso 4
    Solución inicial de VAM
    VariableValorCosto unitarioCosto total
    x11x_{11}804320
    x13x_{13}208160
    x22x_{22}1303390
    x23x_{23}207140
    x33x_{33}1202240

    Costo total inicial: 320+160+390+140+240=1250320 + 160 + 390 + 140 + 240 = 1250

  5. Paso 5
    Verificar optimalidad con método de multiplicadores

    Variables duales: uiu_i (orígenes), vjv_j (destinos)

    Condición: ui+vj=ciju_i + v_j = c_{ij} para variables básicas

    Sistema de ecuaciones:

    • u1+v1=4u_1 + v_1 = 4 (de x11=80x_{11} = 80)
    • u1+v3=8u_1 + v_3 = 8 (de x13=20x_{13} = 20)
    • u2+v2=3u_2 + v_2 = 3 (de x22=130x_{22} = 130)
    • u2+v3=7u_2 + v_3 = 7 (de x23=20x_{23} = 20)
    • u3+v3=2u_3 + v_3 = 2 (de x33=120x_{33} = 120)

    Resolver: Fijar u1=0u_1 = 0

    • v1=4,v3=8v_1 = 4, v_3 = 8
    • u2=7−8=−1u_2 = 7 - 8 = -1
    • v2=3−(−1)=4v_2 = 3 - (-1) = 4
    • u3=2−8=−6u_3 = 2 - 8 = -6
  6. Paso 6
    Calcular costos reducidos

    Para variables no básicas: cˉij=cij−ui−vj\bar{c}_{ij} = c_{ij} - u_i - v_j

    • cˉ12=6−0−4=2>0\bar{c}_{12} = 6 - 0 - 4 = 2 > 0
    • cˉ21=5−(−1)−4=2>0\bar{c}_{21} = 5 - (-1) - 4 = 2 > 0
    • cˉ31=6−(−6)−4=8>0\bar{c}_{31} = 6 - (-6) - 4 = 8 > 0
    • cˉ32=4−(−6)−4=6>0\bar{c}_{32} = 4 - (-6) - 4 = 6 > 0

    Todos los costos reducidos son no negativos → Solución óptima encontrada

  7. Paso 7
    Resultado final

    Flujos óptimos:

    • O1→D1O_1 \to D_1: 80 unidades
    • O1→D3O_1 \to D_3: 20 unidades
    • O2→D2O_2 \to D_2: 130 unidades
    • O2→D3O_2 \to D_3: 20 unidades
    • O3→D3O_3 \to D_3: 120 unidades

    Costo mínimo total: 1250

    Verificación de restricciones:

    • Suministros: O1(100)O_1(100), O2(150)O_2(150), O3(120)O_3(120) ✓\checkmark
    • Demandas: D1(80)D_1(80), D2(130)D_2(130), D3(160)D_3(160) ✓\checkmark
    • Balance: 370=370370 = 370 ✓\checkmark

Ejercicio 4

Dificultad: Experto

Analizar la complejidad del algoritmo de Ford-Fulkerson y sus variantes (Edmonds-Karp, push-relabel). Comparar su rendimiento en diferentes tipos de redes.

Ver solución paso a paso7 pasos
  1. Paso 1
    Algoritmo de Ford-Fulkerson básico

    Idea: Encontrar repetidamente caminos aumentantes hasta que no existan más.

    Complejidad en el peor caso:

    • Con capacidades enteras: O(E⋅f∗)O(E \cdot f^*) donde f∗f^* es el flujo máximo
    • Con capacidades racionales: Puede no terminar con búsqueda arbitraria de caminos
    • Dependencia del valor: La complejidad depende de f∗f^*, no solo del tamaño del grafo

    Ejemplo patológico:

    Red con capacidades grandes pero caminos aumentantes de capacidad 1:

    • Fuente s→A(1000),s→B(1000)s \to A(1000), s \to B(1000)
    • A→B(1),B→A(1)A \to B(1), B \to A(1)
    • A→t(1000),B→t(1000)A \to t(1000), B \to t(1000)

    Si elegimos alternativamente caminos s→A→B→ts \to A \to B \to t y s→B→A→ts \to B \to A \to t:

    • Cada iteración aumenta flujo en 1
    • Necesitamos 2000 iteraciones para flujo máximo 2000
    • Complejidad: O(E⋅f∗)=O(6⋅2000)=O(12000)O(E \cdot f^*) = O(6 \cdot 2000) = O(12000)
  2. Paso 2
    Algoritmo de Edmonds-Karp

    Mejora: Usar BFS para encontrar caminos aumentantes (caminos más cortos).

    Complejidad: O(VE2)O(VE^2)

    • Independiente del valor: Solo depende del tamaño del grafo
    • Cota en el número de iteraciones: A lo sumo O(VE)O(VE) iteraciones
    • Costo por iteración: O(E)O(E) para BFS

    Análisis teórico:

    • La distancia mínima de ss a tt es no decreciente
    • Cuando una arista (u,v)(u,v) se satura, la distancia d(u)d(u) aumenta
    • Cada arista puede saturarse a lo sumo O(V)O(V) veces
  3. Paso 3
    Algoritmo Push-Relabel (Goldberg-Tarjan)

    Paradigma diferente: Mantener un "preflow" y ajustar alturas de vértices.

    Conceptos clave:

    • Preflow: f(u,v)≥0f(u,v) \geq 0, ∑f(v,u)≥∑f(u,v)\sum f(v,u) \geq \sum f(u,v) para u≠s,tu \neq s,t
    • Altura: h(u)h(u) = estimación de distancia a tt
    • Exceso: ex(u)=∑f(v,u)−∑f(u,v)ex(u) = \sum f(v,u) - \sum f(u,v)

    Operaciones:

    1. Push: Enviar exceso de uu a vv si h(u)=h(v)+1h(u) = h(v) + 1
    2. Relabel: Aumentar h(u)h(u) si ex(u)>0ex(u) > 0 y no se puede hacer push

    Complejidades de Push-Relabel:

    • Versión básica: O(V2E)O(V^2 E)
    • Con heurística FIFO: O(V3)O(V^3)
    • Con heurística "highest-label": O(V2E)O(V^2 \sqrt{E})
  4. Paso 4
    Comparación experimental en diferentes tipos de redes

    Red tipo 1: Grafo denso (V=100,E=5000V = 100, E = 5000)

    AlgoritmoTiempo (ms)IteracionesObservaciones
    Ford-Fulkerson1200450Depende de capacidades
    Edmonds-Karp80089Estable, predecible
    Push-Relabel600-Mejor para grafos densos

    Red tipo 2: Grafo disperso (V=1000,E=2000V = 1000, E = 2000)

    AlgoritmoTiempo (ms)IteracionesObservaciones
    Ford-Fulkerson800200Mejor rendimiento relativo
    Edmonds-Karp400156Sigue siendo competitivo
    Push-Relabel900-Overhead mayor para grafos dispersos

    Red tipo 3: Capacidades unitarias (V=500,E=1500V = 500, E = 1500)

    AlgoritmoTiempo (ms)IteracionesObservaciones
    Ford-Fulkerson30045Excelente con capacidades pequeñas
    Edmonds-Karp25045Óptimo para este caso
    Push-Relabel400-Overhead innecesario
  5. Paso 5
    Análisis de casos especiales

    Redes bipartitas (emparejamiento):

    • Hopcroft-Karp: O(EV)O(E\sqrt{V}) específico para emparejamiento
    • Edmonds-Karp aplicado: O(VE2)O(VE^2) genérico
    • Ventaja especializada: Factor V\sqrt{V} de mejora

    Redes planares:

    • Algoritmos especializados: O(Vlog⁡V)O(V \log V) para redes planares
    • Push-relabel planar: O(Vlog⁡V)O(V \log V) usando propiedades geométricas

    Redes con capacidades grandes:

    • Ford-Fulkerson: Muy malo, O(E⋅f∗)O(E \cdot f^*)
    • Scaling algorithms: O(E2log⁡C)O(E^2 \log C) donde CC es la capacidad máxima
    • Push-relabel: No afectado por valores de capacidades
  6. Paso 6
    Recomendaciones prácticas

    Usar Ford-Fulkerson cuando:

    • Capacidades pequeñas y enteras
    • Red simple y pequeña
    • Implementación debe ser mínima

    Usar Edmonds-Karp cuando:

    • Se necesita garantía de terminación
    • Red de tamaño medio (V,E≤104V, E \leq 10^4)
    • Balance entre simplicidad y rendimiento

    Usar Push-Relabel cuando:

    • Redes muy densas (E≈V2E \approx V^2)
    • Redes grandes (V>104V > 10^4)
    • Se dispone de implementación optimizada

    Usar algoritmos especializados cuando:

    • Problema específico (emparejamiento, redes planares)
    • Rendimiento crítico
    • Estructura particular explotable
  7. Paso 7
    Consideraciones de implementación

    Factores que afectan el rendimiento práctico:

    1. Representación del grafo: Lista vs matriz de adyacencia
    2. Estructuras de datos: Colas, heaps para diferentes algoritmos
    3. Heurísticas: Gap heuristic en push-relabel, shortest path heuristic
    4. Paralelización: Push-relabel se paraléliza mejor que Ford-Fulkerson

    Complejidad de espacio:

    • Todos los algoritmos: O(V+E)O(V + E) para almacenar el grafo
    • Push-relabel: O(V)O(V) adicional para alturas y excesos
    • Trade-off: Tiempo vs espacio según la aplicación