I am implementing this algorithm for a directed graph. But the interesting thing about this graph nodes have also their own flow capacities. I think, this subtle change of the original problem must be handled in a special way. Because, In original max-flow problem It was okay to find any path from start to finish(actually, in Edmonds-Karp algorithm, we need to do BFS, and choose the first path that reaches the final node) But with this node-capacity extension, we need to be more careful about 'this path selection' job. I know it because, I implemented the original-algorithm and found myself getting smaller flow values than max-flow, I doubt that it has to do with this node-capacity restrictions.
I put a lot effort on this and came up with some ideas like transforming the initial graph into a graph which has no capacity constraint on nodes by adding self loops (adding self loops to each node and finding paths which includes this self-loops for each node on the path) or adding virtual nodes and edges whose weights supersede the initial node-capacity constraints) However, I am not convinced that any of these are nice solution for this problem.
Any idea would be much appreciated.
Thanks in advance.
There's a simple reduction from the max-flow problem with node capacities to a regular max-flow problem:
For every vertex
v
in your graph, replace with two verticesv_in
andv_out
. Every incoming edge tov
should point tov_in
and every outgoing edge fromv
should point fromv_out
. Then create one additional edge fromv_in
tov_out
with capacityc_v
, the capacity of vertexv
.So you just run Edmunds-Karp on the transformed graph.
So let's say you have the following graph in your problem (vertex
v
has capacity 2):This would correspond to this graph in the max-flow problem:
It should be apparent that the max-flow obtained is the solution (and it's not particularly difficult to prove either).