Loading...
Searching...
No Matches
Preflow< GR, CAP, TR > Class Template Reference
Algorithms » Maximum Flow Algorithms

## Detailed Description

template<typename GR, typename CAP, typename TR>
class lemon::Preflow< GR, CAP, TR >

This class provides an implementation of Goldberg-Tarjan's preflow push-relabel algorithm producing a flow of maximum value in a digraph [clrs01algorithms], [amo93networkflows], [goldberg88newapproach]. The preflow algorithms are the fastest known maximum flow algorithms. The current implementation uses a mixture of the "highest label" and the "bound decrease" heuristics. The worst case time complexity of the algorithm is .

The algorithm consists of two phases. After the first phase the maximum flow value and the minimum cut is obtained. The second phase constructs a feasible maximum flow on each arc.

Warning
  This implementation cannot handle infinite or very large capacities (e.g. the maximum value of `CAP::Value`).

Template Parameters

  GR | The type of the digraph the algorithm runs on.
  CAP | The type of the capacity map. The default map type is GR::ArcMap<int>.
  TR | The traits class that defines various types used by the algorithm. By default, it is PreflowDefaultTraits<GR, CAP>. In most cases, this parameter should not be set directly, consider to use the named template parameters instead.

`#include <lemon/preflow.h>`

## Classes

struct | SetFlowMap
| Named parameter for setting FlowMap type More...
struct | SetElevator
| Named parameter for setting Elevator type More...
struct | SetStandardElevator
| Named parameter for setting Elevator type with automatic allocation More...

## Public Types

typedef TR | Traits
| The traits class of the algorithm.
typedef Traits::Digraph | Digraph
| The type of the digraph the algorithm runs on.
typedef Traits::CapacityMap | CapacityMap
| The type of the capacity map.
typedef Traits::Value | Value
| The type of the flow values.
typedef Traits::FlowMap | FlowMap
| The type of the flow map.
typedef Traits::Elevator | Elevator
| The type of the elevator.
typedef Traits::Tolerance | Tolerance
| The type of the tolerance.

## Public Member Functions

| Preflow (const Digraph &digraph, const CapacityMap &capacity, Node source, Node target)
| The constructor of the class.
| ~Preflow ()
| Destructor.
Preflow & | capacityMap (const CapacityMap &map)
| Sets the capacity map.
Preflow & | flowMap (FlowMap &map)
| Sets the flow map.
Preflow & | source (const Node &node)
| Sets the source node.
Preflow & | target (const Node &node)
| Sets the target node.
Preflow & | elevator (Elevator &elevator)
| Sets the elevator used by algorithm.
const Elevator & | elevator () const
| Returns a const reference to the elevator.
Preflow & | tolerance (const Tolerance &tolerance)
| Sets the tolerance used by the algorithm.
const Tolerance & | tolerance () const
| Returns a const reference to the tolerance.
Execution Control
The simplest way to execute the preflow algorithm is to use run() or .\n If you need better control on the initial solution or the execution, you have to call one of the init() functions first, then startFirstPhase() and if you need it startSecondPhase().
void | init ()
| Initializes the internal data structures.
template<typename FlowMap>
bool | init (const FlowMap &flowMap)
| Initializes the internal data structures using the given flow map.
void | startFirstPhase ()
| Starts the first phase of the preflow algorithm.
void | startSecondPhase ()
| Starts the second phase of the preflow algorithm.
void | run ()
| Runs the preflow algorithm.
void | runMinCut ()
| Runs the preflow algorithm to compute the minimum cut.
Query Functions
The results of the preflow algorithm can be obtained using these functions. Either one of the run*() functions or one of the start*() functions should be called before using them.
Value | flowValue () const
| Returns the value of the maximum flow.
Value | flow (const Arc &arc) const
| Returns the flow value on the given arc.
const FlowMap & | flowMap () const
| Returns a const reference to the flow map.
bool | minCut (const Node &node) const
| Returns `true` when the node is on the source side of the minimum cut.
template<typename CutMap>
void | minCutMap (CutMap &cutMap) const
| Gives back a minimum value cut.

## Constructor & Destructor Documentation

## Preflow()

template<typename GR, typename CAP, typename TR>

Preflow | ( | const Digraph & | digraph,
|  | const CapacityMap & | capacity,
|  | Node | source,
|  | Node | target )

inline

The constructor of the class.

Parameters

  digraph | The digraph the algorithm runs on.
  capacity | The capacity of the arcs.
  source | The source node.
  target | The target node.

## ~Preflow()

template<typename GR, typename CAP, typename TR>

~Preflow | ( |  | ) |

inline

Destructor.

## Member Function Documentation

## capacityMap()

template<typename GR, typename CAP, typename TR>

Preflow & capacityMap | ( | const CapacityMap & | map | ) |

inline

Sets the capacity map.

Returns
  (*this)

## flowMap() [1/2]

template<typename GR, typename CAP, typename TR>

Preflow & flowMap | ( | FlowMap & | map | ) |

inline

Sets the flow map. If you don't use this function before calling run() or init(), an instance will be allocated automatically. The destructor deallocates this automatically allocated map, of course.

