9.1. Flow Network
This section describes how to implement a flow network.
A flow network is a directed graph that has the following properties:
Max Flow
Let us define the MaxFlow
class that keeps track of the amount of flows in every edge used to find the maximum flow:
public class MaxFlow {
private Map<Edge, Double> flow_map;
private double maxflow;
public MaxFlow(Graph graph) {
init(graph);
}
public void init(Graph graph) {
flow_map = new HashMap<>();
maxflow = 0;
for (Edge edge : graph.getAllEdges())
flow_map.put(edge, 0d);
}
}
L2
: consists of (edge, flow) as the key-value pair.L3
: stores the total amount of flows to the target vertices.L13-14
: initializes all flows to0
.
Let us define getter methods:
public double getMaxFlow() {
return maxflow;
}
public double getResidual(Edge edge) {
return edge.getWeight() - flow_map.get(edge);
}
L5
: returns the remaining residual that can be used to push more flows.L6
: the edge weight represents the total capacity.
Finally, let us define setter methods:
public void updateFlow(List<Edge> path, double flow) {
path.forEach(e -> updateFlow(e, flow));
maxflow += flow;
}
public void updateFlow(Edge edge, double flow) {
Double prev = flow_map.getOrDefault(edge, 0d);
flow_map.put(edge, prev + flow);
}
L1
: takes the path from a source and a target.L2
: updates the flow of every edge in the path with the specific flow.L3
: updates the overall flow.
L6
: adds the specific flow to the specific edge.
Last updated
Was this helpful?