lemon/preflow.h
author Peter Kovacs <kpeter@inf.elte.hu>
Thu, 12 Nov 2009 23:26:13 +0100
changeset 806 fa6f37d7a25b
parent 755 134852d7fb0a
parent 786 e20173729589
child 823 a7e93de12cbd
permissions -rw-r--r--
Entirely rework CapacityScaling (#180)

- Use the new interface similarly to NetworkSimplex.
- Rework the implementation using an efficient internal structure
for handling the residual network. This improvement made the
code much faster (up to 2-5 times faster on large graphs).
- Handle GEQ supply type (LEQ is not supported).
- Handle negative costs for arcs of finite capacity.
(Note that this algorithm cannot handle arcs of negative cost
and infinite upper bound, thus it returns UNBOUNDED if such
an arc exists.)
- Extend the documentation.
     1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library.
     4  *
     5  * Copyright (C) 2003-2009
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     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.
    12  *
    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
    15  * purpose.
    16  *
    17  */
    18 
    19 #ifndef LEMON_PREFLOW_H
    20 #define LEMON_PREFLOW_H
    21 
    22 #include <lemon/tolerance.h>
    23 #include <lemon/elevator.h>
    24 
    25 /// \file
    26 /// \ingroup max_flow
    27 /// \brief Implementation of the preflow algorithm.
    28 
    29 namespace lemon {
    30 
    31   /// \brief Default traits class of Preflow class.
    32   ///
    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 {
    38 
    39     /// \brief The type of the digraph the algorithm runs on.
    40     typedef GR Digraph;
    41 
    42     /// \brief The type of the map that stores the arc capacities.
    43     ///
    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;
    47 
    48     /// \brief The type of the flow values.
    49     typedef typename CapacityMap::Value Value;
    50 
    51     /// \brief The type of the map that stores the flow values.
    52     ///
    53     /// The type of the map that stores the flow values.
    54     /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
    55 #ifdef DOXYGEN
    56     typedef GR::ArcMap<Value> FlowMap;
    57 #else
    58     typedef typename Digraph::template ArcMap<Value> FlowMap;
    59 #endif
    60 
    61     /// \brief Instantiates a FlowMap.
    62     ///
    63     /// This function instantiates a \ref FlowMap.
    64     /// \param digraph The digraph for which we would like to define
    65     /// the flow map.
    66     static FlowMap* createFlowMap(const Digraph& digraph) {
    67       return new FlowMap(digraph);
    68     }
    69 
    70     /// \brief The elevator type used by Preflow algorithm.
    71     ///
    72     /// The elevator type used by Preflow algorithm.
    73     ///
    74     /// \sa Elevator, LinkedElevator
    75 #ifdef DOXYGEN
    76     typedef lemon::Elevator<GR, GR::Node> Elevator;
    77 #else
    78     typedef lemon::Elevator<Digraph, typename Digraph::Node> Elevator;
    79 #endif
    80 
    81     /// \brief Instantiates an Elevator.
    82     ///
    83     /// This function instantiates an \ref Elevator.
    84     /// \param digraph The digraph for which we would like to define
    85     /// the elevator.
    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);
    89     }
    90 
    91     /// \brief The tolerance used by the algorithm
    92     ///
    93     /// The tolerance used by the algorithm to handle inexact computation.
    94     typedef lemon::Tolerance<Value> Tolerance;
    95 
    96   };
    97 
    98 
    99   /// \ingroup max_flow
   100   ///
   101   /// \brief %Preflow algorithm class.
   102   ///
   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 \ref clrs01algorithms,
   106   /// \ref amo93networkflows, \ref 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{e})\f$.
   111   ///
   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.
   115   ///
   116   /// \tparam GR The type of the digraph the algorithm runs on.
   117   /// \tparam CAP The type of the capacity map. The default map
   118   /// type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
   119 #ifdef DOXYGEN
   120   template <typename GR, typename CAP, typename TR>
   121 #else
   122   template <typename GR,
   123             typename CAP = typename GR::template ArcMap<int>,
   124             typename TR = PreflowDefaultTraits<GR, CAP> >
   125 #endif
   126   class Preflow {
   127   public:
   128 
   129     ///The \ref PreflowDefaultTraits "traits class" of the algorithm.
   130     typedef TR Traits;
   131     ///The type of the digraph the algorithm runs on.
   132     typedef typename Traits::Digraph Digraph;
   133     ///The type of the capacity map.
   134     typedef typename Traits::CapacityMap CapacityMap;
   135     ///The type of the flow values.
   136     typedef typename Traits::Value Value;
   137 
   138     ///The type of the flow map.
   139     typedef typename Traits::FlowMap FlowMap;
   140     ///The type of the elevator.
   141     typedef typename Traits::Elevator Elevator;
   142     ///The type of the tolerance.
   143     typedef typename Traits::Tolerance Tolerance;
   144 
   145   private:
   146 
   147     TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
   148 
   149     const Digraph& _graph;
   150     const CapacityMap* _capacity;
   151 
   152     int _node_num;
   153 
   154     Node _source, _target;
   155 
   156     FlowMap* _flow;
   157     bool _local_flow;
   158 
   159     Elevator* _level;
   160     bool _local_level;
   161 
   162     typedef typename Digraph::template NodeMap<Value> ExcessMap;
   163     ExcessMap* _excess;
   164 
   165     Tolerance _tolerance;
   166 
   167     bool _phase;
   168 
   169 
   170     void createStructures() {
   171       _node_num = countNodes(_graph);
   172 
   173       if (!_flow) {
   174         _flow = Traits::createFlowMap(_graph);
   175         _local_flow = true;
   176       }
   177       if (!_level) {
   178         _level = Traits::createElevator(_graph, _node_num);
   179         _local_level = true;
   180       }
   181       if (!_excess) {
   182         _excess = new ExcessMap(_graph);
   183       }
   184     }
   185 
   186     void destroyStructures() {
   187       if (_local_flow) {
   188         delete _flow;
   189       }
   190       if (_local_level) {
   191         delete _level;
   192       }
   193       if (_excess) {
   194         delete _excess;
   195       }
   196     }
   197 
   198   public:
   199 
   200     typedef Preflow Create;
   201 
   202     ///\name Named Template Parameters
   203 
   204     ///@{
   205 
   206     template <typename T>
   207     struct SetFlowMapTraits : public Traits {
   208       typedef T FlowMap;
   209       static FlowMap *createFlowMap(const Digraph&) {
   210         LEMON_ASSERT(false, "FlowMap is not initialized");
   211         return 0; // ignore warnings
   212       }
   213     };
   214 
   215     /// \brief \ref named-templ-param "Named parameter" for setting
   216     /// FlowMap type
   217     ///
   218     /// \ref named-templ-param "Named parameter" for setting FlowMap
   219     /// type.
   220     template <typename T>
   221     struct SetFlowMap
   222       : public Preflow<Digraph, CapacityMap, SetFlowMapTraits<T> > {
   223       typedef Preflow<Digraph, CapacityMap,
   224                       SetFlowMapTraits<T> > Create;
   225     };
   226 
   227     template <typename T>
   228     struct SetElevatorTraits : public Traits {
   229       typedef T Elevator;
   230       static Elevator *createElevator(const Digraph&, int) {
   231         LEMON_ASSERT(false, "Elevator is not initialized");
   232         return 0; // ignore warnings
   233       }
   234     };
   235 
   236     /// \brief \ref named-templ-param "Named parameter" for setting
   237     /// Elevator type
   238     ///
   239     /// \ref named-templ-param "Named parameter" for setting Elevator
   240     /// type. If this named parameter is used, then an external
   241     /// elevator object must be passed to the algorithm using the
   242     /// \ref elevator(Elevator&) "elevator()" function before calling
   243     /// \ref run() or \ref init().
   244     /// \sa SetStandardElevator
   245     template <typename T>
   246     struct SetElevator
   247       : public Preflow<Digraph, CapacityMap, SetElevatorTraits<T> > {
   248       typedef Preflow<Digraph, CapacityMap,
   249                       SetElevatorTraits<T> > Create;
   250     };
   251 
   252     template <typename T>
   253     struct SetStandardElevatorTraits : public Traits {
   254       typedef T Elevator;
   255       static Elevator *createElevator(const Digraph& digraph, int max_level) {
   256         return new Elevator(digraph, max_level);
   257       }
   258     };
   259 
   260     /// \brief \ref named-templ-param "Named parameter" for setting
   261     /// Elevator type with automatic allocation
   262     ///
   263     /// \ref named-templ-param "Named parameter" for setting Elevator
   264     /// type with automatic allocation.
   265     /// The Elevator should have standard constructor interface to be
   266     /// able to automatically created by the algorithm (i.e. the
   267     /// digraph and the maximum level should be passed to it).
   268     /// However, an external elevator object could also be passed to the
   269     /// algorithm with the \ref elevator(Elevator&) "elevator()" function
   270     /// before calling \ref run() or \ref init().
   271     /// \sa SetElevator
   272     template <typename T>
   273     struct SetStandardElevator
   274       : public Preflow<Digraph, CapacityMap,
   275                        SetStandardElevatorTraits<T> > {
   276       typedef Preflow<Digraph, CapacityMap,
   277                       SetStandardElevatorTraits<T> > Create;
   278     };
   279 
   280     /// @}
   281 
   282   protected:
   283 
   284     Preflow() {}
   285 
   286   public:
   287 
   288 
   289     /// \brief The constructor of the class.
   290     ///
   291     /// The constructor of the class.
   292     /// \param digraph The digraph the algorithm runs on.
   293     /// \param capacity The capacity of the arcs.
   294     /// \param source The source node.
   295     /// \param target The target node.
   296     Preflow(const Digraph& digraph, const CapacityMap& capacity,
   297             Node source, Node target)
   298       : _graph(digraph), _capacity(&capacity),
   299         _node_num(0), _source(source), _target(target),
   300         _flow(0), _local_flow(false),
   301         _level(0), _local_level(false),
   302         _excess(0), _tolerance(), _phase() {}
   303 
   304     /// \brief Destructor.
   305     ///
   306     /// Destructor.
   307     ~Preflow() {
   308       destroyStructures();
   309     }
   310 
   311     /// \brief Sets the capacity map.
   312     ///
   313     /// Sets the capacity map.
   314     /// \return <tt>(*this)</tt>
   315     Preflow& capacityMap(const CapacityMap& map) {
   316       _capacity = &map;
   317       return *this;
   318     }
   319 
   320     /// \brief Sets the flow map.
   321     ///
   322     /// Sets the flow map.
   323     /// If you don't use this function before calling \ref run() or
   324     /// \ref init(), an instance will be allocated automatically.
   325     /// The destructor deallocates this automatically allocated map,
   326     /// of course.
   327     /// \return <tt>(*this)</tt>
   328     Preflow& flowMap(FlowMap& map) {
   329       if (_local_flow) {
   330         delete _flow;
   331         _local_flow = false;
   332       }
   333       _flow = &map;
   334       return *this;
   335     }
   336 
   337     /// \brief Sets the source node.
   338     ///
   339     /// Sets the source node.
   340     /// \return <tt>(*this)</tt>
   341     Preflow& source(const Node& node) {
   342       _source = node;
   343       return *this;
   344     }
   345 
   346     /// \brief Sets the target node.
   347     ///
   348     /// Sets the target node.
   349     /// \return <tt>(*this)</tt>
   350     Preflow& target(const Node& node) {
   351       _target = node;
   352       return *this;
   353     }
   354 
   355     /// \brief Sets the elevator used by algorithm.
   356     ///
   357     /// Sets the elevator used by algorithm.
   358     /// If you don't use this function before calling \ref run() or
   359     /// \ref init(), an instance will be allocated automatically.
   360     /// The destructor deallocates this automatically allocated elevator,
   361     /// of course.
   362     /// \return <tt>(*this)</tt>
   363     Preflow& elevator(Elevator& elevator) {
   364       if (_local_level) {
   365         delete _level;
   366         _local_level = false;
   367       }
   368       _level = &elevator;
   369       return *this;
   370     }
   371 
   372     /// \brief Returns a const reference to the elevator.
   373     ///
   374     /// Returns a const reference to the elevator.
   375     ///
   376     /// \pre Either \ref run() or \ref init() must be called before
   377     /// using this function.
   378     const Elevator& elevator() const {
   379       return *_level;
   380     }
   381 
   382     /// \brief Sets the tolerance used by the algorithm.
   383     ///
   384     /// Sets the tolerance object used by the algorithm.
   385     /// \return <tt>(*this)</tt>
   386     Preflow& tolerance(const Tolerance& tolerance) {
   387       _tolerance = tolerance;
   388       return *this;
   389     }
   390 
   391     /// \brief Returns a const reference to the tolerance.
   392     ///
   393     /// Returns a const reference to the tolerance object used by
   394     /// the algorithm.
   395     const Tolerance& tolerance() const {
   396       return _tolerance;
   397     }
   398 
   399     /// \name Execution Control
   400     /// The simplest way to execute the preflow algorithm is to use
   401     /// \ref run() or \ref runMinCut().\n
   402     /// If you need better control on the initial solution or the execution,
   403     /// you have to call one of the \ref init() functions first, then
   404     /// \ref startFirstPhase() and if you need it \ref startSecondPhase().
   405 
   406     ///@{
   407 
   408     /// \brief Initializes the internal data structures.
   409     ///
   410     /// Initializes the internal data structures and sets the initial
   411     /// flow to zero on each arc.
   412     void init() {
   413       createStructures();
   414 
   415       _phase = true;
   416       for (NodeIt n(_graph); n != INVALID; ++n) {
   417         (*_excess)[n] = 0;
   418       }
   419 
   420       for (ArcIt e(_graph); e != INVALID; ++e) {
   421         _flow->set(e, 0);
   422       }
   423 
   424       typename Digraph::template NodeMap<bool> reached(_graph, false);
   425 
   426       _level->initStart();
   427       _level->initAddItem(_target);
   428 
   429       std::vector<Node> queue;
   430       reached[_source] = true;
   431 
   432       queue.push_back(_target);
   433       reached[_target] = true;
   434       while (!queue.empty()) {
   435         _level->initNewLevel();
   436         std::vector<Node> nqueue;
   437         for (int i = 0; i < int(queue.size()); ++i) {
   438           Node n = queue[i];
   439           for (InArcIt e(_graph, n); e != INVALID; ++e) {
   440             Node u = _graph.source(e);
   441             if (!reached[u] && _tolerance.positive((*_capacity)[e])) {
   442               reached[u] = true;
   443               _level->initAddItem(u);
   444               nqueue.push_back(u);
   445             }
   446           }
   447         }
   448         queue.swap(nqueue);
   449       }
   450       _level->initFinish();
   451 
   452       for (OutArcIt e(_graph, _source); e != INVALID; ++e) {
   453         if (_tolerance.positive((*_capacity)[e])) {
   454           Node u = _graph.target(e);
   455           if ((*_level)[u] == _level->maxLevel()) continue;
   456           _flow->set(e, (*_capacity)[e]);
   457           (*_excess)[u] += (*_capacity)[e];
   458           if (u != _target && !_level->active(u)) {
   459             _level->activate(u);
   460           }
   461         }
   462       }
   463     }
   464 
   465     /// \brief Initializes the internal data structures using the
   466     /// given flow map.
   467     ///
   468     /// Initializes the internal data structures and sets the initial
   469     /// flow to the given \c flowMap. The \c flowMap should contain a
   470     /// flow or at least a preflow, i.e. at each node excluding the
   471     /// source node the incoming flow should greater or equal to the
   472     /// outgoing flow.
   473     /// \return \c false if the given \c flowMap is not a preflow.
   474     template <typename FlowMap>
   475     bool init(const FlowMap& flowMap) {
   476       createStructures();
   477 
   478       for (ArcIt e(_graph); e != INVALID; ++e) {
   479         _flow->set(e, flowMap[e]);
   480       }
   481 
   482       for (NodeIt n(_graph); n != INVALID; ++n) {
   483         Value excess = 0;
   484         for (InArcIt e(_graph, n); e != INVALID; ++e) {
   485           excess += (*_flow)[e];
   486         }
   487         for (OutArcIt e(_graph, n); e != INVALID; ++e) {
   488           excess -= (*_flow)[e];
   489         }
   490         if (excess < 0 && n != _source) return false;
   491         (*_excess)[n] = excess;
   492       }
   493 
   494       typename Digraph::template NodeMap<bool> reached(_graph, false);
   495 
   496       _level->initStart();
   497       _level->initAddItem(_target);
   498 
   499       std::vector<Node> queue;
   500       reached[_source] = true;
   501 
   502       queue.push_back(_target);
   503       reached[_target] = true;
   504       while (!queue.empty()) {
   505         _level->initNewLevel();
   506         std::vector<Node> nqueue;
   507         for (int i = 0; i < int(queue.size()); ++i) {
   508           Node n = queue[i];
   509           for (InArcIt e(_graph, n); e != INVALID; ++e) {
   510             Node u = _graph.source(e);
   511             if (!reached[u] &&
   512                 _tolerance.positive((*_capacity)[e] - (*_flow)[e])) {
   513               reached[u] = true;
   514               _level->initAddItem(u);
   515               nqueue.push_back(u);
   516             }
   517           }
   518           for (OutArcIt e(_graph, n); e != INVALID; ++e) {
   519             Node v = _graph.target(e);
   520             if (!reached[v] && _tolerance.positive((*_flow)[e])) {
   521               reached[v] = true;
   522               _level->initAddItem(v);
   523               nqueue.push_back(v);
   524             }
   525           }
   526         }
   527         queue.swap(nqueue);
   528       }
   529       _level->initFinish();
   530 
   531       for (OutArcIt e(_graph, _source); e != INVALID; ++e) {
   532         Value rem = (*_capacity)[e] - (*_flow)[e];
   533         if (_tolerance.positive(rem)) {
   534           Node u = _graph.target(e);
   535           if ((*_level)[u] == _level->maxLevel()) continue;
   536           _flow->set(e, (*_capacity)[e]);
   537           (*_excess)[u] += rem;
   538           if (u != _target && !_level->active(u)) {
   539             _level->activate(u);
   540           }
   541         }
   542       }
   543       for (InArcIt e(_graph, _source); e != INVALID; ++e) {
   544         Value rem = (*_flow)[e];
   545         if (_tolerance.positive(rem)) {
   546           Node v = _graph.source(e);
   547           if ((*_level)[v] == _level->maxLevel()) continue;
   548           _flow->set(e, 0);
   549           (*_excess)[v] += rem;
   550           if (v != _target && !_level->active(v)) {
   551             _level->activate(v);
   552           }
   553         }
   554       }
   555       return true;
   556     }
   557 
   558     /// \brief Starts the first phase of the preflow algorithm.
   559     ///
   560     /// The preflow algorithm consists of two phases, this method runs
   561     /// the first phase. After the first phase the maximum flow value
   562     /// and a minimum value cut can already be computed, although a
   563     /// maximum flow is not yet obtained. So after calling this method
   564     /// \ref flowValue() returns the value of a maximum flow and \ref
   565     /// minCut() returns a minimum cut.
   566     /// \pre One of the \ref init() functions must be called before
   567     /// using this function.
   568     void startFirstPhase() {
   569       _phase = true;
   570 
   571       Node n = _level->highestActive();
   572       int level = _level->highestActiveLevel();
   573       while (n != INVALID) {
   574         int num = _node_num;
   575 
   576         while (num > 0 && n != INVALID) {
   577           Value excess = (*_excess)[n];
   578           int new_level = _level->maxLevel();
   579 
   580           for (OutArcIt e(_graph, n); e != INVALID; ++e) {
   581             Value rem = (*_capacity)[e] - (*_flow)[e];
   582             if (!_tolerance.positive(rem)) continue;
   583             Node v = _graph.target(e);
   584             if ((*_level)[v] < level) {
   585               if (!_level->active(v) && v != _target) {
   586                 _level->activate(v);
   587               }
   588               if (!_tolerance.less(rem, excess)) {
   589                 _flow->set(e, (*_flow)[e] + excess);
   590                 (*_excess)[v] += excess;
   591                 excess = 0;
   592                 goto no_more_push_1;
   593               } else {
   594                 excess -= rem;
   595                 (*_excess)[v] += rem;
   596                 _flow->set(e, (*_capacity)[e]);
   597               }
   598             } else if (new_level > (*_level)[v]) {
   599               new_level = (*_level)[v];
   600             }
   601           }
   602 
   603           for (InArcIt e(_graph, n); e != INVALID; ++e) {
   604             Value rem = (*_flow)[e];
   605             if (!_tolerance.positive(rem)) continue;
   606             Node v = _graph.source(e);
   607             if ((*_level)[v] < level) {
   608               if (!_level->active(v) && v != _target) {
   609                 _level->activate(v);
   610               }
   611               if (!_tolerance.less(rem, excess)) {
   612                 _flow->set(e, (*_flow)[e] - excess);
   613                 (*_excess)[v] += excess;
   614                 excess = 0;
   615                 goto no_more_push_1;
   616               } else {
   617                 excess -= rem;
   618                 (*_excess)[v] += rem;
   619                 _flow->set(e, 0);
   620               }
   621             } else if (new_level > (*_level)[v]) {
   622               new_level = (*_level)[v];
   623             }
   624           }
   625 
   626         no_more_push_1:
   627 
   628           (*_excess)[n] = excess;
   629 
   630           if (excess != 0) {
   631             if (new_level + 1 < _level->maxLevel()) {
   632               _level->liftHighestActive(new_level + 1);
   633             } else {
   634               _level->liftHighestActiveToTop();
   635             }
   636             if (_level->emptyLevel(level)) {
   637               _level->liftToTop(level);
   638             }
   639           } else {
   640             _level->deactivate(n);
   641           }
   642 
   643           n = _level->highestActive();
   644           level = _level->highestActiveLevel();
   645           --num;
   646         }
   647 
   648         num = _node_num * 20;
   649         while (num > 0 && n != INVALID) {
   650           Value excess = (*_excess)[n];
   651           int new_level = _level->maxLevel();
   652 
   653           for (OutArcIt e(_graph, n); e != INVALID; ++e) {
   654             Value rem = (*_capacity)[e] - (*_flow)[e];
   655             if (!_tolerance.positive(rem)) continue;
   656             Node v = _graph.target(e);
   657             if ((*_level)[v] < level) {
   658               if (!_level->active(v) && v != _target) {
   659                 _level->activate(v);
   660               }
   661               if (!_tolerance.less(rem, excess)) {
   662                 _flow->set(e, (*_flow)[e] + excess);
   663                 (*_excess)[v] += excess;
   664                 excess = 0;
   665                 goto no_more_push_2;
   666               } else {
   667                 excess -= rem;
   668                 (*_excess)[v] += rem;
   669                 _flow->set(e, (*_capacity)[e]);
   670               }
   671             } else if (new_level > (*_level)[v]) {
   672               new_level = (*_level)[v];
   673             }
   674           }
   675 
   676           for (InArcIt e(_graph, n); e != INVALID; ++e) {
   677             Value rem = (*_flow)[e];
   678             if (!_tolerance.positive(rem)) continue;
   679             Node v = _graph.source(e);
   680             if ((*_level)[v] < level) {
   681               if (!_level->active(v) && v != _target) {
   682                 _level->activate(v);
   683               }
   684               if (!_tolerance.less(rem, excess)) {
   685                 _flow->set(e, (*_flow)[e] - excess);
   686                 (*_excess)[v] += excess;
   687                 excess = 0;
   688                 goto no_more_push_2;
   689               } else {
   690                 excess -= rem;
   691                 (*_excess)[v] += rem;
   692                 _flow->set(e, 0);
   693               }
   694             } else if (new_level > (*_level)[v]) {
   695               new_level = (*_level)[v];
   696             }
   697           }
   698 
   699         no_more_push_2:
   700 
   701           (*_excess)[n] = excess;
   702 
   703           if (excess != 0) {
   704             if (new_level + 1 < _level->maxLevel()) {
   705               _level->liftActiveOn(level, new_level + 1);
   706             } else {
   707               _level->liftActiveToTop(level);
   708             }
   709             if (_level->emptyLevel(level)) {
   710               _level->liftToTop(level);
   711             }
   712           } else {
   713             _level->deactivate(n);
   714           }
   715 
   716           while (level >= 0 && _level->activeFree(level)) {
   717             --level;
   718           }
   719           if (level == -1) {
   720             n = _level->highestActive();
   721             level = _level->highestActiveLevel();
   722           } else {
   723             n = _level->activeOn(level);
   724           }
   725           --num;
   726         }
   727       }
   728     }
   729 
   730     /// \brief Starts the second phase of the preflow algorithm.
   731     ///
   732     /// The preflow algorithm consists of two phases, this method runs
   733     /// the second phase. After calling one of the \ref init() functions
   734     /// and \ref startFirstPhase() and then \ref startSecondPhase(),
   735     /// \ref flowMap() returns a maximum flow, \ref flowValue() returns the
   736     /// value of a maximum flow, \ref minCut() returns a minimum cut
   737     /// \pre One of the \ref init() functions and \ref startFirstPhase()
   738     /// must be called before using this function.
   739     void startSecondPhase() {
   740       _phase = false;
   741 
   742       typename Digraph::template NodeMap<bool> reached(_graph);
   743       for (NodeIt n(_graph); n != INVALID; ++n) {
   744         reached[n] = (*_level)[n] < _level->maxLevel();
   745       }
   746 
   747       _level->initStart();
   748       _level->initAddItem(_source);
   749 
   750       std::vector<Node> queue;
   751       queue.push_back(_source);
   752       reached[_source] = true;
   753 
   754       while (!queue.empty()) {
   755         _level->initNewLevel();
   756         std::vector<Node> nqueue;
   757         for (int i = 0; i < int(queue.size()); ++i) {
   758           Node n = queue[i];
   759           for (OutArcIt e(_graph, n); e != INVALID; ++e) {
   760             Node v = _graph.target(e);
   761             if (!reached[v] && _tolerance.positive((*_flow)[e])) {
   762               reached[v] = true;
   763               _level->initAddItem(v);
   764               nqueue.push_back(v);
   765             }
   766           }
   767           for (InArcIt e(_graph, n); e != INVALID; ++e) {
   768             Node u = _graph.source(e);
   769             if (!reached[u] &&
   770                 _tolerance.positive((*_capacity)[e] - (*_flow)[e])) {
   771               reached[u] = true;
   772               _level->initAddItem(u);
   773               nqueue.push_back(u);
   774             }
   775           }
   776         }
   777         queue.swap(nqueue);
   778       }
   779       _level->initFinish();
   780 
   781       for (NodeIt n(_graph); n != INVALID; ++n) {
   782         if (!reached[n]) {
   783           _level->dirtyTopButOne(n);
   784         } else if ((*_excess)[n] > 0 && _target != n) {
   785           _level->activate(n);
   786         }
   787       }
   788 
   789       Node n;
   790       while ((n = _level->highestActive()) != INVALID) {
   791         Value excess = (*_excess)[n];
   792         int level = _level->highestActiveLevel();
   793         int new_level = _level->maxLevel();
   794 
   795         for (OutArcIt e(_graph, n); e != INVALID; ++e) {
   796           Value rem = (*_capacity)[e] - (*_flow)[e];
   797           if (!_tolerance.positive(rem)) continue;
   798           Node v = _graph.target(e);
   799           if ((*_level)[v] < level) {
   800             if (!_level->active(v) && v != _source) {
   801               _level->activate(v);
   802             }
   803             if (!_tolerance.less(rem, excess)) {
   804               _flow->set(e, (*_flow)[e] + excess);
   805               (*_excess)[v] += excess;
   806               excess = 0;
   807               goto no_more_push;
   808             } else {
   809               excess -= rem;
   810               (*_excess)[v] += rem;
   811               _flow->set(e, (*_capacity)[e]);
   812             }
   813           } else if (new_level > (*_level)[v]) {
   814             new_level = (*_level)[v];
   815           }
   816         }
   817 
   818         for (InArcIt e(_graph, n); e != INVALID; ++e) {
   819           Value rem = (*_flow)[e];
   820           if (!_tolerance.positive(rem)) continue;
   821           Node v = _graph.source(e);
   822           if ((*_level)[v] < level) {
   823             if (!_level->active(v) && v != _source) {
   824               _level->activate(v);
   825             }
   826             if (!_tolerance.less(rem, excess)) {
   827               _flow->set(e, (*_flow)[e] - excess);
   828               (*_excess)[v] += excess;
   829               excess = 0;
   830               goto no_more_push;
   831             } else {
   832               excess -= rem;
   833               (*_excess)[v] += rem;
   834               _flow->set(e, 0);
   835             }
   836           } else if (new_level > (*_level)[v]) {
   837             new_level = (*_level)[v];
   838           }
   839         }
   840 
   841       no_more_push:
   842 
   843         (*_excess)[n] = excess;
   844 
   845         if (excess != 0) {
   846           if (new_level + 1 < _level->maxLevel()) {
   847             _level->liftHighestActive(new_level + 1);
   848           } else {
   849             // Calculation error
   850             _level->liftHighestActiveToTop();
   851           }
   852           if (_level->emptyLevel(level)) {
   853             // Calculation error
   854             _level->liftToTop(level);
   855           }
   856         } else {
   857           _level->deactivate(n);
   858         }
   859 
   860       }
   861     }
   862 
   863     /// \brief Runs the preflow algorithm.
   864     ///
   865     /// Runs the preflow algorithm.
   866     /// \note pf.run() is just a shortcut of the following code.
   867     /// \code
   868     ///   pf.init();
   869     ///   pf.startFirstPhase();
   870     ///   pf.startSecondPhase();
   871     /// \endcode
   872     void run() {
   873       init();
   874       startFirstPhase();
   875       startSecondPhase();
   876     }
   877 
   878     /// \brief Runs the preflow algorithm to compute the minimum cut.
   879     ///
   880     /// Runs the preflow algorithm to compute the minimum cut.
   881     /// \note pf.runMinCut() is just a shortcut of the following code.
   882     /// \code
   883     ///   pf.init();
   884     ///   pf.startFirstPhase();
   885     /// \endcode
   886     void runMinCut() {
   887       init();
   888       startFirstPhase();
   889     }
   890 
   891     /// @}
   892 
   893     /// \name Query Functions
   894     /// The results of the preflow algorithm can be obtained using these
   895     /// functions.\n
   896     /// Either one of the \ref run() "run*()" functions or one of the
   897     /// \ref startFirstPhase() "start*()" functions should be called
   898     /// before using them.
   899 
   900     ///@{
   901 
   902     /// \brief Returns the value of the maximum flow.
   903     ///
   904     /// Returns the value of the maximum flow by returning the excess
   905     /// of the target node. This value equals to the value of
   906     /// the maximum flow already after the first phase of the algorithm.
   907     ///
   908     /// \pre Either \ref run() or \ref init() must be called before
   909     /// using this function.
   910     Value flowValue() const {
   911       return (*_excess)[_target];
   912     }
   913 
   914     /// \brief Returns the flow value on the given arc.
   915     ///
   916     /// Returns the flow value on the given arc. This method can
   917     /// be called after the second phase of the algorithm.
   918     ///
   919     /// \pre Either \ref run() or \ref init() must be called before
   920     /// using this function.
   921     Value flow(const Arc& arc) const {
   922       return (*_flow)[arc];
   923     }
   924 
   925     /// \brief Returns a const reference to the flow map.
   926     ///
   927     /// Returns a const reference to the arc map storing the found flow.
   928     /// This method can be called after the second phase of the algorithm.
   929     ///
   930     /// \pre Either \ref run() or \ref init() must be called before
   931     /// using this function.
   932     const FlowMap& flowMap() const {
   933       return *_flow;
   934     }
   935 
   936     /// \brief Returns \c true when the node is on the source side of the
   937     /// minimum cut.
   938     ///
   939     /// Returns true when the node is on the source side of the found
   940     /// minimum cut. This method can be called both after running \ref
   941     /// startFirstPhase() and \ref startSecondPhase().
   942     ///
   943     /// \pre Either \ref run() or \ref init() must be called before
   944     /// using this function.
   945     bool minCut(const Node& node) const {
   946       return ((*_level)[node] == _level->maxLevel()) == _phase;
   947     }
   948 
   949     /// \brief Gives back a minimum value cut.
   950     ///
   951     /// Sets \c cutMap to the characteristic vector of a minimum value
   952     /// cut. \c cutMap should be a \ref concepts::WriteMap "writable"
   953     /// node map with \c bool (or convertible) value type.
   954     ///
   955     /// This method can be called both after running \ref startFirstPhase()
   956     /// and \ref startSecondPhase(). The result after the second phase
   957     /// could be slightly different if inexact computation is used.
   958     ///
   959     /// \note This function calls \ref minCut() for each node, so it runs in
   960     /// O(n) time.
   961     ///
   962     /// \pre Either \ref run() or \ref init() must be called before
   963     /// using this function.
   964     template <typename CutMap>
   965     void minCutMap(CutMap& cutMap) const {
   966       for (NodeIt n(_graph); n != INVALID; ++n) {
   967         cutMap.set(n, minCut(n));
   968       }
   969     }
   970 
   971     /// @}
   972   };
   973 }
   974 
   975 #endif