67 lines
2.2 KiB
C++
67 lines
2.2 KiB
C++
//=======================================================================
|
|
// Copyright 2013 University of Warsaw.
|
|
// Authors: Piotr Wygocki
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0. (See
|
|
// accompanying file LICENSE_1_0.txt or copy at
|
|
// http://www.boost.org/LICENSE_1_0.txt)
|
|
//=======================================================================
|
|
|
|
#ifndef BOOST_GRAPH_AUGMENT_HPP
|
|
#define BOOST_GRAPH_AUGMENT_HPP
|
|
|
|
#include <boost/graph/filtered_graph.hpp>
|
|
|
|
namespace boost
|
|
{
|
|
namespace detail
|
|
{
|
|
|
|
template < class Graph, class ResCapMap >
|
|
filtered_graph< const Graph, is_residual_edge< ResCapMap > > residual_graph(
|
|
const Graph& g, ResCapMap residual_capacity)
|
|
{
|
|
return filtered_graph< const Graph, is_residual_edge< ResCapMap > >(
|
|
g, is_residual_edge< ResCapMap >(residual_capacity));
|
|
}
|
|
|
|
template < class Graph, class PredEdgeMap, class ResCapMap,
|
|
class RevEdgeMap >
|
|
inline void augment(const Graph& g,
|
|
typename graph_traits< Graph >::vertex_descriptor src,
|
|
typename graph_traits< Graph >::vertex_descriptor sink, PredEdgeMap p,
|
|
ResCapMap residual_capacity, RevEdgeMap reverse_edge)
|
|
{
|
|
typename graph_traits< Graph >::edge_descriptor e;
|
|
typename graph_traits< Graph >::vertex_descriptor u;
|
|
typedef typename property_traits< ResCapMap >::value_type FlowValue;
|
|
|
|
// find minimum residual capacity along the augmenting path
|
|
FlowValue delta = (std::numeric_limits< FlowValue >::max)();
|
|
e = get(p, sink);
|
|
do
|
|
{
|
|
BOOST_USING_STD_MIN();
|
|
delta = min BOOST_PREVENT_MACRO_SUBSTITUTION(
|
|
delta, get(residual_capacity, e));
|
|
u = source(e, g);
|
|
e = get(p, u);
|
|
} while (u != src);
|
|
|
|
// push delta units of flow along the augmenting path
|
|
e = get(p, sink);
|
|
do
|
|
{
|
|
put(residual_capacity, e, get(residual_capacity, e) - delta);
|
|
put(residual_capacity, get(reverse_edge, e),
|
|
get(residual_capacity, get(reverse_edge, e)) + delta);
|
|
u = source(e, g);
|
|
e = get(p, u);
|
|
} while (u != src);
|
|
}
|
|
|
|
} // namespace detail
|
|
} // namespace boost
|
|
|
|
#endif /* BOOST_GRAPH_AUGMENT_HPP */
|