biconnected_components.hpp

来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 112 行

HPP
112
字号
// Copyright (c) Jeremy Siek 2001//// 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)// NOTE: this final is generated by libs/graph/doc/biconnected_components.w#ifndef BOOST_GRAPH_BICONNECTED_COMPONENTS_HPP#define BOOST_GRAPH_BICONNECTED_COMPONENTS_HPP#include <stack>#include <algorithm> // for std::min and std::max#include <boost/config.hpp>#include <boost/limits.hpp>#include <boost/graph/graph_traits.hpp>#include <boost/graph/graph_concepts.hpp>#include <boost/property_map.hpp>namespace boost{  namespace detail  {    template < typename Graph, typename ComponentMap,      typename DiscoverTimeMap, typename LowPointMap, typename Stack >      void biconnect(typename graph_traits < Graph >::vertex_descriptor v,                     typename graph_traits < Graph >::vertex_descriptor u,                     bool at_top,                     const Graph & g,                     ComponentMap comp,                     std::size_t & c,                     DiscoverTimeMap d,                     std::size_t & dfs_time, LowPointMap lowpt, Stack & S)    {      BOOST_USING_STD_MIN();      typedef typename graph_traits < Graph >::vertex_descriptor vertex_t;      typedef typename property_traits < DiscoverTimeMap >::value_type D;      D infinity = (std::numeric_limits < D >::max)();        put(d, v, ++dfs_time);        put(lowpt, v, get(d, v));      typename graph_traits < Graph >::out_edge_iterator ei, ei_end;      for (tie(ei, ei_end) = out_edges(v, g); ei != ei_end; ++ei)      {        vertex_t w = target(*ei, g);        if (get(d, w) == infinity)        {          S.push(*ei);          biconnect(w, v, false, g, comp, c, d, dfs_time, lowpt, S);          put(lowpt, v, min BOOST_PREVENT_MACRO_SUBSTITUTION(get(lowpt, v), get(lowpt, w)));          if (get(lowpt, w) >= get(d, v))          {            while (d[source(S.top(), g)] >= d[w]) {              put(comp, S.top(), c);              S.pop();            }            put(comp, S.top(), c);              S.pop();            ++c;          }        } else if (get(d, w) < get(d, v) && (!at_top && w != u))        {          S.push(*ei);          put(lowpt, v, min BOOST_PREVENT_MACRO_SUBSTITUTION(get(lowpt, v), get(d, w)));        }      }    }  }  template < typename Graph, typename ComponentMap,    typename DiscoverTimeMap, typename LowPointMap >    void biconnected_components    (typename graph_traits < Graph >::vertex_descriptor v,     typename graph_traits < Graph >::vertex_descriptor u,     const Graph & g,     ComponentMap comp,     std::size_t & num_components,     DiscoverTimeMap discover_time, LowPointMap lowpt)  {    typedef typename graph_traits < Graph >::vertex_descriptor vertex_t;    typedef typename graph_traits < Graph >::edge_descriptor edge_t;    function_requires < VertexListGraphConcept < Graph > >();    function_requires < IncidenceGraphConcept < Graph > >();    function_requires < WritablePropertyMapConcept < ComponentMap,      edge_t > >();    function_requires < ReadWritePropertyMapConcept < DiscoverTimeMap,      vertex_t > >();    function_requires < ReadWritePropertyMapConcept < LowPointMap,      vertex_t > >();    typedef typename property_traits < DiscoverTimeMap >::value_type D;    num_components = 0;    std::size_t dfs_time = 0;    std::stack < edge_t > S;    typename graph_traits < Graph >::vertex_iterator wi, wi_end;    std::size_t infinity = (std::numeric_limits < std::size_t >::max)();    for (tie(wi, wi_end) = vertices(g); wi != wi_end; ++wi)      put(discover_time, *wi, infinity);    for (tie(wi, wi_end) = vertices(g); wi != wi_end; ++wi)      if (get(discover_time, *wi) == (std::numeric_limits < D >::max)())        detail::biconnect(*wi, *wi, true,                          g, comp, num_components,                          discover_time, dfs_time, lowpt, S);  }}                               // namespace boost#endif  /* BOOST_GRAPH_BICONNECTED_COMPONENTS_HPP */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?