lemon/capacity_scaling.h
author Peter Kovacs <kpeter@inf.elte.hu>
Tue, 15 Mar 2011 19:32:21 +0100
changeset 936 ddd3c0d3d9bf
parent 921 140c953ad5d1
parent 919 e0cef67fe565
child 985 eb12ad2789fc
child 1003 16f55008c863
permissions -rw-r--r--
Implement the scaling Price Refinement heuristic in CostScaling (#417)
instead of Early Termination.

These two heuristics are similar, but the newer one is faster
and not only makes it possible to skip some epsilon phases, but
it can improve the performance of the other phases, as well.
alpar@877
     1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
kpeter@805
     2
 *
alpar@877
     3
 * This file is a part of LEMON, a generic C++ optimization library.
kpeter@805
     4
 *
alpar@877
     5
 * Copyright (C) 2003-2010
kpeter@805
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
kpeter@805
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
kpeter@805
     8
 *
kpeter@805
     9
 * Permission to use, modify and distribute this software is granted
kpeter@805
    10
 * provided that this copyright notice appears in all copies. For
kpeter@805
    11
 * precise terms see the accompanying LICENSE file.
kpeter@805
    12
 *
kpeter@805
    13
 * This software is provided "AS IS" with no warranty of any kind,
kpeter@805
    14
 * express or implied, and with no claim as to its suitability for any
kpeter@805
    15
 * purpose.
kpeter@805
    16
 *
kpeter@805
    17
 */
kpeter@805
    18
kpeter@805
    19
#ifndef LEMON_CAPACITY_SCALING_H
kpeter@805
    20
#define LEMON_CAPACITY_SCALING_H
kpeter@805
    21
kpeter@806
    22
/// \ingroup min_cost_flow_algs
kpeter@805
    23
///
kpeter@805
    24
/// \file
kpeter@806
    25
/// \brief Capacity Scaling algorithm for finding a minimum cost flow.
kpeter@805
    26
kpeter@805
    27
#include <vector>
kpeter@806
    28
#include <limits>
kpeter@806
    29
#include <lemon/core.h>
kpeter@805
    30
#include <lemon/bin_heap.h>
kpeter@805
    31
kpeter@805
    32
namespace lemon {
kpeter@805
    33
kpeter@807
    34
  /// \brief Default traits class of CapacityScaling algorithm.
kpeter@807
    35
  ///
kpeter@807
    36
  /// Default traits class of CapacityScaling algorithm.
kpeter@807
    37
  /// \tparam GR Digraph type.
kpeter@812
    38
  /// \tparam V The number type used for flow amounts, capacity bounds
kpeter@807
    39
  /// and supply values. By default it is \c int.
kpeter@812
    40
  /// \tparam C The number type used for costs and potentials.
kpeter@807
    41
  /// By default it is the same as \c V.
kpeter@807
    42
  template <typename GR, typename V = int, typename C = V>
kpeter@807
    43
  struct CapacityScalingDefaultTraits
kpeter@807
    44
  {
kpeter@807
    45
    /// The type of the digraph
kpeter@807
    46
    typedef GR Digraph;
kpeter@807
    47
    /// The type of the flow amounts, capacity bounds and supply values
kpeter@807
    48
    typedef V Value;
kpeter@807
    49
    /// The type of the arc costs
kpeter@807
    50
    typedef C Cost;
kpeter@807
    51
kpeter@807
    52
    /// \brief The type of the heap used for internal Dijkstra computations.
kpeter@807
    53
    ///
kpeter@807
    54
    /// The type of the heap used for internal Dijkstra computations.
kpeter@807
    55
    /// It must conform to the \ref lemon::concepts::Heap "Heap" concept,
kpeter@807
    56
    /// its priority type must be \c Cost and its cross reference type
kpeter@807
    57
    /// must be \ref RangeMap "RangeMap<int>".
kpeter@807
    58
    typedef BinHeap<Cost, RangeMap<int> > Heap;
kpeter@807
    59
  };
kpeter@807
    60
kpeter@806
    61
  /// \addtogroup min_cost_flow_algs
kpeter@805
    62
  /// @{
kpeter@805
    63
kpeter@806
    64
  /// \brief Implementation of the Capacity Scaling algorithm for
kpeter@806
    65
  /// finding a \ref min_cost_flow "minimum cost flow".
kpeter@805
    66
  ///
kpeter@805
    67
  /// \ref CapacityScaling implements the capacity scaling version
kpeter@806
    68
  /// of the successive shortest path algorithm for finding a
kpeter@813
    69
  /// \ref min_cost_flow "minimum cost flow" \ref amo93networkflows,
kpeter@813
    70
  /// \ref edmondskarp72theoretical. It is an efficient dual
kpeter@806
    71
  /// solution method.
kpeter@805
    72
  ///
kpeter@806
    73
  /// Most of the parameters of the problem (except for the digraph)
kpeter@806
    74
  /// can be given using separate functions, and the algorithm can be
kpeter@806
    75
  /// executed using the \ref run() function. If some parameters are not
kpeter@806
    76
  /// specified, then default values will be used.
kpeter@805
    77
  ///
kpeter@806
    78
  /// \tparam GR The digraph type the algorithm runs on.
kpeter@812
    79
  /// \tparam V The number type used for flow amounts, capacity bounds
kpeter@825
    80
  /// and supply values in the algorithm. By default, it is \c int.
kpeter@812
    81
  /// \tparam C The number type used for costs and potentials in the
kpeter@825
    82
  /// algorithm. By default, it is the same as \c V.
kpeter@825
    83
  /// \tparam TR The traits class that defines various types used by the
kpeter@825
    84
  /// algorithm. By default, it is \ref CapacityScalingDefaultTraits
kpeter@825
    85
  /// "CapacityScalingDefaultTraits<GR, V, C>".
kpeter@825
    86
  /// In most cases, this parameter should not be set directly,
kpeter@825
    87
  /// consider to use the named template parameters instead.
kpeter@805
    88
  ///
kpeter@921
    89
  /// \warning Both \c V and \c C must be signed number types.
kpeter@921
    90
  /// \warning All input data (capacities, supply values, and costs) must
kpeter@806
    91
  /// be integer.
kpeter@919
    92
  /// \warning This algorithm does not support negative costs for
kpeter@919
    93
  /// arcs having infinite upper bound.
kpeter@807
    94
#ifdef DOXYGEN
kpeter@807
    95
  template <typename GR, typename V, typename C, typename TR>
kpeter@807
    96
#else
kpeter@807
    97
  template < typename GR, typename V = int, typename C = V,
kpeter@807
    98
             typename TR = CapacityScalingDefaultTraits<GR, V, C> >
kpeter@807
    99
#endif
kpeter@805
   100
  class CapacityScaling
kpeter@805
   101
  {
kpeter@806
   102
  public:
kpeter@805
   103
kpeter@807
   104
    /// The type of the digraph
kpeter@807
   105
    typedef typename TR::Digraph Digraph;
kpeter@806
   106
    /// The type of the flow amounts, capacity bounds and supply values
kpeter@807
   107
    typedef typename TR::Value Value;
kpeter@806
   108
    /// The type of the arc costs
kpeter@807
   109
    typedef typename TR::Cost Cost;
kpeter@807
   110
kpeter@807
   111
    /// The type of the heap used for internal Dijkstra computations
kpeter@807
   112
    typedef typename TR::Heap Heap;
kpeter@807
   113
kpeter@807
   114
    /// The \ref CapacityScalingDefaultTraits "traits class" of the algorithm
kpeter@807
   115
    typedef TR Traits;
kpeter@805
   116
kpeter@805
   117
  public:
kpeter@805
   118
kpeter@806
   119
    /// \brief Problem type constants for the \c run() function.
kpeter@806
   120
    ///
kpeter@806
   121
    /// Enum type containing the problem type constants that can be
kpeter@806
   122
    /// returned by the \ref run() function of the algorithm.
kpeter@806
   123
    enum ProblemType {
kpeter@806
   124
      /// The problem has no feasible solution (flow).
kpeter@806
   125
      INFEASIBLE,
kpeter@806
   126
      /// The problem has optimal solution (i.e. it is feasible and
kpeter@806
   127
      /// bounded), and the algorithm has found optimal flow and node
kpeter@806
   128
      /// potentials (primal and dual solutions).
kpeter@806
   129
      OPTIMAL,
kpeter@806
   130
      /// The digraph contains an arc of negative cost and infinite
kpeter@806
   131
      /// upper bound. It means that the objective function is unbounded
kpeter@812
   132
      /// on that arc, however, note that it could actually be bounded
kpeter@806
   133
      /// over the feasible flows, but this algroithm cannot handle
kpeter@806
   134
      /// these cases.
kpeter@806
   135
      UNBOUNDED
kpeter@806
   136
    };
alpar@877
   137
kpeter@806
   138
  private:
kpeter@806
   139
kpeter@806
   140
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
kpeter@806
   141
kpeter@806
   142
    typedef std::vector<int> IntVector;
kpeter@806
   143
    typedef std::vector<Value> ValueVector;
kpeter@806
   144
    typedef std::vector<Cost> CostVector;
kpeter@839
   145
    typedef std::vector<char> BoolVector;
kpeter@839
   146
    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
kpeter@805
   147
kpeter@805
   148
  private:
kpeter@805
   149
kpeter@806
   150
    // Data related to the underlying digraph
kpeter@806
   151
    const GR &_graph;
kpeter@806
   152
    int _node_num;
kpeter@806
   153
    int _arc_num;
kpeter@806
   154
    int _res_arc_num;
kpeter@806
   155
    int _root;
kpeter@806
   156
kpeter@806
   157
    // Parameters of the problem
kpeter@806
   158
    bool _have_lower;
kpeter@806
   159
    Value _sum_supply;
kpeter@806
   160
kpeter@806
   161
    // Data structures for storing the digraph
kpeter@806
   162
    IntNodeMap _node_id;
kpeter@806
   163
    IntArcMap _arc_idf;
kpeter@806
   164
    IntArcMap _arc_idb;
kpeter@806
   165
    IntVector _first_out;
kpeter@806
   166
    BoolVector _forward;
kpeter@806
   167
    IntVector _source;
kpeter@806
   168
    IntVector _target;
kpeter@806
   169
    IntVector _reverse;
kpeter@806
   170
kpeter@806
   171
    // Node and arc data
kpeter@806
   172
    ValueVector _lower;
kpeter@806
   173
    ValueVector _upper;
kpeter@806
   174
    CostVector _cost;
kpeter@806
   175
    ValueVector _supply;
kpeter@806
   176
kpeter@806
   177
    ValueVector _res_cap;
kpeter@806
   178
    CostVector _pi;
kpeter@806
   179
    ValueVector _excess;
kpeter@806
   180
    IntVector _excess_nodes;
kpeter@806
   181
    IntVector _deficit_nodes;
kpeter@806
   182
kpeter@806
   183
    Value _delta;
kpeter@810
   184
    int _factor;
kpeter@806
   185
    IntVector _pred;
kpeter@806
   186
kpeter@806
   187
  public:
alpar@877
   188
kpeter@806
   189
    /// \brief Constant for infinite upper bounds (capacities).
kpeter@805
   190
    ///
kpeter@806
   191
    /// Constant for infinite upper bounds (capacities).
kpeter@806
   192
    /// It is \c std::numeric_limits<Value>::infinity() if available,
kpeter@806
   193
    /// \c std::numeric_limits<Value>::max() otherwise.
kpeter@806
   194
    const Value INF;
kpeter@806
   195
kpeter@806
   196
  private:
kpeter@806
   197
kpeter@806
   198
    // Special implementation of the Dijkstra algorithm for finding
kpeter@806
   199
    // shortest paths in the residual network of the digraph with
kpeter@806
   200
    // respect to the reduced arc costs and modifying the node
kpeter@806
   201
    // potentials according to the found distance labels.
kpeter@805
   202
    class ResidualDijkstra
kpeter@805
   203
    {
kpeter@805
   204
    private:
kpeter@805
   205
kpeter@806
   206
      int _node_num;
kpeter@811
   207
      bool _geq;
kpeter@806
   208
      const IntVector &_first_out;
kpeter@806
   209
      const IntVector &_target;
kpeter@806
   210
      const CostVector &_cost;
kpeter@806
   211
      const ValueVector &_res_cap;
kpeter@806
   212
      const ValueVector &_excess;
kpeter@806
   213
      CostVector &_pi;
kpeter@806
   214
      IntVector &_pred;
alpar@877
   215
kpeter@806
   216
      IntVector _proc_nodes;
kpeter@806
   217
      CostVector _dist;
alpar@877
   218
kpeter@805
   219
    public:
kpeter@805
   220
kpeter@806
   221
      ResidualDijkstra(CapacityScaling& cs) :
kpeter@811
   222
        _node_num(cs._node_num), _geq(cs._sum_supply < 0),
kpeter@811
   223
        _first_out(cs._first_out), _target(cs._target), _cost(cs._cost),
kpeter@811
   224
        _res_cap(cs._res_cap), _excess(cs._excess), _pi(cs._pi),
kpeter@811
   225
        _pred(cs._pred), _dist(cs._node_num)
kpeter@805
   226
      {}
kpeter@805
   227
kpeter@806
   228
      int run(int s, Value delta = 1) {
kpeter@807
   229
        RangeMap<int> heap_cross_ref(_node_num, Heap::PRE_HEAP);
kpeter@805
   230
        Heap heap(heap_cross_ref);
kpeter@805
   231
        heap.push(s, 0);
kpeter@806
   232
        _pred[s] = -1;
kpeter@805
   233
        _proc_nodes.clear();
kpeter@805
   234
kpeter@806
   235
        // Process nodes
kpeter@805
   236
        while (!heap.empty() && _excess[heap.top()] > -delta) {
kpeter@806
   237
          int u = heap.top(), v;
kpeter@806
   238
          Cost d = heap.prio() + _pi[u], dn;
kpeter@805
   239
          _dist[u] = heap.prio();
kpeter@806
   240
          _proc_nodes.push_back(u);
kpeter@805
   241
          heap.pop();
kpeter@805
   242
kpeter@806
   243
          // Traverse outgoing residual arcs
kpeter@811
   244
          int last_out = _geq ? _first_out[u+1] : _first_out[u+1] - 1;
kpeter@811
   245
          for (int a = _first_out[u]; a != last_out; ++a) {
kpeter@806
   246
            if (_res_cap[a] < delta) continue;
kpeter@806
   247
            v = _target[a];
kpeter@806
   248
            switch (heap.state(v)) {
kpeter@805
   249
              case Heap::PRE_HEAP:
kpeter@806
   250
                heap.push(v, d + _cost[a] - _pi[v]);
kpeter@806
   251
                _pred[v] = a;
kpeter@805
   252
                break;
kpeter@805
   253
              case Heap::IN_HEAP:
kpeter@806
   254
                dn = d + _cost[a] - _pi[v];
kpeter@806
   255
                if (dn < heap[v]) {
kpeter@806
   256
                  heap.decrease(v, dn);
kpeter@806
   257
                  _pred[v] = a;
kpeter@805
   258
                }
kpeter@805
   259
                break;
kpeter@805
   260
              case Heap::POST_HEAP:
kpeter@805
   261
                break;
kpeter@805
   262
            }
kpeter@805
   263
          }
kpeter@805
   264
        }
kpeter@806
   265
        if (heap.empty()) return -1;
kpeter@805
   266
kpeter@806
   267
        // Update potentials of processed nodes
kpeter@806
   268
        int t = heap.top();
kpeter@806
   269
        Cost dt = heap.prio();
kpeter@806
   270
        for (int i = 0; i < int(_proc_nodes.size()); ++i) {
kpeter@806
   271
          _pi[_proc_nodes[i]] += _dist[_proc_nodes[i]] - dt;
kpeter@806
   272
        }
kpeter@805
   273
kpeter@805
   274
        return t;
kpeter@805
   275
      }
kpeter@805
   276
kpeter@805
   277
    }; //class ResidualDijkstra
kpeter@805
   278
kpeter@805
   279
  public:
kpeter@805
   280
kpeter@807
   281
    /// \name Named Template Parameters
kpeter@807
   282
    /// @{
kpeter@807
   283
kpeter@807
   284
    template <typename T>
kpeter@807
   285
    struct SetHeapTraits : public Traits {
kpeter@807
   286
      typedef T Heap;
kpeter@807
   287
    };
kpeter@807
   288
kpeter@807
   289
    /// \brief \ref named-templ-param "Named parameter" for setting
kpeter@807
   290
    /// \c Heap type.
kpeter@807
   291
    ///
kpeter@807
   292
    /// \ref named-templ-param "Named parameter" for setting \c Heap
kpeter@807
   293
    /// type, which is used for internal Dijkstra computations.
kpeter@807
   294
    /// It must conform to the \ref lemon::concepts::Heap "Heap" concept,
kpeter@807
   295
    /// its priority type must be \c Cost and its cross reference type
kpeter@807
   296
    /// must be \ref RangeMap "RangeMap<int>".
kpeter@807
   297
    template <typename T>
kpeter@807
   298
    struct SetHeap
kpeter@807
   299
      : public CapacityScaling<GR, V, C, SetHeapTraits<T> > {
kpeter@807
   300
      typedef  CapacityScaling<GR, V, C, SetHeapTraits<T> > Create;
kpeter@807
   301
    };
kpeter@807
   302
kpeter@807
   303
    /// @}
kpeter@807
   304
kpeter@863
   305
  protected:
kpeter@863
   306
kpeter@863
   307
    CapacityScaling() {}
kpeter@863
   308
kpeter@807
   309
  public:
kpeter@807
   310
kpeter@806
   311
    /// \brief Constructor.
kpeter@805
   312
    ///
kpeter@806
   313
    /// The constructor of the class.
kpeter@805
   314
    ///
kpeter@806
   315
    /// \param graph The digraph the algorithm runs on.
kpeter@806
   316
    CapacityScaling(const GR& graph) :
kpeter@806
   317
      _graph(graph), _node_id(graph), _arc_idf(graph), _arc_idb(graph),
kpeter@806
   318
      INF(std::numeric_limits<Value>::has_infinity ?
kpeter@806
   319
          std::numeric_limits<Value>::infinity() :
kpeter@806
   320
          std::numeric_limits<Value>::max())
kpeter@805
   321
    {
kpeter@812
   322
      // Check the number types
kpeter@806
   323
      LEMON_ASSERT(std::numeric_limits<Value>::is_signed,
kpeter@806
   324
        "The flow type of CapacityScaling must be signed");
kpeter@806
   325
      LEMON_ASSERT(std::numeric_limits<Cost>::is_signed,
kpeter@806
   326
        "The cost type of CapacityScaling must be signed");
kpeter@806
   327
kpeter@830
   328
      // Reset data structures
kpeter@806
   329
      reset();
kpeter@805
   330
    }
kpeter@805
   331
kpeter@806
   332
    /// \name Parameters
kpeter@806
   333
    /// The parameters of the algorithm can be specified using these
kpeter@806
   334
    /// functions.
kpeter@806
   335
kpeter@806
   336
    /// @{
kpeter@806
   337
kpeter@806
   338
    /// \brief Set the lower bounds on the arcs.
kpeter@805
   339
    ///
kpeter@806
   340
    /// This function sets the lower bounds on the arcs.
kpeter@806
   341
    /// If it is not used before calling \ref run(), the lower bounds
kpeter@806
   342
    /// will be set to zero on all arcs.
kpeter@805
   343
    ///
kpeter@806
   344
    /// \param map An arc map storing the lower bounds.
kpeter@806
   345
    /// Its \c Value type must be convertible to the \c Value type
kpeter@806
   346
    /// of the algorithm.
kpeter@806
   347
    ///
kpeter@806
   348
    /// \return <tt>(*this)</tt>
kpeter@806
   349
    template <typename LowerMap>
kpeter@806
   350
    CapacityScaling& lowerMap(const LowerMap& map) {
kpeter@806
   351
      _have_lower = true;
kpeter@806
   352
      for (ArcIt a(_graph); a != INVALID; ++a) {
kpeter@806
   353
        _lower[_arc_idf[a]] = map[a];
kpeter@806
   354
        _lower[_arc_idb[a]] = map[a];
kpeter@805
   355
      }
kpeter@805
   356
      return *this;
kpeter@805
   357
    }
kpeter@805
   358
kpeter@806
   359
    /// \brief Set the upper bounds (capacities) on the arcs.
kpeter@805
   360
    ///
kpeter@806
   361
    /// This function sets the upper bounds (capacities) on the arcs.
kpeter@806
   362
    /// If it is not used before calling \ref run(), the upper bounds
kpeter@806
   363
    /// will be set to \ref INF on all arcs (i.e. the flow value will be
kpeter@812
   364
    /// unbounded from above).
kpeter@805
   365
    ///
kpeter@806
   366
    /// \param map An arc map storing the upper bounds.
kpeter@806
   367
    /// Its \c Value type must be convertible to the \c Value type
kpeter@806
   368
    /// of the algorithm.
kpeter@806
   369
    ///
kpeter@806
   370
    /// \return <tt>(*this)</tt>
kpeter@806
   371
    template<typename UpperMap>
kpeter@806
   372
    CapacityScaling& upperMap(const UpperMap& map) {
kpeter@806
   373
      for (ArcIt a(_graph); a != INVALID; ++a) {
kpeter@806
   374
        _upper[_arc_idf[a]] = map[a];
kpeter@805
   375
      }
kpeter@805
   376
      return *this;
kpeter@805
   377
    }
kpeter@805
   378
kpeter@806
   379
    /// \brief Set the costs of the arcs.
kpeter@806
   380
    ///
kpeter@806
   381
    /// This function sets the costs of the arcs.
kpeter@806
   382
    /// If it is not used before calling \ref run(), the costs
kpeter@806
   383
    /// will be set to \c 1 on all arcs.
kpeter@806
   384
    ///
kpeter@806
   385
    /// \param map An arc map storing the costs.
kpeter@806
   386
    /// Its \c Value type must be convertible to the \c Cost type
kpeter@806
   387
    /// of the algorithm.
kpeter@806
   388
    ///
kpeter@806
   389
    /// \return <tt>(*this)</tt>
kpeter@806
   390
    template<typename CostMap>
kpeter@806
   391
    CapacityScaling& costMap(const CostMap& map) {
kpeter@806
   392
      for (ArcIt a(_graph); a != INVALID; ++a) {
kpeter@806
   393
        _cost[_arc_idf[a]] =  map[a];
kpeter@806
   394
        _cost[_arc_idb[a]] = -map[a];
kpeter@806
   395
      }
kpeter@806
   396
      return *this;
kpeter@806
   397
    }
kpeter@806
   398
kpeter@806
   399
    /// \brief Set the supply values of the nodes.
kpeter@806
   400
    ///
kpeter@806
   401
    /// This function sets the supply values of the nodes.
kpeter@806
   402
    /// If neither this function nor \ref stSupply() is used before
kpeter@806
   403
    /// calling \ref run(), the supply of each node will be set to zero.
kpeter@806
   404
    ///
kpeter@806
   405
    /// \param map A node map storing the supply values.
kpeter@806
   406
    /// Its \c Value type must be convertible to the \c Value type
kpeter@806
   407
    /// of the algorithm.
kpeter@806
   408
    ///
kpeter@806
   409
    /// \return <tt>(*this)</tt>
kpeter@806
   410
    template<typename SupplyMap>
kpeter@806
   411
    CapacityScaling& supplyMap(const SupplyMap& map) {
kpeter@806
   412
      for (NodeIt n(_graph); n != INVALID; ++n) {
kpeter@806
   413
        _supply[_node_id[n]] = map[n];
kpeter@806
   414
      }
kpeter@806
   415
      return *this;
kpeter@806
   416
    }
kpeter@806
   417
kpeter@806
   418
    /// \brief Set single source and target nodes and a supply value.
kpeter@806
   419
    ///
kpeter@806
   420
    /// This function sets a single source node and a single target node
kpeter@806
   421
    /// and the required flow value.
kpeter@806
   422
    /// If neither this function nor \ref supplyMap() is used before
kpeter@806
   423
    /// calling \ref run(), the supply of each node will be set to zero.
kpeter@806
   424
    ///
kpeter@806
   425
    /// Using this function has the same effect as using \ref supplyMap()
kpeter@919
   426
    /// with a map in which \c k is assigned to \c s, \c -k is
kpeter@806
   427
    /// assigned to \c t and all other nodes have zero supply value.
kpeter@806
   428
    ///
kpeter@806
   429
    /// \param s The source node.
kpeter@806
   430
    /// \param t The target node.
kpeter@806
   431
    /// \param k The required amount of flow from node \c s to node \c t
kpeter@806
   432
    /// (i.e. the supply of \c s and the demand of \c t).
kpeter@806
   433
    ///
kpeter@806
   434
    /// \return <tt>(*this)</tt>
kpeter@806
   435
    CapacityScaling& stSupply(const Node& s, const Node& t, Value k) {
kpeter@806
   436
      for (int i = 0; i != _node_num; ++i) {
kpeter@806
   437
        _supply[i] = 0;
kpeter@806
   438
      }
kpeter@806
   439
      _supply[_node_id[s]] =  k;
kpeter@806
   440
      _supply[_node_id[t]] = -k;
kpeter@806
   441
      return *this;
kpeter@806
   442
    }
alpar@877
   443
kpeter@806
   444
    /// @}
kpeter@806
   445
kpeter@805
   446
    /// \name Execution control
kpeter@807
   447
    /// The algorithm can be executed using \ref run().
kpeter@805
   448
kpeter@805
   449
    /// @{
kpeter@805
   450
kpeter@805
   451
    /// \brief Run the algorithm.
kpeter@805
   452
    ///
kpeter@805
   453
    /// This function runs the algorithm.
kpeter@806
   454
    /// The paramters can be specified using functions \ref lowerMap(),
kpeter@806
   455
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
kpeter@806
   456
    /// For example,
kpeter@806
   457
    /// \code
kpeter@806
   458
    ///   CapacityScaling<ListDigraph> cs(graph);
kpeter@806
   459
    ///   cs.lowerMap(lower).upperMap(upper).costMap(cost)
kpeter@806
   460
    ///     .supplyMap(sup).run();
kpeter@806
   461
    /// \endcode
kpeter@806
   462
    ///
kpeter@830
   463
    /// This function can be called more than once. All the given parameters
kpeter@830
   464
    /// are kept for the next call, unless \ref resetParams() or \ref reset()
kpeter@830
   465
    /// is used, thus only the modified parameters have to be set again.
kpeter@830
   466
    /// If the underlying digraph was also modified after the construction
kpeter@830
   467
    /// of the class (or the last \ref reset() call), then the \ref reset()
kpeter@830
   468
    /// function must be called.
kpeter@805
   469
    ///
kpeter@810
   470
    /// \param factor The capacity scaling factor. It must be larger than
kpeter@810
   471
    /// one to use scaling. If it is less or equal to one, then scaling
kpeter@810
   472
    /// will be disabled.
kpeter@805
   473
    ///
kpeter@806
   474
    /// \return \c INFEASIBLE if no feasible flow exists,
kpeter@806
   475
    /// \n \c OPTIMAL if the problem has optimal solution
kpeter@806
   476
    /// (i.e. it is feasible and bounded), and the algorithm has found
kpeter@806
   477
    /// optimal flow and node potentials (primal and dual solutions),
kpeter@806
   478
    /// \n \c UNBOUNDED if the digraph contains an arc of negative cost
kpeter@806
   479
    /// and infinite upper bound. It means that the objective function
kpeter@812
   480
    /// is unbounded on that arc, however, note that it could actually be
kpeter@806
   481
    /// bounded over the feasible flows, but this algroithm cannot handle
kpeter@806
   482
    /// these cases.
kpeter@806
   483
    ///
kpeter@806
   484
    /// \see ProblemType
kpeter@830
   485
    /// \see resetParams(), reset()
kpeter@810
   486
    ProblemType run(int factor = 4) {
kpeter@810
   487
      _factor = factor;
kpeter@810
   488
      ProblemType pt = init();
kpeter@806
   489
      if (pt != OPTIMAL) return pt;
kpeter@806
   490
      return start();
kpeter@806
   491
    }
kpeter@806
   492
kpeter@806
   493
    /// \brief Reset all the parameters that have been given before.
kpeter@806
   494
    ///
kpeter@806
   495
    /// This function resets all the paramaters that have been given
kpeter@806
   496
    /// before using functions \ref lowerMap(), \ref upperMap(),
kpeter@806
   497
    /// \ref costMap(), \ref supplyMap(), \ref stSupply().
kpeter@806
   498
    ///
kpeter@830
   499
    /// It is useful for multiple \ref run() calls. Basically, all the given
kpeter@830
   500
    /// parameters are kept for the next \ref run() call, unless
kpeter@830
   501
    /// \ref resetParams() or \ref reset() is used.
kpeter@830
   502
    /// If the underlying digraph was also modified after the construction
kpeter@830
   503
    /// of the class or the last \ref reset() call, then the \ref reset()
kpeter@830
   504
    /// function must be used, otherwise \ref resetParams() is sufficient.
kpeter@806
   505
    ///
kpeter@806
   506
    /// For example,
kpeter@806
   507
    /// \code
kpeter@806
   508
    ///   CapacityScaling<ListDigraph> cs(graph);
kpeter@806
   509
    ///
kpeter@806
   510
    ///   // First run
kpeter@806
   511
    ///   cs.lowerMap(lower).upperMap(upper).costMap(cost)
kpeter@806
   512
    ///     .supplyMap(sup).run();
kpeter@806
   513
    ///
kpeter@830
   514
    ///   // Run again with modified cost map (resetParams() is not called,
kpeter@806
   515
    ///   // so only the cost map have to be set again)
kpeter@806
   516
    ///   cost[e] += 100;
kpeter@806
   517
    ///   cs.costMap(cost).run();
kpeter@806
   518
    ///
kpeter@830
   519
    ///   // Run again from scratch using resetParams()
kpeter@806
   520
    ///   // (the lower bounds will be set to zero on all arcs)
kpeter@830
   521
    ///   cs.resetParams();
kpeter@806
   522
    ///   cs.upperMap(capacity).costMap(cost)
kpeter@806
   523
    ///     .supplyMap(sup).run();
kpeter@806
   524
    /// \endcode
kpeter@806
   525
    ///
kpeter@806
   526
    /// \return <tt>(*this)</tt>
kpeter@830
   527
    ///
kpeter@830
   528
    /// \see reset(), run()
kpeter@830
   529
    CapacityScaling& resetParams() {
kpeter@806
   530
      for (int i = 0; i != _node_num; ++i) {
kpeter@806
   531
        _supply[i] = 0;
kpeter@806
   532
      }
kpeter@806
   533
      for (int j = 0; j != _res_arc_num; ++j) {
kpeter@806
   534
        _lower[j] = 0;
kpeter@806
   535
        _upper[j] = INF;
kpeter@806
   536
        _cost[j] = _forward[j] ? 1 : -1;
kpeter@806
   537
      }
kpeter@806
   538
      _have_lower = false;
kpeter@806
   539
      return *this;
kpeter@805
   540
    }
kpeter@805
   541
kpeter@830
   542
    /// \brief Reset the internal data structures and all the parameters
kpeter@830
   543
    /// that have been given before.
kpeter@830
   544
    ///
kpeter@830
   545
    /// This function resets the internal data structures and all the
kpeter@830
   546
    /// paramaters that have been given before using functions \ref lowerMap(),
kpeter@830
   547
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
kpeter@830
   548
    ///
kpeter@830
   549
    /// It is useful for multiple \ref run() calls. Basically, all the given
kpeter@830
   550
    /// parameters are kept for the next \ref run() call, unless
kpeter@830
   551
    /// \ref resetParams() or \ref reset() is used.
kpeter@830
   552
    /// If the underlying digraph was also modified after the construction
kpeter@830
   553
    /// of the class or the last \ref reset() call, then the \ref reset()
kpeter@830
   554
    /// function must be used, otherwise \ref resetParams() is sufficient.
kpeter@830
   555
    ///
kpeter@830
   556
    /// See \ref resetParams() for examples.
kpeter@830
   557
    ///
kpeter@830
   558
    /// \return <tt>(*this)</tt>
kpeter@830
   559
    ///
kpeter@830
   560
    /// \see resetParams(), run()
kpeter@830
   561
    CapacityScaling& reset() {
kpeter@830
   562
      // Resize vectors
kpeter@830
   563
      _node_num = countNodes(_graph);
kpeter@830
   564
      _arc_num = countArcs(_graph);
kpeter@830
   565
      _res_arc_num = 2 * (_arc_num + _node_num);
kpeter@830
   566
      _root = _node_num;
kpeter@830
   567
      ++_node_num;
kpeter@830
   568
kpeter@830
   569
      _first_out.resize(_node_num + 1);
kpeter@830
   570
      _forward.resize(_res_arc_num);
kpeter@830
   571
      _source.resize(_res_arc_num);
kpeter@830
   572
      _target.resize(_res_arc_num);
kpeter@830
   573
      _reverse.resize(_res_arc_num);
kpeter@830
   574
kpeter@830
   575
      _lower.resize(_res_arc_num);
kpeter@830
   576
      _upper.resize(_res_arc_num);
kpeter@830
   577
      _cost.resize(_res_arc_num);
kpeter@830
   578
      _supply.resize(_node_num);
alpar@877
   579
kpeter@830
   580
      _res_cap.resize(_res_arc_num);
kpeter@830
   581
      _pi.resize(_node_num);
kpeter@830
   582
      _excess.resize(_node_num);
kpeter@830
   583
      _pred.resize(_node_num);
kpeter@830
   584
kpeter@830
   585
      // Copy the graph
kpeter@830
   586
      int i = 0, j = 0, k = 2 * _arc_num + _node_num - 1;
kpeter@830
   587
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
kpeter@830
   588
        _node_id[n] = i;
kpeter@830
   589
      }
kpeter@830
   590
      i = 0;
kpeter@830
   591
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
kpeter@830
   592
        _first_out[i] = j;
kpeter@830
   593
        for (OutArcIt a(_graph, n); a != INVALID; ++a, ++j) {
kpeter@830
   594
          _arc_idf[a] = j;
kpeter@830
   595
          _forward[j] = true;
kpeter@830
   596
          _source[j] = i;
kpeter@830
   597
          _target[j] = _node_id[_graph.runningNode(a)];
kpeter@830
   598
        }
kpeter@830
   599
        for (InArcIt a(_graph, n); a != INVALID; ++a, ++j) {
kpeter@830
   600
          _arc_idb[a] = j;
kpeter@830
   601
          _forward[j] = false;
kpeter@830
   602
          _source[j] = i;
kpeter@830
   603
          _target[j] = _node_id[_graph.runningNode(a)];
kpeter@830
   604
        }
kpeter@830
   605
        _forward[j] = false;
kpeter@830
   606
        _source[j] = i;
kpeter@830
   607
        _target[j] = _root;
kpeter@830
   608
        _reverse[j] = k;
kpeter@830
   609
        _forward[k] = true;
kpeter@830
   610
        _source[k] = _root;
kpeter@830
   611
        _target[k] = i;
kpeter@830
   612
        _reverse[k] = j;
kpeter@830
   613
        ++j; ++k;
kpeter@830
   614
      }
kpeter@830
   615
      _first_out[i] = j;
kpeter@830
   616
      _first_out[_node_num] = k;
kpeter@830
   617
      for (ArcIt a(_graph); a != INVALID; ++a) {
kpeter@830
   618
        int fi = _arc_idf[a];
kpeter@830
   619
        int bi = _arc_idb[a];
kpeter@830
   620
        _reverse[fi] = bi;
kpeter@830
   621
        _reverse[bi] = fi;
kpeter@830
   622
      }
alpar@877
   623
kpeter@830
   624
      // Reset parameters
kpeter@830
   625
      resetParams();
kpeter@830
   626
      return *this;
kpeter@830
   627
    }
kpeter@830
   628
kpeter@805
   629
    /// @}
kpeter@805
   630
kpeter@805
   631
    /// \name Query Functions
kpeter@805
   632
    /// The results of the algorithm can be obtained using these
kpeter@805
   633
    /// functions.\n
kpeter@806
   634
    /// The \ref run() function must be called before using them.
kpeter@805
   635
kpeter@805
   636
    /// @{
kpeter@805
   637
kpeter@806
   638
    /// \brief Return the total cost of the found flow.
kpeter@805
   639
    ///
kpeter@806
   640
    /// This function returns the total cost of the found flow.
kpeter@806
   641
    /// Its complexity is O(e).
kpeter@806
   642
    ///
kpeter@806
   643
    /// \note The return type of the function can be specified as a
kpeter@806
   644
    /// template parameter. For example,
kpeter@806
   645
    /// \code
kpeter@806
   646
    ///   cs.totalCost<double>();
kpeter@806
   647
    /// \endcode
kpeter@806
   648
    /// It is useful if the total cost cannot be stored in the \c Cost
kpeter@806
   649
    /// type of the algorithm, which is the default return type of the
kpeter@806
   650
    /// function.
kpeter@805
   651
    ///
kpeter@805
   652
    /// \pre \ref run() must be called before using this function.
kpeter@806
   653
    template <typename Number>
kpeter@806
   654
    Number totalCost() const {
kpeter@806
   655
      Number c = 0;
kpeter@806
   656
      for (ArcIt a(_graph); a != INVALID; ++a) {
kpeter@806
   657
        int i = _arc_idb[a];
kpeter@806
   658
        c += static_cast<Number>(_res_cap[i]) *
kpeter@806
   659
             (-static_cast<Number>(_cost[i]));
kpeter@806
   660
      }
kpeter@806
   661
      return c;
kpeter@805
   662
    }
kpeter@805
   663
kpeter@806
   664
#ifndef DOXYGEN
kpeter@806
   665
    Cost totalCost() const {
kpeter@806
   666
      return totalCost<Cost>();
kpeter@805
   667
    }
kpeter@806
   668
#endif
kpeter@805
   669
kpeter@805
   670
    /// \brief Return the flow on the given arc.
kpeter@805
   671
    ///
kpeter@806
   672
    /// This function returns the flow on the given arc.
kpeter@805
   673
    ///
kpeter@805
   674
    /// \pre \ref run() must be called before using this function.
kpeter@806
   675
    Value flow(const Arc& a) const {
kpeter@806
   676
      return _res_cap[_arc_idb[a]];
kpeter@805
   677
    }
kpeter@805
   678
kpeter@806
   679
    /// \brief Return the flow map (the primal solution).
kpeter@805
   680
    ///
kpeter@806
   681
    /// This function copies the flow value on each arc into the given
kpeter@806
   682
    /// map. The \c Value type of the algorithm must be convertible to
kpeter@806
   683
    /// the \c Value type of the map.
kpeter@805
   684
    ///
kpeter@805
   685
    /// \pre \ref run() must be called before using this function.
kpeter@806
   686
    template <typename FlowMap>
kpeter@806
   687
    void flowMap(FlowMap &map) const {
kpeter@806
   688
      for (ArcIt a(_graph); a != INVALID; ++a) {
kpeter@806
   689
        map.set(a, _res_cap[_arc_idb[a]]);
kpeter@806
   690
      }
kpeter@805
   691
    }
kpeter@805
   692
kpeter@806
   693
    /// \brief Return the potential (dual value) of the given node.
kpeter@805
   694
    ///
kpeter@806
   695
    /// This function returns the potential (dual value) of the
kpeter@806
   696
    /// given node.
kpeter@805
   697
    ///
kpeter@805
   698
    /// \pre \ref run() must be called before using this function.
kpeter@806
   699
    Cost potential(const Node& n) const {
kpeter@806
   700
      return _pi[_node_id[n]];
kpeter@806
   701
    }
kpeter@806
   702
kpeter@806
   703
    /// \brief Return the potential map (the dual solution).
kpeter@806
   704
    ///
kpeter@806
   705
    /// This function copies the potential (dual value) of each node
kpeter@806
   706
    /// into the given map.
kpeter@806
   707
    /// The \c Cost type of the algorithm must be convertible to the
kpeter@806
   708
    /// \c Value type of the map.
kpeter@806
   709
    ///
kpeter@806
   710
    /// \pre \ref run() must be called before using this function.
kpeter@806
   711
    template <typename PotentialMap>
kpeter@806
   712
    void potentialMap(PotentialMap &map) const {
kpeter@806
   713
      for (NodeIt n(_graph); n != INVALID; ++n) {
kpeter@806
   714
        map.set(n, _pi[_node_id[n]]);
kpeter@806
   715
      }
kpeter@805
   716
    }
kpeter@805
   717
kpeter@805
   718
    /// @}
kpeter@805
   719
kpeter@805
   720
  private:
kpeter@805
   721
kpeter@806
   722
    // Initialize the algorithm
kpeter@810
   723
    ProblemType init() {
kpeter@821
   724
      if (_node_num <= 1) return INFEASIBLE;
kpeter@805
   725
kpeter@806
   726
      // Check the sum of supply values
kpeter@806
   727
      _sum_supply = 0;
kpeter@806
   728
      for (int i = 0; i != _root; ++i) {
kpeter@806
   729
        _sum_supply += _supply[i];
kpeter@805
   730
      }
kpeter@806
   731
      if (_sum_supply > 0) return INFEASIBLE;
alpar@877
   732
kpeter@811
   733
      // Initialize vectors
kpeter@806
   734
      for (int i = 0; i != _root; ++i) {
kpeter@806
   735
        _pi[i] = 0;
kpeter@806
   736
        _excess[i] = _supply[i];
kpeter@805
   737
      }
kpeter@805
   738
kpeter@806
   739
      // Remove non-zero lower bounds
kpeter@811
   740
      const Value MAX = std::numeric_limits<Value>::max();
kpeter@811
   741
      int last_out;
kpeter@806
   742
      if (_have_lower) {
kpeter@806
   743
        for (int i = 0; i != _root; ++i) {
kpeter@811
   744
          last_out = _first_out[i+1];
kpeter@811
   745
          for (int j = _first_out[i]; j != last_out; ++j) {
kpeter@806
   746
            if (_forward[j]) {
kpeter@806
   747
              Value c = _lower[j];
kpeter@806
   748
              if (c >= 0) {
kpeter@811
   749
                _res_cap[j] = _upper[j] < MAX ? _upper[j] - c : INF;
kpeter@806
   750
              } else {
kpeter@811
   751
                _res_cap[j] = _upper[j] < MAX + c ? _upper[j] - c : INF;
kpeter@806
   752
              }
kpeter@806
   753
              _excess[i] -= c;
kpeter@806
   754
              _excess[_target[j]] += c;
kpeter@806
   755
            } else {
kpeter@806
   756
              _res_cap[j] = 0;
kpeter@806
   757
            }
kpeter@806
   758
          }
kpeter@806
   759
        }
kpeter@806
   760
      } else {
kpeter@806
   761
        for (int j = 0; j != _res_arc_num; ++j) {
kpeter@806
   762
          _res_cap[j] = _forward[j] ? _upper[j] : 0;
kpeter@806
   763
        }
kpeter@806
   764
      }
kpeter@805
   765
kpeter@806
   766
      // Handle negative costs
kpeter@811
   767
      for (int i = 0; i != _root; ++i) {
kpeter@811
   768
        last_out = _first_out[i+1] - 1;
kpeter@811
   769
        for (int j = _first_out[i]; j != last_out; ++j) {
kpeter@811
   770
          Value rc = _res_cap[j];
kpeter@811
   771
          if (_cost[j] < 0 && rc > 0) {
kpeter@811
   772
            if (rc >= MAX) return UNBOUNDED;
kpeter@811
   773
            _excess[i] -= rc;
kpeter@811
   774
            _excess[_target[j]] += rc;
kpeter@811
   775
            _res_cap[j] = 0;
kpeter@811
   776
            _res_cap[_reverse[j]] += rc;
kpeter@806
   777
          }
kpeter@806
   778
        }
kpeter@806
   779
      }
alpar@877
   780
kpeter@806
   781
      // Handle GEQ supply type
kpeter@806
   782
      if (_sum_supply < 0) {
kpeter@806
   783
        _pi[_root] = 0;
kpeter@806
   784
        _excess[_root] = -_sum_supply;
kpeter@806
   785
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
kpeter@811
   786
          int ra = _reverse[a];
kpeter@811
   787
          _res_cap[a] = -_sum_supply + 1;
kpeter@811
   788
          _res_cap[ra] = 0;
kpeter@806
   789
          _cost[a] = 0;
kpeter@811
   790
          _cost[ra] = 0;
kpeter@806
   791
        }
kpeter@806
   792
      } else {
kpeter@806
   793
        _pi[_root] = 0;
kpeter@806
   794
        _excess[_root] = 0;
kpeter@806
   795
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
kpeter@811
   796
          int ra = _reverse[a];
kpeter@806
   797
          _res_cap[a] = 1;
kpeter@811
   798
          _res_cap[ra] = 0;
kpeter@806
   799
          _cost[a] = 0;
kpeter@811
   800
          _cost[ra] = 0;
kpeter@806
   801
        }
kpeter@806
   802
      }
