- Type Parameters:
- V- the graph vertex type
- E- the graph edge type
- All Implemented Interfaces:
- FlowAlgorithm<V,,- E> - MaximumFlowAlgorithm<V,,- E> - MinimumSTCutAlgorithm<V,- E> 
Mathematically, the maximum flow problem is stated as follows: \[ \begin{align} \max~& \sum_{e\in \delta^+(s)}f_e &\\ \mbox{s.t. }&\sum_{e\in \delta^-(i)} f_e=\sum_{e\in \delta^+(i)} f_e & \forall i\in V\setminus\{s,t\}\\ &0\leq f_e \leq u_e & \forall e\in E \end{align} \] Here $\delta^+(i)$ resp $\delta^-(i)$ denote resp the outgoing and incoming edges of vertex $i$.
When the input graph is undirected, an edge $(i,j)$ is treated as two directed arcs: $(i,j)$ and $(j,i)$. In such a case, there is the additional restriction that the flow can only go in one direction: the flow either goes form $i$ to $j$, or from $j$ to $i$, but there cannot be a positive flow on $(i,j)$ and $(j,i)$ simultaneously.
 The runtime complexity of this class is $O(nm^2)$, where $n$ is the number of vertices and $m$
 the number of edges in the graph. For a more efficient algorithm, consider using
 PushRelabelMFImpl instead.
 
This class can also compute minimum s-t cuts. Effectively, to compute a minimum s-t cut, the implementation first computes a minimum s-t flow, after which a BFS is run on the residual graph.
For more details see Andrew V. Goldberg's Combinatorial Optimization (Lecture Notes). Note: even though the algorithm accepts any kind of graph, currently only Simple directed and undirected graphs are supported (and tested!).
- Author:
- Ilya Razensteyn
- 
Nested Class SummaryNested classes/interfaces inherited from interface org.jgrapht.alg.interfaces.FlowAlgorithmFlowAlgorithm.Flow<E>, FlowAlgorithm.FlowImpl<E>Nested classes/interfaces inherited from interface org.jgrapht.alg.interfaces.MaximumFlowAlgorithmMaximumFlowAlgorithm.MaximumFlow<E>, MaximumFlowAlgorithm.MaximumFlowImpl<E>
- 
Field SummaryFields inherited from class org.jgrapht.alg.flow.MaximumFlowAlgorithmBasecomparator, cutEdges, DEFAULT_EPSILON, directedGraph, edgeExtensionManager, maxFlow, maxFlowValue, network, sink, sinkPartition, source, sourcePartition, vertexExtensionManager
- 
Constructor SummaryConstructorsConstructorDescriptionEdmondsKarpMFImpl(Graph<V, E> network) ConstructsMaximumFlowinstance to work with a copy ofnetwork.EdmondsKarpMFImpl(Graph<V, E> network, double epsilon) ConstructsMaximumFlowinstance to work with a copy ofnetwork.
- 
Method SummaryModifier and TypeMethodDescriptiondoublecalculateMaximumFlow(V source, V sink) Sets current source tosource, current sink tosink, then calculates maximum flow fromsourcetosink.getMaximumFlow(V source, V sink) Sets current source tosource, current sink tosink, then calculates maximum flow fromsourcetosink.Methods inherited from class org.jgrapht.alg.flow.MaximumFlowAlgorithmBasecalculateMinCut, calculateSourcePartition, composeFlow, getCurrentSink, getCurrentSource, getCutCapacity, getCutEdges, getFlowDirection, getFlowMap, getMaximumFlowValue, getSinkPartition, getSourcePartition, init, pushFlowThroughMethods inherited from class java.lang.Objectclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface org.jgrapht.alg.interfaces.FlowAlgorithmgetFlowMethods inherited from interface org.jgrapht.alg.interfaces.MaximumFlowAlgorithmgetMaximumFlowValue
- 
Constructor Details- 
EdmondsKarpMFImplConstructsMaximumFlowinstance to work with a copy ofnetwork. Current source and sink are set tonull. Ifnetworkis weighted, then capacities are weights, otherwise all capacities are equal to one. Doubles are compared usingDEFAULT_EPSILONtolerance.- Parameters:
- network- network, where maximum flow will be calculated
 
- 
EdmondsKarpMFImplConstructsMaximumFlowinstance to work with a copy ofnetwork. Current source and sink are set tonull. Ifnetworkis weighted, then capacities are weights, otherwise all capacities are equal to one.- Parameters:
- network- network, where maximum flow will be calculated
- epsilon- tolerance for comparing doubles
 
 
- 
- 
Method Details- 
getMaximumFlowSets current source tosource, current sink tosink, then calculates maximum flow fromsourcetosink. Note, thatsourceandsinkmust be vertices of thenetworkpassed to the constructor, and they must be different.- Parameters:
- source- source vertex
- sink- sink vertex
- Returns:
- a maximum flow
 
- 
calculateMaximumFlowSets current source tosource, current sink tosink, then calculates maximum flow fromsourcetosink. Note, thatsourceandsinkmust be vertices of thenetworkpassed to the constructor, and they must be different. If desired, a flow map can be queried afterwards; this will not require a new invocation of the algorithm.- Parameters:
- source- source vertex
- sink- sink vertex
- Returns:
- the value of the maximum flow
 
 
-