| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 | // (C) Copyright 2007-2009 Andrew Sutton//// Use, modification and distribution are subject to the// Boost Software License, Version 1.0 (See accompanying file// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)#ifndef BOOST_GRAPH_ECCENTRICITY_HPP#define BOOST_GRAPH_ECCENTRICITY_HPP#include <boost/next_prior.hpp>#include <boost/config.hpp>#include <boost/graph/detail/geodesic.hpp>#include <boost/concept/assert.hpp>namespace boost{template < typename Graph, typename DistanceMap, typename Combinator >inline typename property_traits< DistanceMap >::value_type eccentricity(    const Graph& g, DistanceMap dist, Combinator combine){    BOOST_CONCEPT_ASSERT((GraphConcept< Graph >));    typedef typename graph_traits< Graph >::vertex_descriptor Vertex;    BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept< DistanceMap, Vertex >));    typedef typename property_traits< DistanceMap >::value_type Distance;    return detail::combine_distances(g, dist, combine, Distance(0));}template < typename Graph, typename DistanceMap >inline typename property_traits< DistanceMap >::value_type eccentricity(    const Graph& g, DistanceMap dist){    BOOST_CONCEPT_ASSERT((GraphConcept< Graph >));    typedef typename graph_traits< Graph >::vertex_descriptor Vertex;    BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept< DistanceMap, Vertex >));    typedef typename property_traits< DistanceMap >::value_type Distance;    return eccentricity(g, dist, detail::maximize< Distance >());}template < typename Graph, typename DistanceMatrix, typename EccentricityMap >inline std::pair< typename property_traits< EccentricityMap >::value_type,    typename property_traits< EccentricityMap >::value_type >all_eccentricities(    const Graph& g, const DistanceMatrix& dist, EccentricityMap ecc){    BOOST_CONCEPT_ASSERT((VertexListGraphConcept< Graph >));    typedef typename graph_traits< Graph >::vertex_descriptor Vertex;    typedef typename graph_traits< Graph >::vertex_iterator VertexIterator;    BOOST_CONCEPT_ASSERT(        (ReadablePropertyMapConcept< DistanceMatrix, Vertex >));    typedef typename property_traits< DistanceMatrix >::value_type DistanceMap;    BOOST_CONCEPT_ASSERT(        (WritablePropertyMapConcept< EccentricityMap, Vertex >));    typedef        typename property_traits< EccentricityMap >::value_type Eccentricity;    BOOST_USING_STD_MIN();    BOOST_USING_STD_MAX();    Eccentricity r = numeric_values< Eccentricity >::infinity(),                 d = numeric_values< Eccentricity >::zero();    VertexIterator i, end;    boost::tie(i, end) = vertices(g);    for (boost::tie(i, end) = vertices(g); i != end; ++i)    {        DistanceMap dm = get(dist, *i);        Eccentricity e = eccentricity(g, dm);        put(ecc, *i, e);        // track the radius and diameter at the same time        r = min BOOST_PREVENT_MACRO_SUBSTITUTION(r, e);        d = max BOOST_PREVENT_MACRO_SUBSTITUTION(d, e);    }    return std::make_pair(r, d);}template < typename Graph, typename EccentricityMap >inline std::pair< typename property_traits< EccentricityMap >::value_type,    typename property_traits< EccentricityMap >::value_type >radius_and_diameter(const Graph& g, EccentricityMap ecc){    BOOST_CONCEPT_ASSERT((VertexListGraphConcept< Graph >));    typedef typename graph_traits< Graph >::vertex_descriptor Vertex;    typedef typename graph_traits< Graph >::vertex_iterator VertexIterator;    BOOST_CONCEPT_ASSERT(        (ReadablePropertyMapConcept< EccentricityMap, Vertex >));    typedef        typename property_traits< EccentricityMap >::value_type Eccentricity;    BOOST_USING_STD_MIN();    BOOST_USING_STD_MAX();    VertexIterator i, end;    boost::tie(i, end) = vertices(g);    Eccentricity radius = get(ecc, *i);    Eccentricity diameter = get(ecc, *i);    for (i = boost::next(i); i != end; ++i)    {        Eccentricity cur = get(ecc, *i);        radius = min BOOST_PREVENT_MACRO_SUBSTITUTION(radius, cur);        diameter = max BOOST_PREVENT_MACRO_SUBSTITUTION(diameter, cur);    }    return std::make_pair(radius, diameter);}template < typename Graph, typename EccentricityMap >inline typename property_traits< EccentricityMap >::value_type radius(    const Graph& g, EccentricityMap ecc){    return radius_and_diameter(g, ecc).first;}template < typename Graph, typename EccentricityMap >inline typename property_traits< EccentricityMap >::value_type diameter(    const Graph& g, EccentricityMap ecc){    return radius_and_diameter(g, ecc).second;}} /* namespace boost */#endif
 |