kpeter@806
   803
kpeter@806
   804
      // Initialize delta value
kpeter@810
   805
      if (_factor > 1) {
kpeter@805
   806
        // With scaling
kpeter@839
   807
        Value max_sup = 0, max_dem = 0, max_cap = 0;
kpeter@839
   808
        for (int i = 0; i != _root; ++i) {
kpeter@811
   809
          Value ex = _excess[i];
kpeter@811
   810
          if ( ex > max_sup) max_sup =  ex;
kpeter@811
   811
          if (-ex > max_dem) max_dem = -ex;
kpeter@839
   812
          int last_out = _first_out[i+1] - 1;
kpeter@839
   813
          for (int j = _first_out[i]; j != last_out; ++j) {
kpeter@839
   814
            if (_res_cap[j] > max_cap) max_cap = _res_cap[j];
kpeter@839
   815
          }
kpeter@805
   816
        }
kpeter@805
   817
        max_sup = std::min(std::min(max_sup, max_dem), max_cap);
kpeter@810
   818
        for (_delta = 1; 2 * _delta <= max_sup; _delta *= 2) ;
kpeter@805
   819
      } else {
kpeter@805
   820
        // Without scaling
kpeter@805
   821
        _delta = 1;
kpeter@805
   822
      }
kpeter@805
   823
