Chris@16
|
1 //=======================================================================
|
Chris@16
|
2 // Copyright 2013 University of Warsaw.
|
Chris@16
|
3 // Authors: Piotr Wygocki
|
Chris@16
|
4 //
|
Chris@16
|
5 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
6 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
7 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
8 //=======================================================================
|
Chris@16
|
9
|
Chris@16
|
10 #ifndef BOOST_GRAPH_AUGMENT_HPP
|
Chris@16
|
11 #define BOOST_GRAPH_AUGMENT_HPP
|
Chris@16
|
12
|
Chris@16
|
13 #include <boost/graph/filtered_graph.hpp>
|
Chris@16
|
14
|
Chris@16
|
15 namespace boost {
|
Chris@16
|
16 namespace detail {
|
Chris@16
|
17
|
Chris@16
|
18 template <class Graph, class ResCapMap>
|
Chris@16
|
19 filtered_graph<const Graph, is_residual_edge<ResCapMap> >
|
Chris@16
|
20 residual_graph(const Graph& g, ResCapMap residual_capacity) {
|
Chris@16
|
21 return filtered_graph<const Graph, is_residual_edge<ResCapMap> >
|
Chris@16
|
22 (g, is_residual_edge<ResCapMap>(residual_capacity));
|
Chris@16
|
23 }
|
Chris@16
|
24
|
Chris@16
|
25 template <class Graph, class PredEdgeMap, class ResCapMap,
|
Chris@16
|
26 class RevEdgeMap>
|
Chris@16
|
27 inline void
|
Chris@16
|
28 augment(const Graph& g,
|
Chris@16
|
29 typename graph_traits<Graph>::vertex_descriptor src,
|
Chris@16
|
30 typename graph_traits<Graph>::vertex_descriptor sink,
|
Chris@16
|
31 PredEdgeMap p,
|
Chris@16
|
32 ResCapMap residual_capacity,
|
Chris@16
|
33 RevEdgeMap reverse_edge)
|
Chris@16
|
34 {
|
Chris@16
|
35 typename graph_traits<Graph>::edge_descriptor e;
|
Chris@16
|
36 typename graph_traits<Graph>::vertex_descriptor u;
|
Chris@16
|
37 typedef typename property_traits<ResCapMap>::value_type FlowValue;
|
Chris@16
|
38
|
Chris@16
|
39 // find minimum residual capacity along the augmenting path
|
Chris@16
|
40 FlowValue delta = (std::numeric_limits<FlowValue>::max)();
|
Chris@16
|
41 e = get(p, sink);
|
Chris@16
|
42 do {
|
Chris@16
|
43 BOOST_USING_STD_MIN();
|
Chris@16
|
44 delta = min BOOST_PREVENT_MACRO_SUBSTITUTION(delta, get(residual_capacity, e));
|
Chris@16
|
45 u = source(e, g);
|
Chris@16
|
46 e = get(p, u);
|
Chris@16
|
47 } while (u != src);
|
Chris@16
|
48
|
Chris@16
|
49 // push delta units of flow along the augmenting path
|
Chris@16
|
50 e = get(p, sink);
|
Chris@16
|
51 do {
|
Chris@16
|
52 put(residual_capacity, e, get(residual_capacity, e) - delta);
|
Chris@16
|
53 put(residual_capacity, get(reverse_edge, e), get(residual_capacity, get(reverse_edge, e)) + delta);
|
Chris@16
|
54 u = source(e, g);
|
Chris@16
|
55 e = get(p, u);
|
Chris@16
|
56 } while (u != src);
|
Chris@16
|
57 }
|
Chris@16
|
58
|
Chris@16
|
59 } // namespace detail
|
Chris@16
|
60 } //namespace boost
|
Chris@16
|
61
|
Chris@16
|
62 #endif /* BOOST_GRAPH_AUGMENT_HPP */
|
Chris@16
|
63
|