learngraphtheory.org

Aprendizaje Interactivo de Teoría de Grafos

Guest User

Using app without sign in

Recursos de estudio
Lleva la teoría de grafos más allá de la pantalla
Descarga inmediata·Acceso de por vida
Selección de Algoritmo

Calculadora de Flujo Máximo

Calculadora de flujo máximo

Calcula el caudal máximo que puede circular del origen al sumidero

Tiempo: O(V·E^2)
Espacio: O(V + E)
Caso de Uso: Capacidad de redes, logística, emparejamiento bipartito
Ejecución de Algoritmo

Selecciona un algoritmo y genera pasos para comenzar la visualización

Acerca de Flujo Máximo

El problema del flujo máximo pregunta cuánto material puede enviarse desde una fuente a un sumidero por una red donde cada arista tiene una capacidad. Es uno de los modelos más versátiles de la optimización combinatoria, y por el teorema flujo máximo-corte mínimo su valor iguala la capacidad del menor corte que separa fuente de sumidero.

Cómo funciona

El método de Ford-Fulkerson halla repetidamente un camino de aumento de la fuente al sumidero en el grafo residual, una estructura contable que registra la capacidad restante y permite deshacer flujo. Enviar flujo por caminos de aumento hasta que no quede ninguno produce un flujo máximo. El refinamiento de Edmonds-Karp aumenta siempre por un camino más corto hallado con BFS, garantizando O(V E al cuadrado); el algoritmo de Dinic lo mejora con grafos de niveles y flujos bloqueantes.

Aplicaciones

El flujo máximo modela el caudal de tuberías y tráfico, el emparejamiento bipartito para asignación de tareas, la programación de tripulaciones aéreas, la segmentación de imágenes en visión por computador, la eliminación en béisbol y la selección de proyectos. Es el tema avanzado estándar de grafos en programación competitiva y entrevistas senior.

Pseudocódigo

Todos los algoritmos de flujo máximo de esta familia son el mismo bucle: encuentra un camino del origen al sumidero con capacidad libre, empuja todo lo que permita y repite. Solo se diferencian en cómo eligen ese camino.

FlujoMáximo(grafo, s, t):
    flujo = 0
    construir grafo residual: cap(u,v) directa, 0 inversa

    mientras exista un camino aumentante P de s a t
          en el grafo residual:
        cuello = mínima capacidad residual en P
        para cada arista (u, v) de P:
            residual[u][v] -= cuello
            residual[v][u] += cuello   // arista de deshacer
        flujo += cuello

    devolver flujo

// Ford-Fulkerson: halla P con DFS (cualquier camino)
// Edmonds-Karp:   halla P con BFS (camino más corto)

La arista residual inversa es la parte que parece equivocada y en realidad es esencial. Permite que un camino aumentante posterior cancele flujo empujado antes, y así el algoritmo escapa de una mala elección temprana sin retroceder. Sin esas aristas de deshacer, el bucle voraz se queda atascado en un flujo subóptimo.

Ejemplo resuelto, paso a paso

Ejecuta Edmonds-Karp sobre el ejemplo clásico en el que una primera elección voraz debe deshacerse después.

Grafo de ejemplo: Capacidades dirigidas: S a A (10), S a B (10), A a B (2), A a T (4), B a T (9).

  1. Aumento 1. BFS encuentra S a A a T. El cuello de botella es mín(10, 4) = 4. Empuja 4. Flujo total 4. El residual S-A baja a 6 y A-T a 0.
  2. Aumento 2. BFS encuentra S a B a T. El cuello de botella es mín(10, 9) = 9. Empuja 9. Flujo total 13. El residual S-B baja a 1 y B-T a 0.
  3. Aumento 3. A-T y B-T están saturadas, así que no queda ruta directa. BFS no encuentra ningún camino aumentante: llegar a T exigiría A-T o B-T, y ambas están llenas.
  4. Comprobar el corte. ¿Qué aristas están saturadas? A-T con 4 y B-T con 9, capacidad total 13. Quitarlas desconecta T de S, así que es un corte de capacidad 13 y el flujo de 13 lo iguala.
  5. Por qué importaría la arista de deshacer. Si el primer camino aumentante hubiera sido S a A a B a T empujando 2, la arista A-B quedaría saturada de una forma que aquí no bloquea nada, pero en grafos donde el camino voraz roba capacidad que un camino posterior necesita, la arista residual inversa B a A permite devolver esas 2 unidades y reencaminarlas. El algoritmo nunca tiene que retroceder de forma explícita.

El flujo máximo es 13, y el corte mínimo es el par de aristas A-T y B-T con capacidad total 13. Que ambos números coincidan no es casualidad: es el teorema de flujo máximo y corte mínimo.

Complejidad y de dónde sale

Tiempo: O(V·E^2) con Edmonds-Karp · Espacio: O(V + E)

Ford-Fulkerson con elección arbitraria de camino corre en O(E por el flujo máximo), porque cada aumento añade al menos una unidad pero la búsqueda del camino cuesta O(E). Eso es pseudopolinómico y realmente malo: con capacidades de mil millones puede requerir mil millones de aumentos, y con capacidades irracionales puede no terminar. Edmonds-Karp lo arregla eligiendo siempre el camino aumentante más corto mediante BFS. La distancia mínima del origen al sumidero nunca decrece, y cada arista puede ser el cuello de botella como mucho V/2 veces, lo que acota los aumentos en O(VE) y el total en O(V por E al cuadrado). Dinic agrupa los aumentos en fases usando un grafo por niveles y lo mejora a O(V al cuadrado por E), u O(E por raíz de V) en grafos de capacidad unitaria.