kpeter@806
   824
      return OPTIMAL;
kpeter@805
   825
    }
kpeter@805
   826
kpeter@806
   827
    ProblemType start() {
kpeter@806
   828
      // Execute the algorithm
kpeter@806
   829
      ProblemType pt;
kpeter@805
   830
      if (_delta > 1)
kpeter@806
   831
        pt = startWithScaling();
kpeter@805
   832
      else
kpeter@806
   833
        pt = startWithoutScaling();
kpeter@806
   834
kpeter@806
   835
      // Handle non-zero lower bounds
kpeter@806
   836
      if (_have_lower) {
kpeter@811
   837
        int limit = _first_out[_root];
kpeter@811
   838
        for (int j = 0; j != limit; ++j) {
kpeter@806
   839
          if (!_forward[j]) _res_cap[j] += _lower[j];
kpeter@806
   840
        }
kpeter@806
   841
      }
kpeter@806
   842
kpeter@806
   843
      // Shift potentials if necessary
kpeter@806
   844
      Cost pr = _pi[_root];
kpeter@806
   845
      if (_sum_supply < 0 || pr > 0) {
kpeter@806
   846
        for (int i = 0; i != _node_num; ++i) {
kpeter@806
   847
          _pi[i] -= pr;
alpar@877
   848
        }
kpeter@806
   849
      }
alpar@877
   850
kpeter@806
   851
      return pt;
kpeter@805
   852
    }
