lemon/capacity_scaling.h
changeset 805 d3e32a777d0b
child 806 fa6f37d7a25b
equal deleted inserted replaced
-1:000000000000 0:160de1ad881a
       
     1 /* -*- C++ -*-
       
     2  *
       
     3  * This file is a part of LEMON, a generic C++ optimization library
       
     4  *
       
     5  * Copyright (C) 2003-2008
       
     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_CAPACITY_SCALING_H
       
    20 #define LEMON_CAPACITY_SCALING_H
       
    21 
       
    22 /// \ingroup min_cost_flow
       
    23 ///
       
    24 /// \file
       
    25 /// \brief Capacity scaling algorithm for finding a minimum cost flow.
       
    26 
       
    27 #include <vector>
       
    28 #include <lemon/bin_heap.h>
       
    29 
       
    30 namespace lemon {
       
    31 
       
    32   /// \addtogroup min_cost_flow
       
    33   /// @{
       
    34 
       
    35   /// \brief Implementation of the capacity scaling algorithm for
       
    36   /// finding a minimum cost flow.
       
    37   ///
       
    38   /// \ref CapacityScaling implements the capacity scaling version
       
    39   /// of the successive shortest path algorithm for finding a minimum
       
    40   /// cost flow.
       
    41   ///
       
    42   /// \tparam Digraph The digraph type the algorithm runs on.
       
    43   /// \tparam LowerMap The type of the lower bound map.
       
    44   /// \tparam CapacityMap The type of the capacity (upper bound) map.
       
    45   /// \tparam CostMap The type of the cost (length) map.
       
    46   /// \tparam SupplyMap The type of the supply map.
       
    47   ///
       
    48   /// \warning
       
    49   /// - Arc capacities and costs should be \e non-negative \e integers.
       
    50   /// - Supply values should be \e signed \e integers.
       
    51   /// - The value types of the maps should be convertible to each other.
       
    52   /// - \c CostMap::Value must be signed type.
       
    53   ///
       
    54   /// \author Peter Kovacs
       
    55   template < typename Digraph,
       
    56              typename LowerMap = typename Digraph::template ArcMap<int>,
       
    57              typename CapacityMap = typename Digraph::template ArcMap<int>,
       
    58              typename CostMap = typename Digraph::template ArcMap<int>,
       
    59              typename SupplyMap = typename Digraph::template NodeMap<int> >
       
    60   class CapacityScaling
       
    61   {
       
    62     TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
       
    63 
       
    64     typedef typename CapacityMap::Value Capacity;
       
    65     typedef typename CostMap::Value Cost;
       
    66     typedef typename SupplyMap::Value Supply;
       
    67     typedef typename Digraph::template ArcMap<Capacity> CapacityArcMap;
       
    68     typedef typename Digraph::template NodeMap<Supply> SupplyNodeMap;
       
    69     typedef typename Digraph::template NodeMap<Arc> PredMap;
       
    70 
       
    71   public:
       
    72 
       
    73     /// The type of the flow map.
       
    74     typedef typename Digraph::template ArcMap<Capacity> FlowMap;
       
    75     /// The type of the potential map.
       
    76     typedef typename Digraph::template NodeMap<Cost> PotentialMap;
       
    77 
       
    78   private:
       
    79 
       
    80     /// \brief Special implementation of the \ref Dijkstra algorithm
       
    81     /// for finding shortest paths in the residual network.
       
    82     ///
       
    83     /// \ref ResidualDijkstra is a special implementation of the
       
    84     /// \ref Dijkstra algorithm for finding shortest paths in the
       
    85     /// residual network of the digraph with respect to the reduced arc
       
    86     /// costs and modifying the node potentials according to the
       
    87     /// distance of the nodes.
       
    88     class ResidualDijkstra
       
    89     {
       
    90       typedef typename Digraph::template NodeMap<int> HeapCrossRef;
       
    91       typedef BinHeap<Cost, HeapCrossRef> Heap;
       
    92 
       
    93     private:
       
    94 
       
    95       // The digraph the algorithm runs on
       
    96       const Digraph &_graph;
       
    97 
       
    98       // The main maps
       
    99       const FlowMap &_flow;
       
   100       const CapacityArcMap &_res_cap;
       
   101       const CostMap &_cost;
       
   102       const SupplyNodeMap &_excess;
       
   103       PotentialMap &_potential;
       
   104 
       
   105       // The distance map
       
   106       PotentialMap _dist;
       
   107       // The pred arc map
       
   108       PredMap &_pred;
       
   109       // The processed (i.e. permanently labeled) nodes
       
   110       std::vector<Node> _proc_nodes;
       
   111 
       
   112     public:
       
   113 
       
   114       /// Constructor.
       
   115       ResidualDijkstra( const Digraph &digraph,
       
   116                         const FlowMap &flow,
       
   117                         const CapacityArcMap &res_cap,
       
   118                         const CostMap &cost,
       
   119                         const SupplyMap &excess,
       
   120                         PotentialMap &potential,
       
   121                         PredMap &pred ) :
       
   122         _graph(digraph), _flow(flow), _res_cap(res_cap), _cost(cost),
       
   123         _excess(excess), _potential(potential), _dist(digraph),
       
   124         _pred(pred)
       
   125       {}
       
   126 
       
   127       /// Run the algorithm from the given source node.
       
   128       Node run(Node s, Capacity delta = 1) {
       
   129         HeapCrossRef heap_cross_ref(_graph, Heap::PRE_HEAP);
       
   130         Heap heap(heap_cross_ref);
       
   131         heap.push(s, 0);
       
   132         _pred[s] = INVALID;
       
   133         _proc_nodes.clear();
       
   134 
       
   135         // Processing nodes
       
   136         while (!heap.empty() && _excess[heap.top()] > -delta) {
       
   137           Node u = heap.top(), v;
       
   138           Cost d = heap.prio() + _potential[u], nd;
       
   139           _dist[u] = heap.prio();
       
   140           heap.pop();
       
   141           _proc_nodes.push_back(u);
       
   142 
       
   143           // Traversing outgoing arcs
       
   144           for (OutArcIt e(_graph, u); e != INVALID; ++e) {
       
   145             if (_res_cap[e] >= delta) {
       
   146               v = _graph.target(e);
       
   147               switch(heap.state(v)) {
       
   148               case Heap::PRE_HEAP:
       
   149                 heap.push(v, d + _cost[e] - _potential[v]);
       
   150                 _pred[v] = e;
       
   151                 break;
       
   152               case Heap::IN_HEAP:
       
   153                 nd = d + _cost[e] - _potential[v];
       
   154                 if (nd < heap[v]) {
       
   155                   heap.decrease(v, nd);
       
   156                   _pred[v] = e;
       
   157                 }
       
   158                 break;
       
   159               case Heap::POST_HEAP:
       
   160                 break;
       
   161               }
       
   162             }
       
   163           }
       
   164 
       
   165           // Traversing incoming arcs
       
   166           for (InArcIt e(_graph, u); e != INVALID; ++e) {
       
   167             if (_flow[e] >= delta) {
       
   168               v = _graph.source(e);
       
   169               switch(heap.state(v)) {
       
   170               case Heap::PRE_HEAP:
       
   171                 heap.push(v, d - _cost[e] - _potential[v]);
       
   172                 _pred[v] = e;
       
   173                 break;
       
   174               case Heap::IN_HEAP:
       
   175                 nd = d - _cost[e] - _potential[v];
       
   176                 if (nd < heap[v]) {
       
   177                   heap.decrease(v, nd);
       
   178                   _pred[v] = e;
       
   179                 }
       
   180                 break;
       
   181               case Heap::POST_HEAP:
       
   182                 break;
       
   183               }
       
   184             }
       
   185           }
       
   186         }
       
   187         if (heap.empty()) return INVALID;
       
   188 
       
   189         // Updating potentials of processed nodes
       
   190         Node t = heap.top();
       
   191         Cost t_dist = heap.prio();
       
   192         for (int i = 0; i < int(_proc_nodes.size()); ++i)
       
   193           _potential[_proc_nodes[i]] += _dist[_proc_nodes[i]] - t_dist;
       
   194 
       
   195         return t;
       
   196       }
       
   197 
       
   198     }; //class ResidualDijkstra
       
   199 
       
   200   private:
       
   201 
       
   202     // The digraph the algorithm runs on
       
   203     const Digraph &_graph;
       
   204     // The original lower bound map
       
   205     const LowerMap *_lower;
       
   206     // The modified capacity map
       
   207     CapacityArcMap _capacity;
       
   208     // The original cost map
       
   209     const CostMap &_cost;
       
   210     // The modified supply map
       
   211     SupplyNodeMap _supply;
       
   212     bool _valid_supply;
       
   213 
       
   214     // Arc map of the current flow
       
   215     FlowMap *_flow;
       
   216     bool _local_flow;
       
   217     // Node map of the current potentials
       
   218     PotentialMap *_potential;
       
   219     bool _local_potential;
       
   220 
       
   221     // The residual capacity map
       
   222     CapacityArcMap _res_cap;
       
   223     // The excess map
       
   224     SupplyNodeMap _excess;
       
   225     // The excess nodes (i.e. nodes with positive excess)
       
   226     std::vector<Node> _excess_nodes;
       
   227     // The deficit nodes (i.e. nodes with negative excess)
       
   228     std::vector<Node> _deficit_nodes;
       
   229 
       
   230     // The delta parameter used for capacity scaling
       
   231     Capacity _delta;
       
   232     // The maximum number of phases
       
   233     int _phase_num;
       
   234 
       
   235     // The pred arc map
       
   236     PredMap _pred;
       
   237     // Implementation of the Dijkstra algorithm for finding augmenting
       
   238     // shortest paths in the residual network
       
   239     ResidualDijkstra *_dijkstra;
       
   240 
       
   241   public:
       
   242 
       
   243     /// \brief General constructor (with lower bounds).
       
   244     ///
       
   245     /// General constructor (with lower bounds).
       
   246     ///
       
   247     /// \param digraph The digraph the algorithm runs on.
       
   248     /// \param lower The lower bounds of the arcs.
       
   249     /// \param capacity The capacities (upper bounds) of the arcs.
       
   250     /// \param cost The cost (length) values of the arcs.
       
   251     /// \param supply The supply values of the nodes (signed).
       
   252     CapacityScaling( const Digraph &digraph,
       
   253                      const LowerMap &lower,
       
   254                      const CapacityMap &capacity,
       
   255                      const CostMap &cost,
       
   256                      const SupplyMap &supply ) :
       
   257       _graph(digraph), _lower(&lower), _capacity(digraph), _cost(cost),
       
   258       _supply(digraph), _flow(NULL), _local_flow(false),
       
   259       _potential(NULL), _local_potential(false),
       
   260       _res_cap(digraph), _excess(digraph), _pred(digraph), _dijkstra(NULL)
       
   261     {
       
   262       Supply sum = 0;
       
   263       for (NodeIt n(_graph); n != INVALID; ++n) {
       
   264         _supply[n] = supply[n];
       
   265         _excess[n] = supply[n];
       
   266         sum += supply[n];
       
   267       }
       
   268       _valid_supply = sum == 0;
       
   269       for (ArcIt a(_graph); a != INVALID; ++a) {
       
   270         _capacity[a] = capacity[a];
       
   271         _res_cap[a] = capacity[a];
       
   272       }
       
   273 
       
   274       // Remove non-zero lower bounds
       
   275       typename LowerMap::Value lcap;
       
   276       for (ArcIt e(_graph); e != INVALID; ++e) {
       
   277         if ((lcap = lower[e]) != 0) {
       
   278           _capacity[e] -= lcap;
       
   279           _res_cap[e] -= lcap;
       
   280           _supply[_graph.source(e)] -= lcap;
       
   281           _supply[_graph.target(e)] += lcap;
       
   282           _excess[_graph.source(e)] -= lcap;
       
   283           _excess[_graph.target(e)] += lcap;
       
   284         }
       
   285       }
       
   286     }
       
   287 /*
       
   288     /// \brief General constructor (without lower bounds).
       
   289     ///
       
   290     /// General constructor (without lower bounds).
       
   291     ///
       
   292     /// \param digraph The digraph the algorithm runs on.
       
   293     /// \param capacity The capacities (upper bounds) of the arcs.
       
   294     /// \param cost The cost (length) values of the arcs.
       
   295     /// \param supply The supply values of the nodes (signed).
       
   296     CapacityScaling( const Digraph &digraph,
       
   297                      const CapacityMap &capacity,
       
   298                      const CostMap &cost,
       
   299                      const SupplyMap &supply ) :
       
   300       _graph(digraph), _lower(NULL), _capacity(capacity), _cost(cost),
       
   301       _supply(supply), _flow(NULL), _local_flow(false),
       
   302       _potential(NULL), _local_potential(false),
       
   303       _res_cap(capacity), _excess(supply), _pred(digraph), _dijkstra(NULL)
       
   304     {
       
   305       // Check the sum of supply values
       
   306       Supply sum = 0;
       
   307       for (NodeIt n(_graph); n != INVALID; ++n) sum += _supply[n];
       
   308       _valid_supply = sum == 0;
       
   309     }
       
   310 
       
   311     /// \brief Simple constructor (with lower bounds).
       
   312     ///
       
   313     /// Simple constructor (with lower bounds).
       
   314     ///
       
   315     /// \param digraph The digraph the algorithm runs on.
       
   316     /// \param lower The lower bounds of the arcs.
       
   317     /// \param capacity The capacities (upper bounds) of the arcs.
       
   318     /// \param cost The cost (length) values of the arcs.
       
   319     /// \param s The source node.
       
   320     /// \param t The target node.
       
   321     /// \param flow_value The required amount of flow from node \c s
       
   322     /// to node \c t (i.e. the supply of \c s and the demand of \c t).
       
   323     CapacityScaling( const Digraph &digraph,
       
   324                      const LowerMap &lower,
       
   325                      const CapacityMap &capacity,
       
   326                      const CostMap &cost,
       
   327                      Node s, Node t,
       
   328                      Supply flow_value ) :
       
   329       _graph(digraph), _lower(&lower), _capacity(capacity), _cost(cost),
       
   330       _supply(digraph, 0), _flow(NULL), _local_flow(false),
       
   331       _potential(NULL), _local_potential(false),
       
   332       _res_cap(capacity), _excess(digraph, 0), _pred(digraph), _dijkstra(NULL)
       
   333     {
       
   334       // Remove non-zero lower bounds
       
   335       _supply[s] = _excess[s] =  flow_value;
       
   336       _supply[t] = _excess[t] = -flow_value;
       
   337       typename LowerMap::Value lcap;
       
   338       for (ArcIt e(_graph); e != INVALID; ++e) {
       
   339         if ((lcap = lower[e]) != 0) {
       
   340           _capacity[e] -= lcap;
       
   341           _res_cap[e] -= lcap;
       
   342           _supply[_graph.source(e)] -= lcap;
       
   343           _supply[_graph.target(e)] += lcap;
       
   344           _excess[_graph.source(e)] -= lcap;
       
   345           _excess[_graph.target(e)] += lcap;
       
   346         }
       
   347       }
       
   348       _valid_supply = true;
       
   349     }
       
   350 
       
   351     /// \brief Simple constructor (without lower bounds).
       
   352     ///
       
   353     /// Simple constructor (without lower bounds).
       
   354     ///
       
   355     /// \param digraph The digraph the algorithm runs on.
       
   356     /// \param capacity The capacities (upper bounds) of the arcs.
       
   357     /// \param cost The cost (length) values of the arcs.
       
   358     /// \param s The source node.
       
   359     /// \param t The target node.
       
   360     /// \param flow_value The required amount of flow from node \c s
       
   361     /// to node \c t (i.e. the supply of \c s and the demand of \c t).
       
   362     CapacityScaling( const Digraph &digraph,
       
   363                      const CapacityMap &capacity,
       
   364                      const CostMap &cost,
       
   365                      Node s, Node t,
       
   366                      Supply flow_value ) :
       
   367       _graph(digraph), _lower(NULL), _capacity(capacity), _cost(cost),
       
   368       _supply(digraph, 0), _flow(NULL), _local_flow(false),
       
   369       _potential(NULL), _local_potential(false),
       
   370       _res_cap(capacity), _excess(digraph, 0), _pred(digraph), _dijkstra(NULL)
       
   371     {
       
   372       _supply[s] = _excess[s] =  flow_value;
       
   373       _supply[t] = _excess[t] = -flow_value;
       
   374       _valid_supply = true;
       
   375     }
       
   376 */
       
   377     /// Destructor.
       
   378     ~CapacityScaling() {
       
   379       if (_local_flow) delete _flow;
       
   380       if (_local_potential) delete _potential;
       
   381       delete _dijkstra;
       
   382     }
       
   383 
       
   384     /// \brief Set the flow map.
       
   385     ///
       
   386     /// Set the flow map.
       
   387     ///
       
   388     /// \return \c (*this)
       
   389     CapacityScaling& flowMap(FlowMap &map) {
       
   390       if (_local_flow) {
       
   391         delete _flow;
       
   392         _local_flow = false;
       
   393       }
       
   394       _flow = &map;
       
   395       return *this;
       
   396     }
       
   397 
       
   398     /// \brief Set the potential map.
       
   399     ///
       
   400     /// Set the potential map.
       
   401     ///
       
   402     /// \return \c (*this)
       
   403     CapacityScaling& potentialMap(PotentialMap &map) {
       
   404       if (_local_potential) {
       
   405         delete _potential;
       
   406         _local_potential = false;
       
   407       }
       
   408       _potential = &map;
       
   409       return *this;
       
   410     }
       
   411 
       
   412     /// \name Execution control
       
   413 
       
   414     /// @{
       
   415 
       
   416     /// \brief Run the algorithm.
       
   417     ///
       
   418     /// This function runs the algorithm.
       
   419     ///
       
   420     /// \param scaling Enable or disable capacity scaling.
       
   421     /// If the maximum arc capacity and/or the amount of total supply
       
   422     /// is rather small, the algorithm could be slightly faster without
       
   423     /// scaling.
       
   424     ///
       
   425     /// \return \c true if a feasible flow can be found.
       
   426     bool run(bool scaling = true) {
       
   427       return init(scaling) && start();
       
   428     }
       
   429 
       
   430     /// @}
       
   431 
       
   432     /// \name Query Functions
       
   433     /// The results of the algorithm can be obtained using these
       
   434     /// functions.\n
       
   435     /// \ref lemon::CapacityScaling::run() "run()" must be called before
       
   436     /// using them.
       
   437 
       
   438     /// @{
       
   439 
       
   440     /// \brief Return a const reference to the arc map storing the
       
   441     /// found flow.
       
   442     ///
       
   443     /// Return a const reference to the arc map storing the found flow.
       
   444     ///
       
   445     /// \pre \ref run() must be called before using this function.
       
   446     const FlowMap& flowMap() const {
       
   447       return *_flow;
       
   448     }
       
   449 
       
   450     /// \brief Return a const reference to the node map storing the
       
   451     /// found potentials (the dual solution).
       
   452     ///
       
   453     /// Return a const reference to the node map storing the found
       
   454     /// potentials (the dual solution).
       
   455     ///
       
   456     /// \pre \ref run() must be called before using this function.
       
   457     const PotentialMap& potentialMap() const {
       
   458       return *_potential;
       
   459     }
       
   460 
       
   461     /// \brief Return the flow on the given arc.
       
   462     ///
       
   463     /// Return the flow on the given arc.
       
   464     ///
       
   465     /// \pre \ref run() must be called before using this function.
       
   466     Capacity flow(const Arc& arc) const {
       
   467       return (*_flow)[arc];
       
   468     }
       
   469 
       
   470     /// \brief Return the potential of the given node.
       
   471     ///
       
   472     /// Return the potential of the given node.
       
   473     ///
       
   474     /// \pre \ref run() must be called before using this function.
       
   475     Cost potential(const Node& node) const {
       
   476       return (*_potential)[node];
       
   477     }
       
   478 
       
   479     /// \brief Return the total cost of the found flow.
       
   480     ///
       
   481     /// Return the total cost of the found flow. The complexity of the
       
   482     /// function is \f$ O(e) \f$.
       
   483     ///
       
   484     /// \pre \ref run() must be called before using this function.
       
   485     Cost totalCost() const {
       
   486       Cost c = 0;
       
   487       for (ArcIt e(_graph); e != INVALID; ++e)
       
   488         c += (*_flow)[e] * _cost[e];
       
   489       return c;
       
   490     }
       
   491 
       
   492     /// @}
       
   493 
       
   494   private:
       
   495 
       
   496     /// Initialize the algorithm.
       
   497     bool init(bool scaling) {
       
   498       if (!_valid_supply) return false;
       
   499 
       
   500       // Initializing maps
       
   501       if (!_flow) {
       
   502         _flow = new FlowMap(_graph);
       
   503         _local_flow = true;
       
   504       }
       
   505       if (!_potential) {
       
   506         _potential = new PotentialMap(_graph);
       
   507         _local_potential = true;
       
   508       }
       
   509       for (ArcIt e(_graph); e != INVALID; ++e) (*_flow)[e] = 0;
       
   510       for (NodeIt n(_graph); n != INVALID; ++n) (*_potential)[n] = 0;
       
   511 
       
   512       _dijkstra = new ResidualDijkstra( _graph, *_flow, _res_cap, _cost,
       
   513                                         _excess, *_potential, _pred );
       
   514 
       
   515       // Initializing delta value
       
   516       if (scaling) {
       
   517         // With scaling
       
   518         Supply max_sup = 0, max_dem = 0;
       
   519         for (NodeIt n(_graph); n != INVALID; ++n) {
       
   520           if ( _supply[n] > max_sup) max_sup =  _supply[n];
       
   521           if (-_supply[n] > max_dem) max_dem = -_supply[n];
       
   522         }
       
   523         Capacity max_cap = 0;
       
   524         for (ArcIt e(_graph); e != INVALID; ++e) {
       
   525           if (_capacity[e] > max_cap) max_cap = _capacity[e];
       
   526         }
       
   527         max_sup = std::min(std::min(max_sup, max_dem), max_cap);
       
   528         _phase_num = 0;
       
   529         for (_delta = 1; 2 * _delta <= max_sup; _delta *= 2)
       
   530           ++_phase_num;
       
   531       } else {
       
   532         // Without scaling
       
   533         _delta = 1;
       
   534       }
       
   535 
       
   536       return true;
       
   537     }
       
   538 
       
   539     bool start() {
       
   540       if (_delta > 1)
       
   541         return startWithScaling();
       
   542       else
       
   543         return startWithoutScaling();
       
   544     }
       
   545 
       
   546     /// Execute the capacity scaling algorithm.
       
   547     bool startWithScaling() {
       
   548       // Processing capacity scaling phases
       
   549       Node s, t;
       
   550       int phase_cnt = 0;
       
   551       int factor = 4;
       
   552       while (true) {
       
   553         // Saturating all arcs not satisfying the optimality condition
       
   554         for (ArcIt e(_graph); e != INVALID; ++e) {
       
   555           Node u = _graph.source(e), v = _graph.target(e);
       
   556           Cost c = _cost[e] + (*_potential)[u] - (*_potential)[v];
       
   557           if (c < 0 && _res_cap[e] >= _delta) {
       
   558             _excess[u] -= _res_cap[e];
       
   559             _excess[v] += _res_cap[e];
       
   560             (*_flow)[e] = _capacity[e];
       
   561             _res_cap[e] = 0;
       
   562           }
       
   563           else if (c > 0 && (*_flow)[e] >= _delta) {
       
   564             _excess[u] += (*_flow)[e];
       
   565             _excess[v] -= (*_flow)[e];
       
   566             (*_flow)[e] = 0;
       
   567             _res_cap[e] = _capacity[e];
       
   568           }
       
   569         }
       
   570 
       
   571         // Finding excess nodes and deficit nodes
       
   572         _excess_nodes.clear();
       
   573         _deficit_nodes.clear();
       
   574         for (NodeIt n(_graph); n != INVALID; ++n) {
       
   575           if (_excess[n] >=  _delta) _excess_nodes.push_back(n);
       
   576           if (_excess[n] <= -_delta) _deficit_nodes.push_back(n);
       
   577         }
       
   578         int next_node = 0, next_def_node = 0;
       
   579 
       
   580         // Finding augmenting shortest paths
       
   581         while (next_node < int(_excess_nodes.size())) {
       
   582           // Checking deficit nodes
       
   583           if (_delta > 1) {
       
   584             bool delta_deficit = false;
       
   585             for ( ; next_def_node < int(_deficit_nodes.size());
       
   586                     ++next_def_node ) {
       
   587               if (_excess[_deficit_nodes[next_def_node]] <= -_delta) {
       
   588                 delta_deficit = true;
       
   589                 break;
       
   590               }
       
   591             }
       
   592             if (!delta_deficit) break;
       
   593           }
       
   594 
       
   595           // Running Dijkstra
       
   596           s = _excess_nodes[next_node];
       
   597           if ((t = _dijkstra->run(s, _delta)) == INVALID) {
       
   598             if (_delta > 1) {
       
   599               ++next_node;
       
   600               continue;
       
   601             }
       
   602             return false;
       
   603           }
       
   604 
       
   605           // Augmenting along a shortest path from s to t.
       
   606           Capacity d = std::min(_excess[s], -_excess[t]);
       
   607           Node u = t;
       
   608           Arc e;
       
   609           if (d > _delta) {
       
   610             while ((e = _pred[u]) != INVALID) {
       
   611               Capacity rc;
       
   612               if (u == _graph.target(e)) {
       
   613                 rc = _res_cap[e];
       
   614                 u = _graph.source(e);
       
   615               } else {
       
   616                 rc = (*_flow)[e];
       
   617                 u = _graph.target(e);
       
   618               }
       
   619               if (rc < d) d = rc;
       
   620             }
       
   621           }
       
   622           u = t;
       
   623           while ((e = _pred[u]) != INVALID) {
       
   624             if (u == _graph.target(e)) {
       
   625               (*_flow)[e] += d;
       
   626               _res_cap[e] -= d;
       
   627               u = _graph.source(e);
       
   628             } else {
       
   629               (*_flow)[e] -= d;
       
   630               _res_cap[e] += d;
       
   631               u = _graph.target(e);
       
   632             }
       
   633           }
       
   634           _excess[s] -= d;
       
   635           _excess[t] += d;
       
   636 
       
   637           if (_excess[s] < _delta) ++next_node;
       
   638         }
       
   639 
       
   640         if (_delta == 1) break;
       
   641         if (++phase_cnt > _phase_num / 4) factor = 2;
       
   642         _delta = _delta <= factor ? 1 : _delta / factor;
       
   643       }
       
   644 
       
   645       // Handling non-zero lower bounds
       
   646       if (_lower) {
       
   647         for (ArcIt e(_graph); e != INVALID; ++e)
       
   648           (*_flow)[e] += (*_lower)[e];
       
   649       }
       
   650       return true;
       
   651     }
       
   652 
       
   653     /// Execute the successive shortest path algorithm.
       
   654     bool startWithoutScaling() {
       
   655       // Finding excess nodes
       
   656       for (NodeIt n(_graph); n != INVALID; ++n)
       
   657         if (_excess[n] > 0) _excess_nodes.push_back(n);
       
   658       if (_excess_nodes.size() == 0) return true;
       
   659       int next_node = 0;
       
   660 
       
   661       // Finding shortest paths
       
   662       Node s, t;
       
   663       while ( _excess[_excess_nodes[next_node]] > 0 ||
       
   664               ++next_node < int(_excess_nodes.size()) )
       
   665       {
       
   666         // Running Dijkstra
       
   667         s = _excess_nodes[next_node];
       
   668         if ((t = _dijkstra->run(s)) == INVALID) return false;
       
   669 
       
   670         // Augmenting along a shortest path from s to t
       
   671         Capacity d = std::min(_excess[s], -_excess[t]);
       
   672         Node u = t;
       
   673         Arc e;
       
   674         if (d > 1) {
       
   675           while ((e = _pred[u]) != INVALID) {
       
   676             Capacity rc;
       
   677             if (u == _graph.target(e)) {
       
   678               rc = _res_cap[e];
       
   679               u = _graph.source(e);
       
   680             } else {
       
   681               rc = (*_flow)[e];
       
   682               u = _graph.target(e);
       
   683             }
       
   684             if (rc < d) d = rc;
       
   685           }
       
   686         }
       
   687         u = t;
       
   688         while ((e = _pred[u]) != INVALID) {
       
   689           if (u == _graph.target(e)) {
       
   690             (*_flow)[e] += d;
       
   691             _res_cap[e] -= d;
       
   692             u = _graph.source(e);
       
   693           } else {
       
   694             (*_flow)[e] -= d;
       
   695             _res_cap[e] += d;
       
   696             u = _graph.target(e);
       
   697           }
       
   698         }
       
   699         _excess[s] -= d;
       
   700         _excess[t] += d;
       
   701       }
       
   702 
       
   703       // Handling non-zero lower bounds
       
   704       if (_lower) {
       
   705         for (ArcIt e(_graph); e != INVALID; ++e)
       
   706           (*_flow)[e] += (*_lower)[e];
       
   707       }
       
   708       return true;
       
   709     }
       
   710 
       
   711   }; //class CapacityScaling
       
   712 
       
   713   ///@}
       
   714 
       
   715 } //namespace lemon
       
   716 
       
   717 #endif //LEMON_CAPACITY_SCALING_H