Returns
  (*this)

## source()

template<typename GR, typename CAP, typename TR>

Preflow & source | ( | const Node & | node | ) |

inline

Sets the source node.

Returns
  (*this)

## target()

template<typename GR, typename CAP, typename TR>

Preflow & target | ( | const Node & | node | ) |

inline

Sets the target node.

Returns
  (*this)

## elevator() [1/2]

template<typename GR, typename CAP, typename TR>

Preflow & elevator | ( | Elevator & | elevator | ) |

inline

Sets the elevator used by algorithm. If you don't use this function before calling run() or init(), an instance will be allocated automatically. The destructor deallocates this automatically allocated elevator, of course.

Returns
  (*this)

## elevator() [2/2]

template<typename GR, typename CAP, typename TR>

const Elevator & elevator | ( |  | ) | const

inline

Returns a const reference to the elevator.

Precondition
  Either run() or init() must be called before using this function.

## tolerance() [1/2]

template<typename GR, typename CAP, typename TR>

Preflow & tolerance | ( | const Tolerance & | tolerance | ) |

inline

Sets the tolerance object used by the algorithm.

Returns
  (*this)

## tolerance() [2/2]

template<typename GR, typename CAP, typename TR>

const Tolerance & tolerance | ( |  | ) | const

inline

Returns a const reference to the tolerance object used by the algorithm.

## init() [1/2]

template<typename GR, typename CAP, typename TR>

void init | ( |  | ) |

inline

Initializes the internal data structures and sets the initial flow to zero on each arc.

## init() [2/2]

template<typename GR, typename CAP, typename TR>
template<typename FlowMap>

bool init | ( | const FlowMap & | flowMap | ) |

inline

Initializes the internal data structures and sets the initial flow to the given `flowMap`. The `flowMap` should contain a flow or at least a preflow, i.e. at each node excluding the source node the incoming flow should greater or equal to the outgoing flow.

Returns
  `false` if the given `flowMap` is not a preflow.

## startFirstPhase()

template<typename GR, typename CAP, typename TR>

void startFirstPhase | ( |  | ) |

inline

The preflow algorithm consists of two phases, this method runs the first phase. After the first phase the maximum flow value and a minimum value cut can already be computed, although a maximum flow is not yet obtained. So after calling this method flowValue() returns the value of a maximum flow and minCut() returns a minimum cut.

Precondition
  One of the init() functions must be called before using this function.

## startSecondPhase()

template<typename GR, typename CAP, typename TR>

void startSecondPhase | ( |  | ) |

inline

The preflow algorithm consists of two phases, this method runs the second phase. After calling one of the init() functions and startFirstPhase() and then startSecondPhase(), flowMap() returns a maximum flow, flowValue() returns the value of a maximum flow, minCut() returns a minimum cut

Precondition
  One of the init() functions and startFirstPhase() must be called before using this function.

## run()

template<typename GR, typename CAP, typename TR>

void run | ( |  | ) |

inline

Runs the preflow algorithm.

Note
  pf.run() is just a shortcut of the following code.
  pf.init();
  pf.startFirstPhase();
  pf.startSecondPhase();

## runMinCut()

template<typename GR, typename CAP, typename TR>

void runMinCut | ( |  | ) |

inline

Runs the preflow algorithm to compute the minimum cut.

Note
  pf.runMinCut() is just a shortcut of the following code.
  pf.init();
  pf.startFirstPhase();

## flowValue()

template<typename GR, typename CAP, typename TR>

Value flowValue | ( |  | ) | const

inline

Returns the value of the maximum flow by returning the excess of the target node. This value equals to the value of the maximum flow already after the first phase of the algorithm.

Precondition
  Either run() or init() must be called before using this function.

## flow()

template<typename GR, typename CAP, typename TR>

Value flow | ( | const Arc & | arc | ) | const

inline

Returns the flow value on the given arc. This method can be called after the second phase of the algorithm.

Precondition
  Either run() or init() must be called before using this function.

## flowMap() [2/2]

template<typename GR, typename CAP, typename TR>

const FlowMap & flowMap | ( |  | ) | const

inline

Returns a const reference to the arc map storing the found flow. This method can be called after the second phase of the algorithm.

Precondition
  Either run() or init() must be called before using this function.

## minCut()

template<typename GR, typename CAP, typename TR>

bool minCut | ( | const Node & | node | ) | const

inline

Returns true when the node is on the source side of the found minimum cut. This method can be called both after running startFirstPhase() and startSecondPhase().

Precondition
  Either run() or init() must be called before using this function.

## minCutMap()

template<typename GR, typename CAP, typename TR>
template<typename CutMap>

void minCutMap | ( | CutMap & | cutMap | ) | const

inline

Sets `cutMap` to the characteristic vector of a minimum value cut. `cutMap` should be a writable node map with `bool` (or convertible) value type.

This method can be called both after running startFirstPhase() and startSecondPhase(). The result after the second phase could be slightly different if inexact computation is used.

Note
  This function calls minCut() for each node, so it runs in O(n) time.

Precondition
  Either run() or init() must be called before using this function.