kpeter@805
   853
kpeter@806
   854
    // Execute the capacity scaling algorithm
kpeter@806
   855
    ProblemType startWithScaling() {
kpeter@807
   856
      // Perform capacity scaling phases
kpeter@806
   857
      int s, t;
kpeter@806
   858
      ResidualDijkstra _dijkstra(*this);
kpeter@805
   859
      while (true) {
kpeter@806
   860
        // Saturate all arcs not satisfying the optimality condition
kpeter@811
   861
        int last_out;
kpeter@806
   862
        for (int u = 0; u != _node_num; ++u) {
kpeter@811
   863
          last_out = _sum_supply < 0 ?
kpeter@811
   864
            _first_out[u+1] : _first_out[u+1] - 1;
kpeter@811
   865
          for (int a = _first_out[u]; a != last_out; ++a) {
kpeter@806
   866
            int v = _target[a];
kpeter@806
   867
            Cost c = _cost[a] + _pi[u] - _pi[v];
kpeter@806
   868
            Value rc = _res_cap[a];
kpeter@806
   869
            if (c < 0 && rc >= _delta) {
kpeter@806
   870
              _excess[u] -= rc;
kpeter@806
   871
              _excess[v] += rc;
kpeter@806
   872
              _res_cap[a] = 0;
kpeter@806
   873
              _res_cap[_reverse[a]] += rc;
kpeter@806
   874
            }
kpeter@805
   875
          }
kpeter@805
   876
        }
kpeter@805
   877
kpeter@806
   878
        // Find excess nodes and deficit nodes
kpeter@805
   879
        _excess_nodes.clear();
kpeter@805
   880
        _deficit_nodes.clear();
kpeter@806
   881
        for (int u = 0; u != _node_num; ++u) {
kpeter@811
   882
          Value ex = _excess[u];
kpeter@811
   883
          if (ex >=  _delta) _excess_nodes.push_back(u);
kpeter@811
   884
          if (ex <= -_delta) _deficit_nodes.push_back(u);
kpeter@805
   885
        }
kpeter@805
   886
        int next_node = 0, next_def_node = 0;
kpeter@805
   887
kpeter@806
   888
        // Find augmenting shortest paths
kpeter@805
   889
        while (next_node < int(_excess_nodes.size())) {
kpeter@806
   890
          // Check deficit nodes
kpeter@805
   891
          if (_delta > 1) {
kpeter@805
   892
            bool delta_deficit = false;
kpeter@805
   893
            for ( ; next_def_node < int(_deficit_nodes.size());
kpeter@805
   894
                    ++next_def_node ) {
kpeter@805
   895
              if (_excess[_deficit_nodes[next_def_node]] <= -_delta) {
kpeter@805
   896
                delta_deficit = true;
kpeter@805
   897
                break;
kpeter@805
   898
              }
kpeter@805
   899
            }
kpeter@805
   900
            if (!delta_deficit) break;
kpeter@805
   901
          }
kpeter@805
   902
kpeter@806
   903
          // Run Dijkstra in the residual network
kpeter@805
   904
          s = _excess_nodes[next_node];
kpeter@806
   905
          if ((t = _dijkstra.run(s, _delta)) == -1) {
kpeter@805
   906
            if (_delta > 1) {
kpeter@805
   907
              ++next_node;
kpeter@805
   908
              continue;
kpeter@805
   909
            }
kpeter@806
   910
            return INFEASIBLE;
kpeter@805
   911
          }
kpeter@805
   912
kpeter@806
   913
          // Augment along a shortest path from s to t
kpeter@806
   914
          Value d = std::min(_excess[s], -_excess[t]);
kpeter@806
   915
          int u = t;
kpeter@806
   916
          int a;
kpeter@805
   917
          if (d > _delta) {
kpeter@806
   918
            while ((a = _pred[u]) != -1) {
kpeter@806
   919
              if (_res_cap[a] < d) d = _res_cap[a];
kpeter@806
   920
              u = _source[a];
kpeter@805
   921
            }
kpeter@805
   922
          }
kpeter@805
   923
          u = t;
kpeter@806
   924
          while ((a = _pred[u]) != -1) {
kpeter@806
   925
            _res_cap[a] -= d;
kpeter@806
   926
            _res_cap[_reverse[a]] += d;
kpeter@806
   927
            u = _source[a];
kpeter@805
   928
          }
kpeter@805
   929
          _excess[s] -= d;
kpeter@805
   930
          _excess[t] += d;
kpeter@805
   931
kpeter@805
   932
          if (_excess[s] < _delta) ++next_node;
kpeter@805
   933
        }
kpeter@805
   934
kpeter@805
   935
        if (_delta == 1) break;
kpeter@810
   936
        _delta = _delta <= _factor ? 1 : _delta / _factor;
kpeter@805
   937
      }
kpeter@805
   938
kpeter@806
   939
      return OPTIMAL;
kpeter@805
   940
    }
