3 * This file is a part of LEMON, a generic C++ optimization library
5 * Copyright (C) 2003-2008
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
9 * Permission to use, modify and distribute this software is granted
10 * provided that this copyright notice appears in all copies. For
11 * precise terms see the accompanying LICENSE file.
13 * This software is provided "AS IS" with no warranty of any kind,
14 * express or implied, and with no claim as to its suitability for any
19 #ifndef LEMON_CAPACITY_SCALING_H
20 #define LEMON_CAPACITY_SCALING_H
22 /// \ingroup min_cost_flow
25 /// \brief Capacity scaling algorithm for finding a minimum cost flow.
28 #include <lemon/bin_heap.h>
32 /// \addtogroup min_cost_flow
35 /// \brief Implementation of the capacity scaling algorithm for
36 /// finding a minimum cost flow.
38 /// \ref CapacityScaling implements the capacity scaling version
39 /// of the successive shortest path algorithm for finding a minimum
42 /// \tparam Graph The directed graph type the algorithm runs on.
43 /// \tparam LowerMap The type of the lower bound map.
44 /// \tparam CapacityMap The type of the capacity (upper bound) map.
45 /// \tparam CostMap The type of the cost (length) map.
46 /// \tparam SupplyMap The type of the supply map.
49 /// - Edge capacities and costs should be \e non-negative \e integers.
50 /// - Supply values should be \e signed \e integers.
51 /// - The value types of the maps should be convertible to each other.
52 /// - \c CostMap::Value must be signed type.
54 /// \author Peter Kovacs
55 template < typename Graph,
56 typename LowerMap = typename Graph::template EdgeMap<int>,
57 typename CapacityMap = typename Graph::template EdgeMap<int>,
58 typename CostMap = typename Graph::template EdgeMap<int>,
59 typename SupplyMap = typename Graph::template NodeMap<int> >
62 GRAPH_TYPEDEFS(typename Graph);
64 typedef typename CapacityMap::Value Capacity;
65 typedef typename CostMap::Value Cost;
66 typedef typename SupplyMap::Value Supply;
67 typedef typename Graph::template EdgeMap<Capacity> CapacityEdgeMap;
68 typedef typename Graph::template NodeMap<Supply> SupplyNodeMap;
69 typedef typename Graph::template NodeMap<Edge> PredMap;
73 /// The type of the flow map.
74 typedef typename Graph::template EdgeMap<Capacity> FlowMap;
75 /// The type of the potential map.
76 typedef typename Graph::template NodeMap<Cost> PotentialMap;
80 /// \brief Special implementation of the \ref Dijkstra algorithm
81 /// for finding shortest paths in the residual network.
83 /// \ref ResidualDijkstra is a special implementation of the
84 /// \ref Dijkstra algorithm for finding shortest paths in the
85 /// residual network of the graph with respect to the reduced edge
86 /// costs and modifying the node potentials according to the
87 /// distance of the nodes.
88 class ResidualDijkstra
90 typedef typename Graph::template NodeMap<int> HeapCrossRef;
91 typedef BinHeap<Cost, HeapCrossRef> Heap;
95 // The directed graph the algorithm runs on
100 const CapacityEdgeMap &_res_cap;
101 const CostMap &_cost;
102 const SupplyNodeMap &_excess;
103 PotentialMap &_potential;
109 // The processed (i.e. permanently labeled) nodes
110 std::vector<Node> _proc_nodes;
115 ResidualDijkstra( const Graph &graph,
117 const CapacityEdgeMap &res_cap,
119 const SupplyMap &excess,
120 PotentialMap &potential,
122 _graph(graph), _flow(flow), _res_cap(res_cap), _cost(cost),
123 _excess(excess), _potential(potential), _dist(graph),
127 /// Run the algorithm from the given source node.
128 Node run(Node s, Capacity delta = 1) {
129 HeapCrossRef heap_cross_ref(_graph, Heap::PRE_HEAP);
130 Heap heap(heap_cross_ref);
136 while (!heap.empty() && _excess[heap.top()] > -delta) {
137 Node u = heap.top(), v;
138 Cost d = heap.prio() + _potential[u], nd;
139 _dist[u] = heap.prio();
141 _proc_nodes.push_back(u);
143 // Traversing outgoing edges
144 for (OutEdgeIt e(_graph, u); e != INVALID; ++e) {
145 if (_res_cap[e] >= delta) {
146 v = _graph.target(e);
147 switch(heap.state(v)) {
149 heap.push(v, d + _cost[e] - _potential[v]);
153 nd = d + _cost[e] - _potential[v];
155 heap.decrease(v, nd);
159 case Heap::POST_HEAP:
165 // Traversing incoming edges
166 for (InEdgeIt e(_graph, u); e != INVALID; ++e) {
167 if (_flow[e] >= delta) {
168 v = _graph.source(e);
169 switch(heap.state(v)) {
171 heap.push(v, d - _cost[e] - _potential[v]);
175 nd = d - _cost[e] - _potential[v];
177 heap.decrease(v, nd);
181 case Heap::POST_HEAP:
187 if (heap.empty()) return INVALID;
189 // Updating potentials of processed nodes
191 Cost t_dist = heap.prio();
192 for (int i = 0; i < int(_proc_nodes.size()); ++i)
193 _potential[_proc_nodes[i]] += _dist[_proc_nodes[i]] - t_dist;
198 }; //class ResidualDijkstra
202 // The directed graph the algorithm runs on
204 // The original lower bound map
205 const LowerMap *_lower;
206 // The modified capacity map
207 CapacityEdgeMap _capacity;
208 // The original cost map
209 const CostMap &_cost;
210 // The modified supply map
211 SupplyNodeMap _supply;
214 // Edge map of the current flow
217 // Node map of the current potentials
218 PotentialMap *_potential;
219 bool _local_potential;
221 // The residual capacity map
222 CapacityEdgeMap _res_cap;
224 SupplyNodeMap _excess;
225 // The excess nodes (i.e. nodes with positive excess)
226 std::vector<Node> _excess_nodes;
227 // The deficit nodes (i.e. nodes with negative excess)
228 std::vector<Node> _deficit_nodes;
230 // The delta parameter used for capacity scaling
232 // The maximum number of phases
237 // Implementation of the Dijkstra algorithm for finding augmenting
238 // shortest paths in the residual network
239 ResidualDijkstra *_dijkstra;
243 /// \brief General constructor (with lower bounds).
245 /// General constructor (with lower bounds).
247 /// \param graph The directed graph the algorithm runs on.
248 /// \param lower The lower bounds of the edges.
249 /// \param capacity The capacities (upper bounds) of the edges.
250 /// \param cost The cost (length) values of the edges.
251 /// \param supply The supply values of the nodes (signed).
252 CapacityScaling( const Graph &graph,
253 const LowerMap &lower,
254 const CapacityMap &capacity,
256 const SupplyMap &supply ) :
257 _graph(graph), _lower(&lower), _capacity(graph), _cost(cost),
258 _supply(graph), _flow(0), _local_flow(false),
259 _potential(0), _local_potential(false),
260 _res_cap(graph), _excess(graph), _pred(graph)
262 // Removing non-zero lower bounds
263 _capacity = subMap(capacity, lower);
264 _res_cap = _capacity;
266 for (NodeIt n(_graph); n != INVALID; ++n) {
267 Supply s = supply[n];
268 for (InEdgeIt e(_graph, n); e != INVALID; ++e)
270 for (OutEdgeIt e(_graph, n); e != INVALID; ++e)
275 _valid_supply = sum == 0;
278 /// \brief General constructor (without lower bounds).
280 /// General constructor (without lower bounds).
282 /// \param graph The directed graph the algorithm runs on.
283 /// \param capacity The capacities (upper bounds) of the edges.
284 /// \param cost The cost (length) values of the edges.
285 /// \param supply The supply values of the nodes (signed).
286 CapacityScaling( const Graph &graph,
287 const CapacityMap &capacity,
289 const SupplyMap &supply ) :
290 _graph(graph), _lower(NULL), _capacity(capacity), _cost(cost),
291 _supply(supply), _flow(0), _local_flow(false),
292 _potential(0), _local_potential(false),
293 _res_cap(capacity), _excess(graph), _pred(graph)
295 // Checking the sum of supply values
297 for (NodeIt n(_graph); n != INVALID; ++n) sum += _supply[n];
298 _valid_supply = sum == 0;
301 /// \brief Simple constructor (with lower bounds).
303 /// Simple constructor (with lower bounds).
305 /// \param graph The directed graph the algorithm runs on.
306 /// \param lower The lower bounds of the edges.
307 /// \param capacity The capacities (upper bounds) of the edges.
308 /// \param cost The cost (length) values of the edges.
309 /// \param s The source node.
310 /// \param t The target node.
311 /// \param flow_value The required amount of flow from node \c s
312 /// to node \c t (i.e. the supply of \c s and the demand of \c t).
313 CapacityScaling( const Graph &graph,
314 const LowerMap &lower,
315 const CapacityMap &capacity,
318 Supply flow_value ) :
319 _graph(graph), _lower(&lower), _capacity(graph), _cost(cost),
320 _supply(graph), _flow(0), _local_flow(false),
321 _potential(0), _local_potential(false),
322 _res_cap(graph), _excess(graph), _pred(graph)
324 // Removing non-zero lower bounds
325 _capacity = subMap(capacity, lower);
326 _res_cap = _capacity;
327 for (NodeIt n(_graph); n != INVALID; ++n) {
329 if (n == s) sum = flow_value;
330 if (n == t) sum = -flow_value;
331 for (InEdgeIt e(_graph, n); e != INVALID; ++e)
333 for (OutEdgeIt e(_graph, n); e != INVALID; ++e)
337 _valid_supply = true;
340 /// \brief Simple constructor (without lower bounds).
342 /// Simple constructor (without lower bounds).
344 /// \param graph The directed graph the algorithm runs on.
345 /// \param capacity The capacities (upper bounds) of the edges.
346 /// \param cost The cost (length) values of the edges.
347 /// \param s The source node.
348 /// \param t The target node.
349 /// \param flow_value The required amount of flow from node \c s
350 /// to node \c t (i.e. the supply of \c s and the demand of \c t).
351 CapacityScaling( const Graph &graph,
352 const CapacityMap &capacity,
355 Supply flow_value ) :
356 _graph(graph), _lower(NULL), _capacity(capacity), _cost(cost),
357 _supply(graph, 0), _flow(0), _local_flow(false),
358 _potential(0), _local_potential(false),
359 _res_cap(capacity), _excess(graph), _pred(graph)
361 _supply[s] = flow_value;
362 _supply[t] = -flow_value;
363 _valid_supply = true;
368 if (_local_flow) delete _flow;
369 if (_local_potential) delete _potential;
373 /// \brief Set the flow map.
375 /// Set the flow map.
377 /// \return \c (*this)
378 CapacityScaling& flowMap(FlowMap &map) {
387 /// \brief Set the potential map.
389 /// Set the potential map.
391 /// \return \c (*this)
392 CapacityScaling& potentialMap(PotentialMap &map) {
393 if (_local_potential) {
395 _local_potential = false;
401 /// \name Execution control
405 /// \brief Run the algorithm.
407 /// This function runs the algorithm.
409 /// \param scaling Enable or disable capacity scaling.
410 /// If the maximum edge capacity and/or the amount of total supply
411 /// is rather small, the algorithm could be slightly faster without
414 /// \return \c true if a feasible flow can be found.
415 bool run(bool scaling = true) {
416 return init(scaling) && start();
421 /// \name Query Functions
422 /// The results of the algorithm can be obtained using these
424 /// \ref lemon::CapacityScaling::run() "run()" must be called before
429 /// \brief Return a const reference to the edge map storing the
432 /// Return a const reference to the edge map storing the found flow.
434 /// \pre \ref run() must be called before using this function.
435 const FlowMap& flowMap() const {
439 /// \brief Return a const reference to the node map storing the
440 /// found potentials (the dual solution).
442 /// Return a const reference to the node map storing the found
443 /// potentials (the dual solution).
445 /// \pre \ref run() must be called before using this function.
446 const PotentialMap& potentialMap() const {
450 /// \brief Return the flow on the given edge.
452 /// Return the flow on the given edge.
454 /// \pre \ref run() must be called before using this function.
455 Capacity flow(const Edge& edge) const {
456 return (*_flow)[edge];
459 /// \brief Return the potential of the given node.
461 /// Return the potential of the given node.
463 /// \pre \ref run() must be called before using this function.
464 Cost potential(const Node& node) const {
465 return (*_potential)[node];
468 /// \brief Return the total cost of the found flow.
470 /// Return the total cost of the found flow. The complexity of the
471 /// function is \f$ O(e) \f$.
473 /// \pre \ref run() must be called before using this function.
474 Cost totalCost() const {
476 for (EdgeIt e(_graph); e != INVALID; ++e)
477 c += (*_flow)[e] * _cost[e];
485 /// Initialize the algorithm.
486 bool init(bool scaling) {
487 if (!_valid_supply) return false;
491 _flow = new FlowMap(_graph);
495 _potential = new PotentialMap(_graph);
496 _local_potential = true;
498 for (EdgeIt e(_graph); e != INVALID; ++e) (*_flow)[e] = 0;
499 for (NodeIt n(_graph); n != INVALID; ++n) (*_potential)[n] = 0;
502 _dijkstra = new ResidualDijkstra( _graph, *_flow, _res_cap, _cost,
503 _excess, *_potential, _pred );
505 // Initializing delta value
508 Supply max_sup = 0, max_dem = 0;
509 for (NodeIt n(_graph); n != INVALID; ++n) {
510 if ( _supply[n] > max_sup) max_sup = _supply[n];
511 if (-_supply[n] > max_dem) max_dem = -_supply[n];
513 Capacity max_cap = 0;
514 for (EdgeIt e(_graph); e != INVALID; ++e) {
515 if (_capacity[e] > max_cap) max_cap = _capacity[e];
517 max_sup = std::min(std::min(max_sup, max_dem), max_cap);
519 for (_delta = 1; 2 * _delta <= max_sup; _delta *= 2)
531 return startWithScaling();
533 return startWithoutScaling();
536 /// Execute the capacity scaling algorithm.
537 bool startWithScaling() {
538 // Processing capacity scaling phases
543 // Saturating all edges not satisfying the optimality condition
544 for (EdgeIt e(_graph); e != INVALID; ++e) {
545 Node u = _graph.source(e), v = _graph.target(e);
546 Cost c = _cost[e] + (*_potential)[u] - (*_potential)[v];
547 if (c < 0 && _res_cap[e] >= _delta) {
548 _excess[u] -= _res_cap[e];
549 _excess[v] += _res_cap[e];
550 (*_flow)[e] = _capacity[e];
553 else if (c > 0 && (*_flow)[e] >= _delta) {
554 _excess[u] += (*_flow)[e];
555 _excess[v] -= (*_flow)[e];
557 _res_cap[e] = _capacity[e];
561 // Finding excess nodes and deficit nodes
562 _excess_nodes.clear();
563 _deficit_nodes.clear();
564 for (NodeIt n(_graph); n != INVALID; ++n) {
565 if (_excess[n] >= _delta) _excess_nodes.push_back(n);
566 if (_excess[n] <= -_delta) _deficit_nodes.push_back(n);
568 int next_node = 0, next_def_node = 0;
570 // Finding augmenting shortest paths
571 while (next_node < int(_excess_nodes.size())) {
572 // Checking deficit nodes
574 bool delta_deficit = false;
575 for ( ; next_def_node < int(_deficit_nodes.size());
577 if (_excess[_deficit_nodes[next_def_node]] <= -_delta) {
578 delta_deficit = true;
582 if (!delta_deficit) break;
586 s = _excess_nodes[next_node];
587 if ((t = _dijkstra->run(s, _delta)) == INVALID) {
595 // Augmenting along a shortest path from s to t.
596 Capacity d = std::min(_excess[s], -_excess[t]);
600 while ((e = _pred[u]) != INVALID) {
602 if (u == _graph.target(e)) {
604 u = _graph.source(e);
607 u = _graph.target(e);
613 while ((e = _pred[u]) != INVALID) {
614 if (u == _graph.target(e)) {
617 u = _graph.source(e);
621 u = _graph.target(e);
627 if (_excess[s] < _delta) ++next_node;
630 if (_delta == 1) break;
631 if (++phase_cnt > _phase_num / 4) factor = 2;
632 _delta = _delta <= factor ? 1 : _delta / factor;
635 // Handling non-zero lower bounds
637 for (EdgeIt e(_graph); e != INVALID; ++e)
638 (*_flow)[e] += (*_lower)[e];
643 /// Execute the successive shortest path algorithm.
644 bool startWithoutScaling() {
645 // Finding excess nodes
646 for (NodeIt n(_graph); n != INVALID; ++n)
647 if (_excess[n] > 0) _excess_nodes.push_back(n);
648 if (_excess_nodes.size() == 0) return true;
651 // Finding shortest paths
653 while ( _excess[_excess_nodes[next_node]] > 0 ||
654 ++next_node < int(_excess_nodes.size()) )
657 s = _excess_nodes[next_node];
658 if ((t = _dijkstra->run(s)) == INVALID) return false;
660 // Augmenting along a shortest path from s to t
661 Capacity d = std::min(_excess[s], -_excess[t]);
665 while ((e = _pred[u]) != INVALID) {
667 if (u == _graph.target(e)) {
669 u = _graph.source(e);
672 u = _graph.target(e);
678 while ((e = _pred[u]) != INVALID) {
679 if (u == _graph.target(e)) {
682 u = _graph.source(e);
686 u = _graph.target(e);
693 // Handling non-zero lower bounds
695 for (EdgeIt e(_graph); e != INVALID; ++e)
696 (*_flow)[e] += (*_lower)[e];
701 }; //class CapacityScaling
707 #endif //LEMON_CAPACITY_SCALING_H