eccentricity.hpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // (C) Copyright 2007-2009 Andrew Sutton
  2. //
  3. // Use, modification and distribution are subject to the
  4. // Boost Software License, Version 1.0 (See accompanying file
  5. // LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  6. #ifndef BOOST_GRAPH_ECCENTRICITY_HPP
  7. #define BOOST_GRAPH_ECCENTRICITY_HPP
  8. #include <boost/utility.hpp>
  9. #include <boost/config.hpp>
  10. #include <boost/graph/detail/geodesic.hpp>
  11. namespace boost
  12. {
  13. template <typename Graph,
  14. typename DistanceMap,
  15. typename Combinator>
  16. inline typename property_traits<DistanceMap>::value_type
  17. eccentricity(const Graph& g, DistanceMap dist, Combinator combine)
  18. {
  19. function_requires< GraphConcept<Graph> >();
  20. typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
  21. function_requires< ReadablePropertyMapConcept<DistanceMap,Vertex> >();
  22. typedef typename property_traits<DistanceMap>::value_type Distance;
  23. return detail::combine_distances(g, dist, combine, Distance(0));
  24. }
  25. template <typename Graph, typename DistanceMap>
  26. inline typename property_traits<DistanceMap>::value_type
  27. eccentricity(const Graph& g, DistanceMap dist)
  28. {
  29. function_requires< GraphConcept<Graph> >();
  30. typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
  31. function_requires< ReadablePropertyMapConcept<DistanceMap,Vertex> >();
  32. typedef typename property_traits<DistanceMap>::value_type Distance;
  33. return eccentricity(g, dist, detail::maximize<Distance>());
  34. }
  35. template <typename Graph, typename DistanceMatrix, typename EccentricityMap>
  36. inline std::pair<typename property_traits<EccentricityMap>::value_type,
  37. typename property_traits<EccentricityMap>::value_type>
  38. all_eccentricities(const Graph& g, const DistanceMatrix& dist, EccentricityMap ecc)
  39. {
  40. function_requires< VertexListGraphConcept<Graph> >();
  41. typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
  42. typedef typename graph_traits<Graph>::vertex_iterator VertexIterator;
  43. function_requires< ReadablePropertyMapConcept<DistanceMatrix,Vertex> >();
  44. typedef typename property_traits<DistanceMatrix>::value_type DistanceMap;
  45. function_requires< WritablePropertyMapConcept<EccentricityMap,Vertex> >();
  46. typedef typename property_traits<EccentricityMap>::value_type Eccentricity;
  47. BOOST_USING_STD_MIN();
  48. BOOST_USING_STD_MAX();
  49. Eccentricity
  50. r = numeric_values<Eccentricity>::infinity(),
  51. d = numeric_values<Eccentricity>::zero();
  52. VertexIterator i, end;
  53. boost::tie(i, end) = vertices(g);
  54. for(boost::tie(i, end) = vertices(g); i != end; ++i) {
  55. DistanceMap dm = get(dist, *i);
  56. Eccentricity e = eccentricity(g, dm);
  57. put(ecc, *i, e);
  58. // track the radius and diameter at the same time
  59. r = min BOOST_PREVENT_MACRO_SUBSTITUTION (r, e);
  60. d = max BOOST_PREVENT_MACRO_SUBSTITUTION (d, e);
  61. }
  62. return std::make_pair(r, d);
  63. }
  64. template <typename Graph, typename EccentricityMap>
  65. inline std::pair<typename property_traits<EccentricityMap>::value_type,
  66. typename property_traits<EccentricityMap>::value_type>
  67. radius_and_diameter(const Graph& g, EccentricityMap ecc)
  68. {
  69. function_requires< VertexListGraphConcept<Graph> >();
  70. typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
  71. typedef typename graph_traits<Graph>::vertex_iterator VertexIterator;
  72. function_requires< ReadablePropertyMapConcept<EccentricityMap, Vertex> >();
  73. typedef typename property_traits<EccentricityMap>::value_type Eccentricity;
  74. BOOST_USING_STD_MIN();
  75. BOOST_USING_STD_MAX();
  76. VertexIterator i, end;
  77. boost::tie(i, end) = vertices(g);
  78. Eccentricity radius = get(ecc, *i);
  79. Eccentricity diameter = get(ecc, *i);
  80. for(i = boost::next(i); i != end; ++i) {
  81. Eccentricity cur = get(ecc, *i);
  82. radius = min BOOST_PREVENT_MACRO_SUBSTITUTION (radius, cur);
  83. diameter = max BOOST_PREVENT_MACRO_SUBSTITUTION (diameter, cur);
  84. }
  85. return std::make_pair(radius, diameter);
  86. }
  87. template <typename Graph, typename EccentricityMap>
  88. inline typename property_traits<EccentricityMap>::value_type
  89. radius(const Graph& g, EccentricityMap ecc)
  90. { return radius_and_diameter(g, ecc).first; }
  91. template <typename Graph, typename EccentricityMap>
  92. inline typename property_traits<EccentricityMap>::value_type
  93. diameter(const Graph& g, EccentricityMap ecc)
  94. { return radius_and_diameter(g, ecc).second; }
  95. } /* namespace boost */
  96. #endif