kpeter@805
   941
kpeter@806
   942
    // Execute the successive shortest path algorithm
kpeter@806
   943
    ProblemType startWithoutScaling() {
kpeter@806
   944
      // Find excess nodes
kpeter@806
   945
      _excess_nodes.clear();
kpeter@806
   946
      for (int i = 0; i != _node_num; ++i) {
kpeter@806
   947
        if (_excess[i] > 0) _excess_nodes.push_back(i);
kpeter@806
   948
      }
kpeter@806
   949
      if (_excess_nodes.size() == 0) return OPTIMAL;
kpeter@805
   950
      int next_node = 0;
kpeter@805
   951
kpeter@806
   952
      // Find shortest paths
kpeter@806
   953
      int s, t;
kpeter@806
   954
      ResidualDijkstra _dijkstra(*this);
kpeter@805
   955
      while ( _excess[_excess_nodes[next_node]] > 0 ||
kpeter@805
   956
              ++next_node < int(_excess_nodes.size()) )
kpeter@805
   957
      {
kpeter@806
   958
        // Run Dijkstra in the residual network
kpeter@805
   959
        s = _excess_nodes[next_node];
kpeter@806
   960
        if ((t = _dijkstra.run(s)) == -1) return INFEASIBLE;
kpeter@805
   961
kpeter@806
   962
        // Augment along a shortest path from s to t
kpeter@806
   963
        Value d = std::min(_excess[s], -_excess[t]);
kpeter@806
   964
        int u = t;
kpeter@806
   965
        int a;
kpeter@805
   966
        if (d > 1) {
kpeter@806
   967
          while ((a = _pred[u]) != -1) {
kpeter@806
   968
            if (_res_cap[a] < d) d = _res_cap[a];
kpeter@806
   969
            u = _source[a];
kpeter@805
   970
          }
kpeter@805
   971
        }
kpeter@805
   972
        u = t;
kpeter@806
   973
        while ((a = _pred[u]) != -1) {
kpeter@806
   974
          _res_cap[a] -= d;
kpeter@806
   975
          _res_cap[_reverse[a]] += d;
kpeter@806
   976
          u = _source[a];
kpeter@805
   977
        }
kpeter@805
   978
        _excess[s] -= d;
kpeter@805
   979
        _excess[t] += d;
kpeter@805
   980
      }
kpeter@805
   981
kpeter@806
   982
      return OPTIMAL;
kpeter@805
   983
    }
kpeter@805
   984
kpeter@805
   985
  }; //class CapacityScaling
kpeter@805
   986
kpeter@805
   987
  ///@}
kpeter@805
   988
kpeter@805
   989
} //namespace lemon
kpeter@805
   990
kpeter@805
   991
#endif //LEMON_CAPACITY_SCALING_H