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