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_MIN_COST_MAX_FLOW_H
20 #define LEMON_MIN_COST_MAX_FLOW_H
22 /// \ingroup min_cost_flow
25 /// \brief An efficient algorithm for finding a minimum cost maximum flow.
27 #include <lemon/preflow.h>
28 #include <lemon/network_simplex.h>
29 #include <lemon/maps.h>
33 /// \addtogroup min_cost_flow
36 /// \brief An efficient algorithm for finding a minimum cost
39 /// \ref MinCostMaxFlow implements an efficient algorithm for
40 /// finding a maximum flow having minimal total cost from a given
41 /// source node to a given target node in a directed graph.
43 /// \ref MinCostMaxFlow uses \ref Preflow for finding the maximum
44 /// flow value and \ref NetworkSimplex for finding a minimum cost
45 /// flow of that value.
46 /// According to our benchmark tests \ref Preflow is generally the
47 /// most efficient algorithm for the maximum flow problem and
48 /// \ref NetworkSimplex is the most efficient for the minimum cost
49 /// flow problem in LEMON.
51 /// \tparam Graph The directed graph type the algorithm runs on.
52 /// \tparam CapacityMap The type of the capacity (upper bound) map.
53 /// \tparam CostMap The type of the cost (length) map.
56 /// - Edge capacities and costs should be \e non-negative \e integers.
57 /// However \c CostMap::Value must be signed type.
58 /// - \c CapacityMap::Value must be convertible to \c CostMap::Value.
60 /// \author Peter Kovacs
62 template < typename Graph,
63 typename CapacityMap = typename Graph::template EdgeMap<int>,
64 typename CostMap = typename Graph::template EdgeMap<int> >
67 typedef typename Graph::Node Node;
68 typedef typename Graph::Edge Edge;
70 typedef typename CapacityMap::Value Capacity;
71 typedef typename CostMap::Value Cost;
72 typedef typename Graph::template NodeMap<Cost> SupplyMap;
74 typedef Preflow<Graph, CapacityMap> MaxFlowImpl;
75 typedef NetworkSimplex< Graph, CapacityMap, CapacityMap,
76 CostMap, SupplyMap > MinCostFlowImpl;
80 /// The type of the flow map.
81 typedef typename Graph::template EdgeMap<Capacity> FlowMap;
82 /// The type of the potential map.
83 typedef typename Graph::template NodeMap<Cost> PotentialMap;
87 // The directed graph the algorithm runs on
89 // The modified capacity map
90 const CapacityMap &_capacity;
94 // Edge map of the found flow
96 // Node map of the found potentials
97 PotentialMap _potential;
106 /// \brief The constructor of the class.
108 /// The constructor of the class.
110 /// \param _graph The directed graph the algorithm runs on.
111 /// \param _capacity The capacities (upper bounds) of the edges.
112 /// \param _cost The cost (length) values of the edges.
113 /// \param _s The source node.
114 /// \param _t The target node.
115 MinCostMaxFlow( const Graph &graph,
116 const CapacityMap &capacity,
119 _graph(graph), _capacity(capacity), _cost(cost), _flow(graph),
120 _potential(graph), _source(s), _target(t)
123 /// \brief Runs the algorithm.
125 /// Runs the algorithm.
127 MaxFlowImpl preflow(_graph, _capacity, _source, _target);
128 preflow.flowMap(_flow).runMinCut();
129 MinCostFlowImpl mcf( _graph, _capacity, _cost,
130 _source, _target, preflow.flowValue() );
132 _flow = mcf.flowMap();
133 _potential = mcf.potentialMap();
136 /// \brief Returns a const reference to the edge map storing the
139 /// Returns a const reference to the edge map storing the found flow.
141 /// \pre \ref run() must be called before using this function.
142 const FlowMap& flowMap() const {
146 /// \brief Returns a const reference to the node map storing the
147 /// found potentials (the dual solution).
149 /// Returns a const reference to the node map storing the found
150 /// potentials (the dual solution).
152 /// \pre \ref run() must be called before using this function.
153 const PotentialMap& potentialMap() const {
157 /// \brief Returns the total cost of the found flow.
159 /// Returns the total cost of the found flow. The complexity of the
160 /// function is \f$ O(e) \f$.
162 /// \pre \ref run() must be called before using this function.
163 Cost totalCost() const {
165 for (typename Graph::EdgeIt e(_graph); e != INVALID; ++e)
166 c += _flow[e] * _cost[e];
170 }; //class MinCostMaxFlow
176 #endif //LEMON_MIN_COST_MAX_FLOW_H