Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/boost/graph/relax.hpp @ 33

Last change on this file since 33 was 29, checked in by landauf, 17 years ago

updated boost from 1_33_1 to 1_34_1

File size: 2.7 KB
Line 
1//=======================================================================
2// Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
3// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek,
4//
5// Distributed under the Boost Software License, Version 1.0. (See
6// accompanying file LICENSE_1_0.txt or copy at
7// http://www.boost.org/LICENSE_1_0.txt)
8//=======================================================================
9#ifndef BOOST_GRAPH_RELAX_HPP
10#define BOOST_GRAPH_RELAX_HPP
11
12#include <functional>
13#include <boost/limits.hpp> // for numeric limits
14#include <boost/graph/graph_traits.hpp>
15#include <boost/property_map.hpp>
16
17namespace boost {
18
19    // The following version of the plus functor prevents
20    // problems due to overflow at positive infinity.
21
22    template <class T>
23    struct closed_plus
24    {
25      T operator()(const T& a, const T& b) const {
26        using namespace std;
27        T zero(0);
28        T result = a + b;
29        if (result < zero && a >= zero && b >= zero)
30          return (numeric_limits<T>::max)();
31        return result;
32      }
33    };
34   
35    template <class Graph, class WeightMap, 
36            class PredecessorMap, class DistanceMap, 
37            class BinaryFunction, class BinaryPredicate>
38    bool relax(typename graph_traits<Graph>::edge_descriptor e, 
39               const Graph& g, const WeightMap& w, 
40               PredecessorMap& p, DistanceMap& d, 
41               const BinaryFunction& combine, const BinaryPredicate& compare)
42    {
43      typedef typename graph_traits<Graph>::directed_category DirCat;
44      bool is_undirected = is_same<DirCat, undirected_tag>::value;
45      typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
46      Vertex u = source(e, g), v = target(e, g);
47      typedef typename property_traits<DistanceMap>::value_type D;
48      typedef typename property_traits<WeightMap>::value_type W;
49      D d_u = get(d, u), d_v = get(d, v);
50      W w_e = get(w, e);
51     
52      if ( compare(combine(d_u, w_e), d_v) ) {
53        put(d, v, combine(d_u, w_e));
54        put(p, v, u);
55        return true;
56      } else if (is_undirected && compare(combine(d_v, w_e), d_u)) {
57        put(d, u, combine(d_v, w_e));
58        put(p, u, v);
59        return true;
60      } else
61        return false;
62    }
63   
64    template <class Graph, class WeightMap, 
65      class PredecessorMap, class DistanceMap>
66    bool relax(typename graph_traits<Graph>::edge_descriptor e,
67               const Graph& g, WeightMap w, PredecessorMap p, DistanceMap d)
68    {
69      typedef typename property_traits<DistanceMap>::value_type D;
70      typedef closed_plus<D> Combine;
71      typedef std::less<D> Compare;
72      return relax(e, g, w, p, d, Combine(), Compare());
73    }
74
75} // namespace boost
76
77#endif /* BOOST_GRAPH_RELAX_HPP */
Note: See TracBrowser for help on using the repository browser.