Skip to Content

Flujo con cotas inferiores

HechoFuenteNombreDificultadTagsSolución
Wesley's Anger ContestHungry SquirrelsNormal—

Tutorial

Recursos
FuenteRecursoNotas
CMUFlow Extensions
cp-algorithmsFlows with Lower Bounds

Hasta ahora, cada arista de nuestra red de flujo tenía una capacidad que sirve como cota superior del flujo que pasa por ella: 0≤f(e)≤c(e)0 \le f(e) \le c(e). Ahora consideramos redes donde cada arista ee tiene además una cota inferior ℓ(e)\ell(e), de modo que cualquier flujo válido debe satisfacer

ℓ(e)≤f(e)≤c(e). \ell(e) \le f(e) \le c(e).

En otras palabras, ahora estamos obligados a empujar al menos ℓ(e)\ell(e) unidades de flujo por ee. Esta única extensión es sorprendentemente potente: muchos problemas que no se parecen en nada a flujo (“cada tarea debe realizarse al menos xx veces”, “cada persona canta entre aa y bb canciones”) se reducen a ella.

Circulación factible

Empecemos por la versión más simple, en la que no hay fuente ni sumidero. Una circulación es una asignación de flujo a cada arista tal que

  • cada arista respeta sus cotas: ℓ(e)≤f(e)≤c(e)\ell(e) \le f(e) \le c(e), y
  • la conservación se cumple en todo vértice: el flujo que entra es igual al que sale.

La pregunta es si existe alguna circulación válida.

Primero ilustramos el grafo de flujo que podemos armar para resolver este problema y luego explicamos por qué funciona. Primero, creamos dos nodos nuevos SS y TT y conectamos T→ST \rightarrow S con capacidad ∞\infty. Luego, aplicamos la siguiente transformación a cada arista e=u→ve = u \rightarrow v:

  • Conectamos u→Tu \rightarrow T y S→vS \rightarrow v con capacidad l(e)l(e).
  • Reducimos la capacidad de u→vu \rightarrow v a c(e)−l(e)c(e) - l(e).

800|center

La idea es que, en esta red transformada, el flujo por ee se enruta primero por el ciclo azul (u→T→S→vu \rightarrow T \rightarrow S \rightarrow v) hasta saturar las l(e)l(e) unidades, y solo el exceso pasa por ee misma. Esto implica que todas las cotas inferiores se satisfacen si y solo si todas las aristas azules están saturadas. Para determinar si esto es posible, basta correr un flujo máximo de SS a TT y comprobar si el flujo resultante es exactamente ∑l(e)\sum l(e).

Para recuperar la circulación real, tomamos el flujo g(e)g(e) hallado en la red auxiliar y le sumamos de nuevo la cota inferior: f(e)=g(e)+ℓ(e)f(e) = g(e) + \ell(e).

Flujo factible con fuente y sumidero

Ahora supongamos que sí tenemos una fuente ss y un sumidero tt, y queremos cualquier flujo de ss a tt que respete las cotas inferiores. La restricción de conservación debe cumplirse en todos lados excepto ss y tt.

Reducimos esto al caso de circulación con una arista extra: agregamos una arista de tt de vuelta a ss con cota inferior 00 y capacidad ∞\infty. Esta “arista de retorno” lleva el valor neto del flujo del sumidero a la fuente, de modo que la conservación también se cumple en ss y tt, y toda la red se convierte en un problema de circulación. Aplicamos la construcción de arriba, y el valor del flujo de la red original es exactamente el flujo enviado por la arista t→st \to s.

Flujo máximo / mínimo con cotas inferiores

A menudo no queremos solo un flujo factible: queremos el flujo máximo (o mínimo) de ss a tt sujeto a las cotas inferiores. Se hace en dos fases:

  1. Hallar un flujo factible usando la construcción de arriba. Si las aristas azules no se pueden saturar, no existe un flujo válido y nos detenemos.

  2. Aumentar en la red residual. Quitamos los SS y TT auxiliares y la arista t→st \to s, y luego corremos un flujo máximo ordinario de ss a tt sobre el grafo residual que queda. Sumar estos caminos aumentantes al flujo factible lo mantiene factible (solo incrementamos flujo en aristas que tienen capacidad de sobra) a la vez que empujamos el valor s→ts \to t tan alto como sea posible.

    Para flujo mínimo, en cambio corremos un flujo máximo de tt a ss en el grafo residual y lo restamos: cancelamos tanto flujo circulante como sea posible manteniendo cada arista por encima de su cota inferior.

Problemas

HechoFuenteNombreDificultadTagsSolución
CFDiverse SingingNormal—
CFCaptain AmericaNormal—
CFIncorrect FlowNormal—
ACMulti-Path StoryNormal—
CFShowing OffMuy difícil—