Let s
be your source vertex and t1
and t2
the two sinks.
You can use the following algorithm:
Use regular max-flow with two sinks, for example by connecting t1
and t2
to a super-sink via edges with infinite capacities. You now have the solution with maximum excess(t1) + excess(t2)
, but it might be imbalanced.
If excess(t1) == excess(t2)
, you are done. Otherwise, w.l.o.g. let excess(t1) > excess(t2)
Run another round of max-flow with source t1
and sink t2
in the residual network of step 1. Restrict the flow outgoing from t1
to c = floor((excess(t1) - excess(t2)) / 2)
, for example by introducing a super-source S
connected to t1
via an edge with the given capacity c
. Now, excess(t2)
is the maximum flow you can send to both sinks.
If you need to reconstruct the flow values for each edge, do another round of max-flow to transport the excess(t1) - excess(t2)
leftover units of flow back to the source.
The complexity is that of your max-flow algorithm.
If you already know how to solve max-flow with lower-bound capacities, you can also binary search the solution, resulting in complexity O(log W * f)
where W
is the solution value and f
is the max-flow complexity.