deba@2440
|
1 |
/* -*- C++ -*-
|
deba@2440
|
2 |
*
|
deba@2440
|
3 |
* This file is a part of LEMON, a generic C++ optimization library
|
deba@2440
|
4 |
*
|
alpar@2553
|
5 |
* Copyright (C) 2003-2008
|
deba@2440
|
6 |
* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
|
deba@2440
|
7 |
* (Egervary Research Group on Combinatorial Optimization, EGRES).
|
deba@2440
|
8 |
*
|
deba@2440
|
9 |
* Permission to use, modify and distribute this software is granted
|
deba@2440
|
10 |
* provided that this copyright notice appears in all copies. For
|
deba@2440
|
11 |
* precise terms see the accompanying LICENSE file.
|
deba@2440
|
12 |
*
|
deba@2440
|
13 |
* This software is provided "AS IS" with no warranty of any kind,
|
deba@2440
|
14 |
* express or implied, and with no claim as to its suitability for any
|
deba@2440
|
15 |
* purpose.
|
deba@2440
|
16 |
*
|
deba@2440
|
17 |
*/
|
deba@2440
|
18 |
|
deba@2440
|
19 |
#ifndef LEMON_MIN_COST_MAX_FLOW_H
|
deba@2440
|
20 |
#define LEMON_MIN_COST_MAX_FLOW_H
|
deba@2440
|
21 |
|
deba@2440
|
22 |
/// \ingroup min_cost_flow
|
deba@2440
|
23 |
///
|
deba@2440
|
24 |
/// \file
|
kpeter@2556
|
25 |
/// \brief An efficient algorithm for finding a minimum cost maximum flow.
|
deba@2440
|
26 |
|
deba@2440
|
27 |
#include <lemon/preflow.h>
|
deba@2440
|
28 |
#include <lemon/network_simplex.h>
|
deba@2440
|
29 |
#include <lemon/maps.h>
|
deba@2440
|
30 |
|
deba@2440
|
31 |
namespace lemon {
|
deba@2440
|
32 |
|
deba@2440
|
33 |
/// \addtogroup min_cost_flow
|
deba@2440
|
34 |
/// @{
|
deba@2440
|
35 |
|
kpeter@2556
|
36 |
/// \brief An efficient algorithm for finding a minimum cost
|
kpeter@2556
|
37 |
/// maximum flow.
|
deba@2440
|
38 |
///
|
kpeter@2556
|
39 |
/// \ref MinCostMaxFlow implements an efficient algorithm for
|
kpeter@2556
|
40 |
/// finding a maximum flow having minimal total cost from a given
|
kpeter@2556
|
41 |
/// source node to a given target node in a directed graph.
|
deba@2440
|
42 |
///
|
kpeter@2576
|
43 |
/// \ref MinCostMaxFlow uses \ref Preflow for finding the maximum
|
kpeter@2576
|
44 |
/// flow value and \ref NetworkSimplex for finding a minimum cost
|
kpeter@2576
|
45 |
/// flow of that value.
|
kpeter@2576
|
46 |
/// According to our benchmark tests \ref Preflow is generally the
|
kpeter@2576
|
47 |
/// most efficient algorithm for the maximum flow problem and
|
kpeter@2576
|
48 |
/// \ref NetworkSimplex is the most efficient for the minimum cost
|
kpeter@2576
|
49 |
/// flow problem in LEMON.
|
deba@2440
|
50 |
///
|
kpeter@2576
|
51 |
/// \tparam Graph The directed graph type the algorithm runs on.
|
kpeter@2576
|
52 |
/// \tparam CapacityMap The type of the capacity (upper bound) map.
|
kpeter@2576
|
53 |
/// \tparam CostMap The type of the cost (length) map.
|
deba@2440
|
54 |
///
|
deba@2440
|
55 |
/// \warning
|
kpeter@2576
|
56 |
/// - Edge capacities and costs should be \e non-negative \e integers.
|
kpeter@2576
|
57 |
/// - \c CapacityMap::Value must be convertible to \c CostMap::Value.
|
kpeter@2582
|
58 |
/// - \c CostMap::Value must be signed type.
|
deba@2440
|
59 |
///
|
deba@2440
|
60 |
/// \author Peter Kovacs
|
deba@2440
|
61 |
|
kpeter@2533
|
62 |
template < typename Graph,
|
kpeter@2556
|
63 |
typename CapacityMap = typename Graph::template EdgeMap<int>,
|
kpeter@2556
|
64 |
typename CostMap = typename Graph::template EdgeMap<int> >
|
deba@2440
|
65 |
class MinCostMaxFlow
|
deba@2440
|
66 |
{
|
deba@2440
|
67 |
typedef typename Graph::Node Node;
|
deba@2440
|
68 |
typedef typename Graph::Edge Edge;
|
deba@2440
|
69 |
|
deba@2440
|
70 |
typedef typename CapacityMap::Value Capacity;
|
kpeter@2556
|
71 |
typedef typename CostMap::Value Cost;
|
kpeter@2576
|
72 |
typedef typename Graph::template NodeMap<Cost> SupplyMap;
|
kpeter@2576
|
73 |
|
kpeter@2576
|
74 |
typedef Preflow<Graph, CapacityMap> MaxFlowImpl;
|
deba@2440
|
75 |
typedef NetworkSimplex< Graph, CapacityMap, CapacityMap,
|
kpeter@2576
|
76 |
CostMap, SupplyMap > MinCostFlowImpl;
|
deba@2440
|
77 |
|
deba@2440
|
78 |
public:
|
deba@2440
|
79 |
|
kpeter@2556
|
80 |
/// The type of the flow map.
|
deba@2440
|
81 |
typedef typename Graph::template EdgeMap<Capacity> FlowMap;
|
kpeter@2576
|
82 |
/// The type of the potential map.
|
kpeter@2576
|
83 |
typedef typename Graph::template NodeMap<Cost> PotentialMap;
|
deba@2440
|
84 |
|
deba@2440
|
85 |
private:
|
deba@2440
|
86 |
|
kpeter@2576
|
87 |
// The directed graph the algorithm runs on
|
kpeter@2576
|
88 |
const Graph &_graph;
|
kpeter@2576
|
89 |
// The modified capacity map
|
kpeter@2576
|
90 |
const CapacityMap &_capacity;
|
kpeter@2576
|
91 |
// The cost map
|
kpeter@2576
|
92 |
const CostMap &_cost;
|
deba@2440
|
93 |
|
kpeter@2576
|
94 |
// Edge map of the found flow
|
kpeter@2576
|
95 |
FlowMap _flow;
|
kpeter@2576
|
96 |
// Node map of the found potentials
|
kpeter@2576
|
97 |
PotentialMap _potential;
|
kpeter@2576
|
98 |
|
kpeter@2576
|
99 |
// The source node
|
kpeter@2576
|
100 |
Node _source;
|
kpeter@2576
|
101 |
// The target node
|
kpeter@2576
|
102 |
Node _target;
|
deba@2440
|
103 |
|
deba@2440
|
104 |
public:
|
deba@2440
|
105 |
|
deba@2440
|
106 |
/// \brief The constructor of the class.
|
deba@2440
|
107 |
///
|
deba@2440
|
108 |
/// The constructor of the class.
|
deba@2440
|
109 |
///
|
deba@2440
|
110 |
/// \param _graph The directed graph the algorithm runs on.
|
deba@2440
|
111 |
/// \param _capacity The capacities (upper bounds) of the edges.
|
deba@2440
|
112 |
/// \param _cost The cost (length) values of the edges.
|
deba@2440
|
113 |
/// \param _s The source node.
|
deba@2440
|
114 |
/// \param _t The target node.
|
kpeter@2576
|
115 |
MinCostMaxFlow( const Graph &graph,
|
kpeter@2576
|
116 |
const CapacityMap &capacity,
|
kpeter@2576
|
117 |
const CostMap &cost,
|
kpeter@2576
|
118 |
Node s, Node t ) :
|
kpeter@2576
|
119 |
_graph(graph), _capacity(capacity), _cost(cost), _flow(graph),
|
kpeter@2576
|
120 |
_potential(graph), _source(s), _target(t)
|
deba@2440
|
121 |
{}
|
deba@2440
|
122 |
|
kpeter@2576
|
123 |
/// \brief Runs the algorithm.
|
deba@2440
|
124 |
///
|
kpeter@2576
|
125 |
/// Runs the algorithm.
|
kpeter@2576
|
126 |
void run() {
|
kpeter@2576
|
127 |
MaxFlowImpl preflow(_graph, _capacity, _source, _target);
|
kpeter@2576
|
128 |
preflow.flowMap(_flow).runMinCut();
|
kpeter@2576
|
129 |
MinCostFlowImpl mcf( _graph, _capacity, _cost,
|
kpeter@2576
|
130 |
_source, _target, preflow.flowValue() );
|
kpeter@2582
|
131 |
mcf.flowMap(_flow).potentialMap(_potential).run();
|
kpeter@2576
|
132 |
}
|
kpeter@2576
|
133 |
|
kpeter@2576
|
134 |
/// \brief Returns a const reference to the edge map storing the
|
kpeter@2576
|
135 |
/// found flow.
|
kpeter@2576
|
136 |
///
|
kpeter@2576
|
137 |
/// Returns a const reference to the edge map storing the found flow.
|
deba@2440
|
138 |
///
|
deba@2440
|
139 |
/// \pre \ref run() must be called before using this function.
|
deba@2440
|
140 |
const FlowMap& flowMap() const {
|
kpeter@2579
|
141 |
return _flow;
|
kpeter@2576
|
142 |
}
|
kpeter@2576
|
143 |
|
kpeter@2576
|
144 |
/// \brief Returns a const reference to the node map storing the
|
kpeter@2576
|
145 |
/// found potentials (the dual solution).
|
kpeter@2576
|
146 |
///
|
kpeter@2576
|
147 |
/// Returns a const reference to the node map storing the found
|
kpeter@2576
|
148 |
/// potentials (the dual solution).
|
kpeter@2576
|
149 |
///
|
kpeter@2576
|
150 |
/// \pre \ref run() must be called before using this function.
|
kpeter@2576
|
151 |
const PotentialMap& potentialMap() const {
|
kpeter@2579
|
152 |
return _potential;
|
deba@2440
|
153 |
}
|
deba@2440
|
154 |
|
deba@2440
|
155 |
/// \brief Returns the total cost of the found flow.
|
deba@2440
|
156 |
///
|
deba@2440
|
157 |
/// Returns the total cost of the found flow. The complexity of the
|
deba@2440
|
158 |
/// function is \f$ O(e) \f$.
|
deba@2440
|
159 |
///
|
deba@2440
|
160 |
/// \pre \ref run() must be called before using this function.
|
deba@2440
|
161 |
Cost totalCost() const {
|
deba@2440
|
162 |
Cost c = 0;
|
kpeter@2579
|
163 |
for (typename Graph::EdgeIt e(_graph); e != INVALID; ++e)
|
kpeter@2576
|
164 |
c += _flow[e] * _cost[e];
|
deba@2440
|
165 |
return c;
|
deba@2440
|
166 |
}
|
deba@2440
|
167 |
|
deba@2440
|
168 |
}; //class MinCostMaxFlow
|
deba@2440
|
169 |
|
deba@2440
|
170 |
///@}
|
deba@2440
|
171 |
|
deba@2440
|
172 |
} //namespace lemon
|
deba@2440
|
173 |
|
deba@2440
|
174 |
#endif //LEMON_MIN_COST_MAX_FLOW_H
|