Cuándo usar Flujo Máximo y cuándo no

La elección depende sobre todo de la magnitud de las capacidades y del tamaño del grafo.

AlternativaPrefiérela cuandoCoste
Edmonds-KarpLa opción por defecto. La elección de camino por BFS hace que la cota no dependa de los valores de capacidad.O(V·E^2)
DinicGrafos más grandes. Los grafos por niveles y los flujos bloqueantes lo hacen bastante más rápido en la práctica.O(V^2·E)
Push-relabelGrafos muy grandes y densos donde importa el mejor comportamiento asintótico.O(V^3)
Hopcroft-KarpEl problema es en realidad emparejamiento bipartito, un caso particular de flujo máximo con capacidad unitaria.O(E·sqrt(V))
Corte mínimoQuieres las aristas cuello de botella en lugar del caudal. El mismo cálculo, leído de otra manera.igual que flujo máximo

Errores frecuentes

  • Omitir las aristas residuales inversas. Sin ellas el algoritmo no puede deshacer un mal aumento anterior y termina en un flujo que solo es maximal, no máximo. Este es el error más común en flujo máximo y produce respuestas plausibles pero demasiado pequeñas.
  • Elegir el camino con DFS cuando las capacidades son grandes. Ford-Fulkerson puro con DFS puede necesitar un aumento por unidad de flujo en grafos adversos. El ejemplo clásico, con capacidades de un millón y una arista cuello de botella de uno, requiere un millón de iteraciones. BFS hace que el número no dependa de los valores de capacidad.
  • Olvidar que la conservación de flujo excluye origen y sumidero. Todos los demás nodos deben tener flujo entrante igual al saliente. Validar la conservación en el origen o el sumidero fallará siempre y es una fuente habitual de confusión al escribir pruebas.
  • Suponer que el flujo máximo es único. El valor del flujo máximo es único; la asignación concreta que lo alcanza normalmente no lo es, ni tampoco el corte mínimo cuando varios tienen la misma capacidad. Las pruebas deben comprobar el valor, no una asignación arista por arista.
  • Modelar capacidades de nodo como capacidades de arista. Si un nodo tiene su propio límite de caudal, hay que dividirlo en un nodo de entrada y otro de salida unidos por una arista de esa capacidad. Aplicar el límite a las aristas incidentes plantea un problema distinto e incorrecto.

Preguntas frecuentes

¿Qué es el problema de flujo máximo?
Dado un grafo dirigido donde cada arista tiene una capacidad, más un origen y un sumidero, el flujo máximo pide el mayor caudal al que puede moverse material del origen al sumidero sin superar ninguna capacidad y conservando el flujo en cada nodo intermedio. Modela caudal en tuberías, redes, logística y planificación.
¿Qué es el teorema de flujo máximo y corte mínimo?
El valor del flujo máximo del origen al sumidero siempre iguala la capacidad del corte mínimo que los separa. Intuitivamente, el flujo no puede superar ningún corte porque todo debe cruzarlo, y cuando no queda camino aumentante, los nodos alcanzables en el grafo residual definen un corte cuya capacidad el flujo iguala exactamente.
¿Cuál es la diferencia entre Ford-Fulkerson y Edmonds-Karp?
Son el mismo método de caminos aumentantes con distinta elección de camino. Ford-Fulkerson deja la elección sin especificar, normalmente DFS, lo que hace que el tiempo dependa de los valores de capacidad y pueda ser catastróficamente lento. Edmonds-Karp toma siempre el camino aumentante más corto mediante BFS, lo que acota el trabajo en O(V por E al cuadrado) sean cuales sean las capacidades.
¿Por qué los algoritmos de flujo máximo necesitan aristas residuales?
Porque el algoritmo es voraz y no puede anticiparse. Una arista residual inversa representa la opción de cancelar flujo ya empujado por esa arista, de modo que un camino aumentante posterior puede reencaminar decisiones anteriores. Eso es lo que permite que un bucle que solo avanza alcance un óptimo verdadero sin retroceder.
¿Cuál es la complejidad temporal del flujo máximo?
Edmonds-Karp corre en O(V por E al cuadrado). Dinic lo mejora a O(V al cuadrado por E), y a O(E por la raíz cuadrada de V) en grafos de capacidad unitaria, razón por la que se prefiere para emparejamiento bipartito. Ford-Fulkerson puro es O(E por el valor del flujo máximo), que es pseudopolinómico en lugar de polinómico.

Leer el artículo completo: Network Flow: Max-Flow and Min-Cut

Algoritmos relacionados: Corte Mínimo, Comprobación de Grafo Bipartito, Búsqueda en Anchura

Controles Interactivos
Acciones Básicas
Doble Clic → Agregar Nodo
Arrastrar → Mover Nodos
Shift + Clic → Conectar Nodos
Clic Derecho → Menú Contextual
Avanzado
Ctrl + Clic → Multi-Selección
Tecla Suprimir → Eliminar Seleccionados
Doble Clic en Arista → Editar Peso
Ctrl + Arrastrar → Desplazar Vista

Zoom Controls

100%
Nodos: 4
Aristas: 4