1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
 
     3  * This file is a part of LEMON, a generic C++ optimization library.
 
     5  * Copyright (C) 2003-2013
 
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
 
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
 
     9  * Permission to use, modify and distribute this software is granted
 
    10  * provided that this copyright notice appears in all copies. For
 
    11  * precise terms see the accompanying LICENSE file.
 
    13  * This software is provided "AS IS" with no warranty of any kind,
 
    14  * express or implied, and with no claim as to its suitability for any
 
    19 #ifndef LEMON_PREFLOW_H
 
    20 #define LEMON_PREFLOW_H
 
    22 #include <lemon/tolerance.h>
 
    23 #include <lemon/elevator.h>
 
    27 /// \brief Implementation of the preflow algorithm.
 
    31   /// \brief Default traits class of Preflow class.
 
    33   /// Default traits class of Preflow class.
 
    34   /// \tparam GR Digraph type.
 
    35   /// \tparam CAP Capacity map type.
 
    36   template <typename GR, typename CAP>
 
    37   struct PreflowDefaultTraits {
 
    39     /// \brief The type of the digraph the algorithm runs on.
 
    42     /// \brief The type of the map that stores the arc capacities.
 
    44     /// The type of the map that stores the arc capacities.
 
    45     /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
 
    46     typedef CAP CapacityMap;
 
    48     /// \brief The type of the flow values.
 
    49     typedef typename CapacityMap::Value Value;
 
    51     /// \brief The type of the map that stores the flow values.
 
    53     /// The type of the map that stores the flow values.
 
    54     /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
 
    56     typedef GR::ArcMap<Value> FlowMap;
 
    58     typedef typename Digraph::template ArcMap<Value> FlowMap;
 
    61     /// \brief Instantiates a FlowMap.
 
    63     /// This function instantiates a \ref FlowMap.
 
    64     /// \param digraph The digraph for which we would like to define
 
    66     static FlowMap* createFlowMap(const Digraph& digraph) {
 
    67       return new FlowMap(digraph);
 
    70     /// \brief The elevator type used by Preflow algorithm.
 
    72     /// The elevator type used by Preflow algorithm.
 
    74     /// \sa Elevator, LinkedElevator
 
    76     typedef lemon::Elevator<GR, GR::Node> Elevator;
 
    78     typedef lemon::Elevator<Digraph, typename Digraph::Node> Elevator;
 
    81     /// \brief Instantiates an Elevator.
 
    83     /// This function instantiates an \ref Elevator.
 
    84     /// \param digraph The digraph for which we would like to define
 
    86     /// \param max_level The maximum level of the elevator.
 
    87     static Elevator* createElevator(const Digraph& digraph, int max_level) {
 
    88       return new Elevator(digraph, max_level);
 
    91     /// \brief The tolerance used by the algorithm
 
    93     /// The tolerance used by the algorithm to handle inexact computation.
 
    94     typedef lemon::Tolerance<Value> Tolerance;
 
   101   /// \brief %Preflow algorithm class.
 
   103   /// This class provides an implementation of Goldberg-Tarjan's \e preflow
 
   104   /// \e push-relabel algorithm producing a \ref max_flow
 
   105   /// "flow of maximum value" in a digraph \cite clrs01algorithms,
 
   106   /// \cite amo93networkflows, \cite goldberg88newapproach.
 
   107   /// The preflow algorithms are the fastest known maximum
 
   108   /// flow algorithms. The current implementation uses a mixture of the
 
   109   /// \e "highest label" and the \e "bound decrease" heuristics.
 
   110   /// The worst case time complexity of the algorithm is \f$O(n^2\sqrt{m})\f$.
 
   112   /// The algorithm consists of two phases. After the first phase
 
   113   /// the maximum flow value and the minimum cut is obtained. The
 
   114   /// second phase constructs a feasible maximum flow on each arc.
 
   116   /// \warning This implementation cannot handle infinite or very large
 
   117   /// capacities (e.g. the maximum value of \c CAP::Value).
 
   119   /// \tparam GR The type of the digraph the algorithm runs on.
 
   120   /// \tparam CAP The type of the capacity map. The default map
 
   121   /// type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
 
   122   /// \tparam TR The traits class that defines various types used by the
 
   123   /// algorithm. By default, it is \ref PreflowDefaultTraits
 
   124   /// "PreflowDefaultTraits<GR, CAP>".
 
   125   /// In most cases, this parameter should not be set directly,
 
   126   /// consider to use the named template parameters instead.
 
   128   template <typename GR, typename CAP, typename TR>
 
   130   template <typename GR,
 
   131             typename CAP = typename GR::template ArcMap<int>,
 
   132             typename TR = PreflowDefaultTraits<GR, CAP> >
 
   137     ///The \ref lemon::PreflowDefaultTraits "traits class" of the algorithm.
 
   139     ///The type of the digraph the algorithm runs on.
 
   140     typedef typename Traits::Digraph Digraph;
 
   141     ///The type of the capacity map.
 
   142     typedef typename Traits::CapacityMap CapacityMap;
 
   143     ///The type of the flow values.
 
   144     typedef typename Traits::Value Value;
 
   146     ///The type of the flow map.
 
   147     typedef typename Traits::FlowMap FlowMap;
 
   148     ///The type of the elevator.
 
   149     typedef typename Traits::Elevator Elevator;
 
   150     ///The type of the tolerance.
 
   151     typedef typename Traits::Tolerance Tolerance;
 
   155     TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
 
   157     const Digraph& _graph;
 
   158     const CapacityMap* _capacity;
 
   162     Node _source, _target;
 
   170     typedef typename Digraph::template NodeMap<Value> ExcessMap;
 
   173     Tolerance _tolerance;
 
   178     void createStructures() {
 
   179       _node_num = countNodes(_graph);
 
   182         _flow = Traits::createFlowMap(_graph);
 
   186         _level = Traits::createElevator(_graph, _node_num);
 
   190         _excess = new ExcessMap(_graph);
 
   194     void destroyStructures() {
 
   208     typedef Preflow Create;
 
   210     ///\name Named Template Parameters
 
   214     template <typename T>
 
   215     struct SetFlowMapTraits : public Traits {
 
   217       static FlowMap *createFlowMap(const Digraph&) {
 
   218         LEMON_ASSERT(false, "FlowMap is not initialized");
 
   219         return 0; // ignore warnings
 
   223     /// \brief \ref named-templ-param "Named parameter" for setting
 
   226     /// \ref named-templ-param "Named parameter" for setting FlowMap
 
   228     template <typename T>
 
   230       : public Preflow<Digraph, CapacityMap, SetFlowMapTraits<T> > {
 
   231       typedef Preflow<Digraph, CapacityMap,
 
   232                       SetFlowMapTraits<T> > Create;
 
   235     template <typename T>
 
   236     struct SetElevatorTraits : public Traits {
 
   238       static Elevator *createElevator(const Digraph&, int) {
 
   239         LEMON_ASSERT(false, "Elevator is not initialized");
 
   240         return 0; // ignore warnings
 
   244     /// \brief \ref named-templ-param "Named parameter" for setting
 
   247     /// \ref named-templ-param "Named parameter" for setting Elevator
 
   248     /// type. If this named parameter is used, then an external
 
   249     /// elevator object must be passed to the algorithm using the
 
   250     /// \ref elevator(Elevator&) "elevator()" function before calling
 
   251     /// \ref run() or \ref init().
 
   252     /// \sa SetStandardElevator
 
   253     template <typename T>
 
   255       : public Preflow<Digraph, CapacityMap, SetElevatorTraits<T> > {
 
   256       typedef Preflow<Digraph, CapacityMap,
 
   257                       SetElevatorTraits<T> > Create;
 
   260     template <typename T>
 
   261     struct SetStandardElevatorTraits : public Traits {
 
   263       static Elevator *createElevator(const Digraph& digraph, int max_level) {
 
   264         return new Elevator(digraph, max_level);
 
   268     /// \brief \ref named-templ-param "Named parameter" for setting
 
   269     /// Elevator type with automatic allocation
 
   271     /// \ref named-templ-param "Named parameter" for setting Elevator
 
   272     /// type with automatic allocation.
 
   273     /// The Elevator should have standard constructor interface to be
 
   274     /// able to automatically created by the algorithm (i.e. the
 
   275     /// digraph and the maximum level should be passed to it).
 
   276     /// However, an external elevator object could also be passed to the
 
   277     /// algorithm with the \ref elevator(Elevator&) "elevator()" function
 
   278     /// before calling \ref run() or \ref init().
 
   280     template <typename T>
 
   281     struct SetStandardElevator
 
   282       : public Preflow<Digraph, CapacityMap,
 
   283                        SetStandardElevatorTraits<T> > {
 
   284       typedef Preflow<Digraph, CapacityMap,
 
   285                       SetStandardElevatorTraits<T> > Create;
 
   297     /// \brief The constructor of the class.
 
   299     /// The constructor of the class.
 
   300     /// \param digraph The digraph the algorithm runs on.
 
   301     /// \param capacity The capacity of the arcs.
 
   302     /// \param source The source node.
 
   303     /// \param target The target node.
 
   304     Preflow(const Digraph& digraph, const CapacityMap& capacity,
 
   305             Node source, Node target)
 
   306       : _graph(digraph), _capacity(&capacity),
 
   307         _node_num(0), _source(source), _target(target),
 
   308         _flow(0), _local_flow(false),
 
   309         _level(0), _local_level(false),
 
   310         _excess(0), _tolerance(), _phase() {}
 
   312     /// \brief Destructor.
 
   319     /// \brief Sets the capacity map.
 
   321     /// Sets the capacity map.
 
   322     /// \return <tt>(*this)</tt>
 
   323     Preflow& capacityMap(const CapacityMap& map) {
 
   328     /// \brief Sets the flow map.
 
   330     /// Sets the flow map.
 
   331     /// If you don't use this function before calling \ref run() or
 
   332     /// \ref init(), an instance will be allocated automatically.
 
   333     /// The destructor deallocates this automatically allocated map,
 
   335     /// \return <tt>(*this)</tt>
 
   336     Preflow& flowMap(FlowMap& map) {
 
   345     /// \brief Sets the source node.
 
   347     /// Sets the source node.
 
   348     /// \return <tt>(*this)</tt>
 
   349     Preflow& source(const Node& node) {
 
   354     /// \brief Sets the target node.
 
   356     /// Sets the target node.
 
   357     /// \return <tt>(*this)</tt>
 
   358     Preflow& target(const Node& node) {
 
   363     /// \brief Sets the elevator used by algorithm.
 
   365     /// Sets the elevator used by algorithm.
 
   366     /// If you don't use this function before calling \ref run() or
 
   367     /// \ref init(), an instance will be allocated automatically.
 
   368     /// The destructor deallocates this automatically allocated elevator,
 
   370     /// \return <tt>(*this)</tt>
 
   371     Preflow& elevator(Elevator& elevator) {
 
   374         _local_level = false;
 
   380     /// \brief Returns a const reference to the elevator.
 
   382     /// Returns a const reference to the elevator.
 
   384     /// \pre Either \ref run() or \ref init() must be called before
 
   385     /// using this function.
 
   386     const Elevator& elevator() const {
 
   390     /// \brief Sets the tolerance used by the algorithm.
 
   392     /// Sets the tolerance object used by the algorithm.
 
   393     /// \return <tt>(*this)</tt>
 
   394     Preflow& tolerance(const Tolerance& tolerance) {
 
   395       _tolerance = tolerance;
 
   399     /// \brief Returns a const reference to the tolerance.
 
   401     /// Returns a const reference to the tolerance object used by
 
   403     const Tolerance& tolerance() const {
 
   407     /// \name Execution Control
 
   408     /// The simplest way to execute the preflow algorithm is to use
 
   409     /// \ref run() or \ref runMinCut().\n
 
   410     /// If you need better control on the initial solution or the execution,
 
   411     /// you have to call one of the \ref init() functions first, then
 
   412     /// \ref startFirstPhase() and if you need it \ref startSecondPhase().
 
   416     /// \brief Initializes the internal data structures.
 
   418     /// Initializes the internal data structures and sets the initial
 
   419     /// flow to zero on each arc.
 
   424       for (NodeIt n(_graph); n != INVALID; ++n) {
 
   428       for (ArcIt e(_graph); e != INVALID; ++e) {
 
   432       typename Digraph::template NodeMap<bool> reached(_graph, false);
 
   435       _level->initAddItem(_target);
 
   437       std::vector<Node> queue;
 
   438       reached[_source] = true;
 
   440       queue.push_back(_target);
 
   441       reached[_target] = true;
 
   442       while (!queue.empty()) {
 
   443         _level->initNewLevel();
 
   444         std::vector<Node> nqueue;
 
   445         for (int i = 0; i < int(queue.size()); ++i) {
 
   447           for (InArcIt e(_graph, n); e != INVALID; ++e) {
 
   448             Node u = _graph.source(e);
 
   449             if (!reached[u] && _tolerance.positive((*_capacity)[e])) {
 
   451               _level->initAddItem(u);
 
   458       _level->initFinish();
 
   460       for (OutArcIt e(_graph, _source); e != INVALID; ++e) {
 
   461         if (_tolerance.positive((*_capacity)[e])) {
 
   462           Node u = _graph.target(e);
 
   463           if ((*_level)[u] == _level->maxLevel()) continue;
 
   464           _flow->set(e, (*_capacity)[e]);
 
   465           (*_excess)[u] += (*_capacity)[e];
 
   466           if (u != _target && !_level->active(u)) {
 
   473     /// \brief Initializes the internal data structures using the
 
   476     /// Initializes the internal data structures and sets the initial
 
   477     /// flow to the given \c flowMap. The \c flowMap should contain a
 
   478     /// flow or at least a preflow, i.e. at each node excluding the
 
   479     /// source node the incoming flow should greater or equal to the
 
   481     /// \return \c false if the given \c flowMap is not a preflow.
 
   482     template <typename FlowMap>
 
   483     bool init(const FlowMap& flowMap) {
 
   486       for (ArcIt e(_graph); e != INVALID; ++e) {
 
   487         _flow->set(e, flowMap[e]);
 
   490       for (NodeIt n(_graph); n != INVALID; ++n) {
 
   492         for (InArcIt e(_graph, n); e != INVALID; ++e) {
 
   493           excess += (*_flow)[e];
 
   495         for (OutArcIt e(_graph, n); e != INVALID; ++e) {
 
   496           excess -= (*_flow)[e];
 
   498         if (excess < 0 && n != _source) return false;
 
   499         (*_excess)[n] = excess;
 
   502       typename Digraph::template NodeMap<bool> reached(_graph, false);
 
   505       _level->initAddItem(_target);
 
   507       std::vector<Node> queue;
 
   508       reached[_source] = true;
 
   510       queue.push_back(_target);
 
   511       reached[_target] = true;
 
   512       while (!queue.empty()) {
 
   513         _level->initNewLevel();
 
   514         std::vector<Node> nqueue;
 
   515         for (int i = 0; i < int(queue.size()); ++i) {
 
   517           for (InArcIt e(_graph, n); e != INVALID; ++e) {
 
   518             Node u = _graph.source(e);
 
   520                 _tolerance.positive((*_capacity)[e] - (*_flow)[e])) {
 
   522               _level->initAddItem(u);
 
   526           for (OutArcIt e(_graph, n); e != INVALID; ++e) {
 
   527             Node v = _graph.target(e);
 
   528             if (!reached[v] && _tolerance.positive((*_flow)[e])) {
 
   530               _level->initAddItem(v);
 
   537       _level->initFinish();
 
   539       for (OutArcIt e(_graph, _source); e != INVALID; ++e) {
 
   540         Value rem = (*_capacity)[e] - (*_flow)[e];
 
   541         if (_tolerance.positive(rem)) {
 
   542           Node u = _graph.target(e);
 
   543           if ((*_level)[u] == _level->maxLevel()) continue;
 
   544           _flow->set(e, (*_capacity)[e]);
 
   545           (*_excess)[u] += rem;
 
   548       for (InArcIt e(_graph, _source); e != INVALID; ++e) {
 
   549         Value rem = (*_flow)[e];
 
   550         if (_tolerance.positive(rem)) {
 
   551           Node v = _graph.source(e);
 
   552           if ((*_level)[v] == _level->maxLevel()) continue;
 
   554           (*_excess)[v] += rem;
 
   557       for (NodeIt n(_graph); n != INVALID; ++n)
 
   558         if(n!=_source && n!=_target && _tolerance.positive((*_excess)[n]))
 
   564     /// \brief Starts the first phase of the preflow algorithm.
 
   566     /// The preflow algorithm consists of two phases, this method runs
 
   567     /// the first phase. After the first phase the maximum flow value
 
   568     /// and a minimum value cut can already be computed, although a
 
   569     /// maximum flow is not yet obtained. So after calling this method
 
   570     /// \ref flowValue() returns the value of a maximum flow and \ref
 
   571     /// minCut() returns a minimum cut.
 
   572     /// \pre One of the \ref init() functions must be called before
 
   573     /// using this function.
 
   574     void startFirstPhase() {
 
   584           n = _level->highestActive();
 
   585           if (n == INVALID) goto first_phase_done;
 
   586           level = _level->highestActiveLevel();
 
   589           Value excess = (*_excess)[n];
 
   590           int new_level = _level->maxLevel();
 
   592           for (OutArcIt e(_graph, n); e != INVALID; ++e) {
 
   593             Value rem = (*_capacity)[e] - (*_flow)[e];
 
   594             if (!_tolerance.positive(rem)) continue;
 
   595             Node v = _graph.target(e);
 
   596             if ((*_level)[v] < level) {
 
   597               if (!_level->active(v) && v != _target) {
 
   600               if (!_tolerance.less(rem, excess)) {
 
   601                 _flow->set(e, (*_flow)[e] + excess);
 
   602                 (*_excess)[v] += excess;
 
   607                 (*_excess)[v] += rem;
 
   608                 _flow->set(e, (*_capacity)[e]);
 
   610             } else if (new_level > (*_level)[v]) {
 
   611               new_level = (*_level)[v];
 
   615           for (InArcIt e(_graph, n); e != INVALID; ++e) {
 
   616             Value rem = (*_flow)[e];
 
   617             if (!_tolerance.positive(rem)) continue;
 
   618             Node v = _graph.source(e);
 
   619             if ((*_level)[v] < level) {
 
   620               if (!_level->active(v) && v != _target) {
 
   623               if (!_tolerance.less(rem, excess)) {
 
   624                 _flow->set(e, (*_flow)[e] - excess);
 
   625                 (*_excess)[v] += excess;
 
   630                 (*_excess)[v] += rem;
 
   633             } else if (new_level > (*_level)[v]) {
 
   634               new_level = (*_level)[v];
 
   640           (*_excess)[n] = excess;
 
   643             if (new_level + 1 < _level->maxLevel()) {
 
   644               _level->liftHighestActive(new_level + 1);
 
   646               _level->liftHighestActiveToTop();
 
   648             if (_level->emptyLevel(level)) {
 
   649               _level->liftToTop(level);
 
   652             _level->deactivate(n);
 
   656         num = _node_num * 20;
 
   658           while (level >= 0 && _level->activeFree(level)) {
 
   662             n = _level->highestActive();
 
   663             level = _level->highestActiveLevel();
 
   664             if (n == INVALID) goto first_phase_done;
 
   666             n = _level->activeOn(level);
 
   670           Value excess = (*_excess)[n];
 
   671           int new_level = _level->maxLevel();
 
   673           for (OutArcIt e(_graph, n); e != INVALID; ++e) {
 
   674             Value rem = (*_capacity)[e] - (*_flow)[e];
 
   675             if (!_tolerance.positive(rem)) continue;
 
   676             Node v = _graph.target(e);
 
   677             if ((*_level)[v] < level) {
 
   678               if (!_level->active(v) && v != _target) {
 
   681               if (!_tolerance.less(rem, excess)) {
 
   682                 _flow->set(e, (*_flow)[e] + excess);
 
   683                 (*_excess)[v] += excess;
 
   688                 (*_excess)[v] += rem;
 
   689                 _flow->set(e, (*_capacity)[e]);
 
   691             } else if (new_level > (*_level)[v]) {
 
   692               new_level = (*_level)[v];
 
   696           for (InArcIt e(_graph, n); e != INVALID; ++e) {
 
   697             Value rem = (*_flow)[e];
 
   698             if (!_tolerance.positive(rem)) continue;
 
   699             Node v = _graph.source(e);
 
   700             if ((*_level)[v] < level) {
 
   701               if (!_level->active(v) && v != _target) {
 
   704               if (!_tolerance.less(rem, excess)) {
 
   705                 _flow->set(e, (*_flow)[e] - excess);
 
   706                 (*_excess)[v] += excess;
 
   711                 (*_excess)[v] += rem;
 
   714             } else if (new_level > (*_level)[v]) {
 
   715               new_level = (*_level)[v];
 
   721           (*_excess)[n] = excess;
 
   724             if (new_level + 1 < _level->maxLevel()) {
 
   725               _level->liftActiveOn(level, new_level + 1);
 
   727               _level->liftActiveToTop(level);
 
   729             if (_level->emptyLevel(level)) {
 
   730               _level->liftToTop(level);
 
   733             _level->deactivate(n);
 
   740     /// \brief Starts the second phase of the preflow algorithm.
 
   742     /// The preflow algorithm consists of two phases, this method runs
 
   743     /// the second phase. After calling one of the \ref init() functions
 
   744     /// and \ref startFirstPhase() and then \ref startSecondPhase(),
 
   745     /// \ref flowMap() returns a maximum flow, \ref flowValue() returns the
 
   746     /// value of a maximum flow, \ref minCut() returns a minimum cut
 
   747     /// \pre One of the \ref init() functions and \ref startFirstPhase()
 
   748     /// must be called before using this function.
 
   749     void startSecondPhase() {
 
   752       typename Digraph::template NodeMap<bool> reached(_graph);
 
   753       for (NodeIt n(_graph); n != INVALID; ++n) {
 
   754         reached[n] = (*_level)[n] < _level->maxLevel();
 
   758       _level->initAddItem(_source);
 
   760       std::vector<Node> queue;
 
   761       queue.push_back(_source);
 
   762       reached[_source] = true;
 
   764       while (!queue.empty()) {
 
   765         _level->initNewLevel();
 
   766         std::vector<Node> nqueue;
 
   767         for (int i = 0; i < int(queue.size()); ++i) {
 
   769           for (OutArcIt e(_graph, n); e != INVALID; ++e) {
 
   770             Node v = _graph.target(e);
 
   771             if (!reached[v] && _tolerance.positive((*_flow)[e])) {
 
   773               _level->initAddItem(v);
 
   777           for (InArcIt e(_graph, n); e != INVALID; ++e) {
 
   778             Node u = _graph.source(e);
 
   780                 _tolerance.positive((*_capacity)[e] - (*_flow)[e])) {
 
   782               _level->initAddItem(u);
 
   789       _level->initFinish();
 
   791       for (NodeIt n(_graph); n != INVALID; ++n) {
 
   793           _level->dirtyTopButOne(n);
 
   794         } else if ((*_excess)[n] > 0 && _target != n) {
 
   800       while ((n = _level->highestActive()) != INVALID) {
 
   801         Value excess = (*_excess)[n];
 
   802         int level = _level->highestActiveLevel();
 
   803         int new_level = _level->maxLevel();
 
   805         for (OutArcIt e(_graph, n); e != INVALID; ++e) {
 
   806           Value rem = (*_capacity)[e] - (*_flow)[e];
 
   807           if (!_tolerance.positive(rem)) continue;
 
   808           Node v = _graph.target(e);
 
   809           if ((*_level)[v] < level) {
 
   810             if (!_level->active(v) && v != _source) {
 
   813             if (!_tolerance.less(rem, excess)) {
 
   814               _flow->set(e, (*_flow)[e] + excess);
 
   815               (*_excess)[v] += excess;
 
   820               (*_excess)[v] += rem;
 
   821               _flow->set(e, (*_capacity)[e]);
 
   823           } else if (new_level > (*_level)[v]) {
 
   824             new_level = (*_level)[v];
 
   828         for (InArcIt e(_graph, n); e != INVALID; ++e) {
 
   829           Value rem = (*_flow)[e];
 
   830           if (!_tolerance.positive(rem)) continue;
 
   831           Node v = _graph.source(e);
 
   832           if ((*_level)[v] < level) {
 
   833             if (!_level->active(v) && v != _source) {
 
   836             if (!_tolerance.less(rem, excess)) {
 
   837               _flow->set(e, (*_flow)[e] - excess);
 
   838               (*_excess)[v] += excess;
 
   843               (*_excess)[v] += rem;
 
   846           } else if (new_level > (*_level)[v]) {
 
   847             new_level = (*_level)[v];
 
   853         (*_excess)[n] = excess;
 
   856           if (new_level + 1 < _level->maxLevel()) {
 
   857             _level->liftHighestActive(new_level + 1);
 
   860             _level->liftHighestActiveToTop();
 
   862           if (_level->emptyLevel(level)) {
 
   864             _level->liftToTop(level);
 
   867           _level->deactivate(n);
 
   873     /// \brief Runs the preflow algorithm.
 
   875     /// Runs the preflow algorithm.
 
   876     /// \note pf.run() is just a shortcut of the following code.
 
   879     ///   pf.startFirstPhase();
 
   880     ///   pf.startSecondPhase();
 
   888     /// \brief Runs the preflow algorithm to compute the minimum cut.
 
   890     /// Runs the preflow algorithm to compute the minimum cut.
 
   891     /// \note pf.runMinCut() is just a shortcut of the following code.
 
   894     ///   pf.startFirstPhase();
 
   903     /// \name Query Functions
 
   904     /// The results of the preflow algorithm can be obtained using these
 
   906     /// Either one of the \ref run() "run*()" functions or one of the
 
   907     /// \ref startFirstPhase() "start*()" functions should be called
 
   908     /// before using them.
 
   912     /// \brief Returns the value of the maximum flow.
 
   914     /// Returns the value of the maximum flow by returning the excess
 
   915     /// of the target node. This value equals to the value of
 
   916     /// the maximum flow already after the first phase of the algorithm.
 
   918     /// \pre Either \ref run() or \ref init() must be called before
 
   919     /// using this function.
 
   920     Value flowValue() const {
 
   921       return (*_excess)[_target];
 
   924     /// \brief Returns the flow value on the given arc.
 
   926     /// Returns the flow value on the given arc. This method can
 
   927     /// be called after the second phase of the algorithm.
 
   929     /// \pre Either \ref run() or \ref init() must be called before
 
   930     /// using this function.
 
   931     Value flow(const Arc& arc) const {
 
   932       return (*_flow)[arc];
 
   935     /// \brief Returns a const reference to the flow map.
 
   937     /// Returns a const reference to the arc map storing the found flow.
 
   938     /// This method can be called after the second phase of the algorithm.
 
   940     /// \pre Either \ref run() or \ref init() must be called before
 
   941     /// using this function.
 
   942     const FlowMap& flowMap() const {
 
   946     /// \brief Returns \c true when the node is on the source side of the
 
   949     /// Returns true when the node is on the source side of the found
 
   950     /// minimum cut. This method can be called both after running \ref
 
   951     /// startFirstPhase() and \ref startSecondPhase().
 
   953     /// \pre Either \ref run() or \ref init() must be called before
 
   954     /// using this function.
 
   955     bool minCut(const Node& node) const {
 
   956       return ((*_level)[node] == _level->maxLevel()) == _phase;
 
   959     /// \brief Gives back a minimum value cut.
 
   961     /// Sets \c cutMap to the characteristic vector of a minimum value
 
   962     /// cut. \c cutMap should be a \ref concepts::WriteMap "writable"
 
   963     /// node map with \c bool (or convertible) value type.
 
   965     /// This method can be called both after running \ref startFirstPhase()
 
   966     /// and \ref startSecondPhase(). The result after the second phase
 
   967     /// could be slightly different if inexact computation is used.
 
   969     /// \note This function calls \ref minCut() for each node, so it runs in
 
   972     /// \pre Either \ref run() or \ref init() must be called before
 
   973     /// using this function.
 
   974     template <typename CutMap>
 
   975     void minCutMap(CutMap& cutMap) const {
 
   976       for (NodeIt n(_graph); n != INVALID; ++n) {
 
   977         cutMap.set(n, minCut(n));