epoc32/include/stdapis/boost/graph/biconnected_components.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@2
     1
// Copyright (c) Jeremy Siek 2001
williamr@2
     2
// Copyright (c) Douglas Gregor 2004
williamr@2
     3
//
williamr@2
     4
// Distributed under the Boost Software License, Version 1.0. (See
williamr@2
     5
// accompanying file LICENSE_1_0.txt or copy at
williamr@2
     6
// http://www.boost.org/LICENSE_1_0.txt)
williamr@2
     7
williamr@2
     8
// NOTE: this final is generated by libs/graph/doc/biconnected_components.w
williamr@2
     9
williamr@2
    10
#ifndef BOOST_GRAPH_BICONNECTED_COMPONENTS_HPP
williamr@2
    11
#define BOOST_GRAPH_BICONNECTED_COMPONENTS_HPP
williamr@2
    12
williamr@2
    13
#include <stack>
williamr@2
    14
#include <vector>
williamr@2
    15
#include <algorithm> // for std::min and std::max
williamr@2
    16
#include <boost/config.hpp>
williamr@2
    17
#include <boost/limits.hpp>
williamr@2
    18
#include <boost/graph/graph_traits.hpp>
williamr@2
    19
#include <boost/graph/graph_concepts.hpp>
williamr@2
    20
#include <boost/property_map.hpp>
williamr@2
    21
#include <boost/graph/depth_first_search.hpp>
williamr@2
    22
#include <boost/graph/graph_utility.hpp>
williamr@2
    23
williamr@2
    24
namespace boost
williamr@2
    25
{
williamr@2
    26
  namespace detail
williamr@2
    27
  {
williamr@2
    28
    template<typename ComponentMap, typename DiscoverTimeMap,
williamr@2
    29
             typename LowPointMap, typename PredecessorMap,
williamr@2
    30
             typename OutputIterator, typename Stack, 
williamr@2
    31
             typename DFSVisitor>
williamr@2
    32
    struct biconnected_components_visitor : public dfs_visitor<>
williamr@2
    33
    {
williamr@2
    34
      biconnected_components_visitor
williamr@2
    35
        (ComponentMap comp, std::size_t& c, DiscoverTimeMap dtm,
williamr@2
    36
         std::size_t& dfs_time, LowPointMap lowpt, PredecessorMap pred,
williamr@2
    37
         OutputIterator out, Stack& S, DFSVisitor vis)
williamr@2
    38
          : comp(comp), c(c), dtm(dtm), dfs_time(dfs_time), lowpt(lowpt),
williamr@2
    39
            pred(pred), out(out), S(S), vis(vis) { }
williamr@2
    40
williamr@2
    41
      template <typename Vertex, typename Graph>
williamr@2
    42
      void initialize_vertex(const Vertex& u, Graph& g)
williamr@2
    43
      {
williamr@2
    44
        vis.initialize_vertex(u, g);
williamr@2
    45
      }
williamr@2
    46
williamr@2
    47
      template <typename Vertex, typename Graph>
williamr@2
    48
      void start_vertex(const Vertex& u, Graph& g)
williamr@2
    49
      {
williamr@2
    50
        put(pred, u, u);
williamr@2
    51
        vis.start_vertex(u, g);
williamr@2
    52
      }
williamr@2
    53
williamr@2
    54
      template <typename Vertex, typename Graph>
williamr@2
    55
      void discover_vertex(const Vertex& u, Graph& g)
williamr@2
    56
      {
williamr@2
    57
        put(dtm, u, ++dfs_time);
williamr@2
    58
        put(lowpt, u, get(dtm, u));
williamr@2
    59
        vis.discover_vertex(u, g);
williamr@2
    60
      }
williamr@2
    61
williamr@2
    62
      template <typename Edge, typename Graph>
williamr@2
    63
      void examine_edge(const Edge& e, Graph& g)
williamr@2
    64
      {
williamr@2
    65
        vis.examine_edge(e, g);
williamr@2
    66
      }
williamr@2
    67
williamr@2
    68
      template <typename Edge, typename Graph>
williamr@2
    69
      void tree_edge(const Edge& e, Graph& g)
williamr@2
    70
      {
williamr@2
    71
        S.push(e);
williamr@2
    72
        put(pred, target(e, g), source(e, g));
williamr@2
    73
        vis.tree_edge(e, g);
williamr@2
    74
      }
williamr@2
    75
williamr@2
    76
      template <typename Edge, typename Graph>
williamr@2
    77
      void back_edge(const Edge& e, Graph& g)
williamr@2
    78
      {
williamr@2
    79
        BOOST_USING_STD_MIN();
williamr@2
    80
williamr@2
    81
        if ( target(e, g) != get(pred, source(e, g)) ) {
williamr@2
    82
          S.push(e);
williamr@2
    83
          put(lowpt, source(e, g),
williamr@2
    84
              min BOOST_PREVENT_MACRO_SUBSTITUTION(get(lowpt, source(e, g)),
williamr@2
    85
                                                   get(dtm, target(e, g))));
williamr@2
    86
        vis.back_edge(e, g);
williamr@2
    87
      }
williamr@2
    88
      }
williamr@2
    89
williamr@2
    90
      template <typename Edge, typename Graph>
williamr@2
    91
      void forward_or_cross_edge(const Edge& e, Graph& g)
williamr@2
    92
      {
williamr@2
    93
        vis.forward_or_cross_edge(e, g);
williamr@2
    94
      }
williamr@2
    95
williamr@2
    96
      template <typename Vertex, typename Graph>
williamr@2
    97
      void finish_vertex(const Vertex& u, Graph& g)
williamr@2
    98
      {
williamr@2
    99
        BOOST_USING_STD_MIN();
williamr@2
   100
        Vertex parent = get(pred, u);
williamr@2
   101
        const std::size_t dtm_of_dubious_parent = get(dtm, parent);
williamr@2
   102
        bool is_art_point = false;
williamr@2
   103
        if ( dtm_of_dubious_parent > get(dtm, u) ) {
williamr@2
   104
          parent = get(pred, parent);
williamr@2
   105
          is_art_point = true;
williamr@2
   106
          put(pred, get(pred, u), u);
williamr@2
   107
          put(pred, u, parent);
williamr@2
   108
        }
williamr@2
   109
williamr@2
   110
        if ( parent == u ) { // at top
williamr@2
   111
          if ( get(dtm, u) + 1 == dtm_of_dubious_parent )
williamr@2
   112
            is_art_point = false;
williamr@2
   113
        } else {
williamr@2
   114
          put(lowpt, parent,
williamr@2
   115
              min BOOST_PREVENT_MACRO_SUBSTITUTION(get(lowpt, parent),
williamr@2
   116
                                                   get(lowpt, u)));
williamr@2
   117
williamr@2
   118
          if (get(lowpt, u) >= get(dtm, parent)) {
williamr@2
   119
            if ( get(dtm, parent) > get(dtm, get(pred, parent)) ) {
williamr@2
   120
              put(pred, u, get(pred, parent));
williamr@2
   121
              put(pred, parent, u);
williamr@2
   122
            }
williamr@2
   123
williamr@2
   124
            while ( get(dtm, source(S.top(), g)) >= get(dtm, u) ) {
williamr@2
   125
              put(comp, S.top(), c);
williamr@2
   126
              S.pop();
williamr@2
   127
            }
williamr@2
   128
            put(comp, S.top(), c);
williamr@2
   129
              S.pop();
williamr@2
   130
            ++c;
williamr@2
   131
            if ( S.empty() ) {
williamr@2
   132
              put(pred, u, parent);
williamr@2
   133
              put(pred, parent, u);
williamr@2
   134
            }
williamr@2
   135
          }
williamr@2
   136
        }
williamr@2
   137
        if ( is_art_point )
williamr@2
   138
          *out++ = u;
williamr@2
   139
        vis.finish_vertex(u, g);
williamr@2
   140
      }
williamr@2
   141
williamr@2
   142
      ComponentMap comp;
williamr@2
   143
      std::size_t& c;
williamr@2
   144
      DiscoverTimeMap dtm;
williamr@2
   145
      std::size_t& dfs_time;
williamr@2
   146
      LowPointMap lowpt;
williamr@2
   147
      PredecessorMap pred;
williamr@2
   148
      OutputIterator out;
williamr@2
   149
      Stack& S;
williamr@2
   150
      DFSVisitor vis;
williamr@2
   151
    };
williamr@2
   152
williamr@2
   153
  template<typename Graph, typename ComponentMap, typename OutputIterator,
williamr@2
   154
        typename VertexIndexMap, typename DiscoverTimeMap, typename LowPointMap,
williamr@2
   155
        typename PredecessorMap, typename DFSVisitor>
williamr@2
   156
  std::pair<std::size_t, OutputIterator>
williamr@2
   157
    biconnected_components_impl(const Graph & g, ComponentMap comp,
williamr@2
   158
        OutputIterator out, VertexIndexMap index_map, DiscoverTimeMap dtm,
williamr@2
   159
        LowPointMap lowpt, PredecessorMap pred, DFSVisitor dfs_vis)
williamr@2
   160
  {
williamr@2
   161
    typedef typename graph_traits<Graph>::vertex_descriptor vertex_t;
williamr@2
   162
    typedef typename graph_traits<Graph>::edge_descriptor edge_t;
williamr@2
   163
    function_requires<VertexListGraphConcept<Graph> >();
williamr@2
   164
    function_requires<IncidenceGraphConcept<Graph> >();
williamr@2
   165
    function_requires<WritablePropertyMapConcept<ComponentMap, edge_t> >();
williamr@2
   166
    function_requires<ReadWritePropertyMapConcept<DiscoverTimeMap,
williamr@2
   167
                                                  vertex_t> >();
williamr@2
   168
    function_requires<ReadWritePropertyMapConcept<LowPointMap, vertex_t > >();
williamr@2
   169
    function_requires<ReadWritePropertyMapConcept<PredecessorMap,
williamr@2
   170
                                                  vertex_t> >();
williamr@2
   171
williamr@2
   172
    std::size_t num_components = 0;
williamr@2
   173
    std::size_t dfs_time = 0;
williamr@2
   174
      std::stack<edge_t> S;
williamr@2
   175
williamr@2
   176
      biconnected_components_visitor<ComponentMap, DiscoverTimeMap,
williamr@2
   177
          LowPointMap, PredecessorMap, OutputIterator, std::stack<edge_t>, 
williamr@2
   178
          DFSVisitor>
williamr@2
   179
      vis(comp, num_components, dtm, dfs_time, lowpt, pred, out, 
williamr@2
   180
          S, dfs_vis);
williamr@2
   181
williamr@2
   182
    depth_first_search(g, visitor(vis).vertex_index_map(index_map));
williamr@2
   183
williamr@2
   184
    return std::pair<std::size_t, OutputIterator>(num_components, vis.out);
williamr@2
   185
  }
williamr@2
   186
williamr@2
   187
    template <typename PredecessorMap>
williamr@2
   188
    struct bicomp_dispatch3
williamr@2
   189
    {
williamr@2
   190
  template<typename Graph, typename ComponentMap, typename OutputIterator,
williamr@2
   191
                typename VertexIndexMap, typename DiscoverTimeMap, 
williamr@2
   192
                typename LowPointMap, class P, class T, class R>
williamr@2
   193
      static std::pair<std::size_t, OutputIterator> apply (const Graph & g, 
williamr@2
   194
          ComponentMap comp, OutputIterator out, VertexIndexMap index_map, 
williamr@2
   195
          DiscoverTimeMap dtm, LowPointMap lowpt, 
williamr@2
   196
          const bgl_named_params<P, T, R>& params, PredecessorMap pred)
williamr@2
   197
      {
williamr@2
   198
        return biconnected_components_impl
williamr@2
   199
                (g, comp, out, index_map, dtm, lowpt, pred,
williamr@2
   200
                 choose_param(get_param(params, graph_visitor),
williamr@2
   201
                    make_dfs_visitor(null_visitor())));
williamr@2
   202
      }
williamr@2
   203
    };
williamr@2
   204
    
williamr@2
   205
    template <>
williamr@2
   206
    struct bicomp_dispatch3<error_property_not_found>
williamr@2
   207
    {
williamr@2
   208
      template<typename Graph, typename ComponentMap, typename OutputIterator,
williamr@2
   209
                typename VertexIndexMap, typename DiscoverTimeMap, 
williamr@2
   210
                typename LowPointMap, class P, class T, class R>
williamr@2
   211
      static std::pair<std::size_t, OutputIterator> apply (const Graph & g, 
williamr@2
   212
          ComponentMap comp, OutputIterator out, VertexIndexMap index_map, 
williamr@2
   213
          DiscoverTimeMap dtm, LowPointMap lowpt, 
williamr@2
   214
          const bgl_named_params<P, T, R>& params, 
williamr@2
   215
          error_property_not_found)
williamr@2
   216
  {
williamr@2
   217
    typedef typename graph_traits<Graph>::vertex_descriptor vertex_t;
williamr@2
   218
    std::vector<vertex_t> pred(num_vertices(g));
williamr@2
   219
    vertex_t vert = graph_traits<Graph>::null_vertex();
williamr@2
   220
williamr@2
   221
        return biconnected_components_impl
williamr@2
   222
                (g, comp, out, index_map, dtm, lowpt, 
williamr@2
   223
              make_iterator_property_map(pred.begin(), index_map, vert),
williamr@2
   224
                 choose_param(get_param(params, graph_visitor),
williamr@2
   225
                    make_dfs_visitor(null_visitor())));
williamr@2
   226
  }
williamr@2
   227
    };
williamr@2
   228
williamr@2
   229
    template <typename LowPointMap>
williamr@2
   230
    struct bicomp_dispatch2
williamr@2
   231
    {
williamr@2
   232
  template<typename Graph, typename ComponentMap, typename OutputIterator,
williamr@2
   233
                typename VertexIndexMap, typename DiscoverTimeMap, 
williamr@2
   234
                typename P, typename T, typename R>
williamr@2
   235
      static std::pair<std::size_t, OutputIterator> apply (const Graph& g, 
williamr@2
   236
          ComponentMap comp, OutputIterator out, VertexIndexMap index_map, 
williamr@2
   237
          DiscoverTimeMap dtm, const bgl_named_params<P, T, R>& params, 
williamr@2
   238
          LowPointMap lowpt)
williamr@2
   239
      {
williamr@2
   240
        typedef typename property_value< bgl_named_params<P,T,R>,
williamr@2
   241
            vertex_predecessor_t>::type dispatch_type;
williamr@2
   242
williamr@2
   243
        return bicomp_dispatch3<dispatch_type>::apply
williamr@2
   244
            (g, comp, out, index_map, dtm, lowpt, params, 
williamr@2
   245
             get_param(params, vertex_predecessor));
williamr@2
   246
      }
williamr@2
   247
    };
williamr@2
   248
williamr@2
   249
williamr@2
   250
    template <>
williamr@2
   251
    struct bicomp_dispatch2<error_property_not_found>
williamr@2
   252
    {
williamr@2
   253
      template<typename Graph, typename ComponentMap, typename OutputIterator,
williamr@2
   254
                typename VertexIndexMap, typename DiscoverTimeMap, 
williamr@2
   255
                typename P, typename T, typename R>
williamr@2
   256
      static std::pair<std::size_t, OutputIterator> apply (const Graph& g, 
williamr@2
   257
          ComponentMap comp, OutputIterator out, VertexIndexMap index_map, 
williamr@2
   258
          DiscoverTimeMap dtm, const bgl_named_params<P, T, R>& params, 
williamr@2
   259
          error_property_not_found)
williamr@2
   260
  {
williamr@2
   261
    typedef typename graph_traits<Graph>::vertices_size_type
williamr@2
   262
      vertices_size_type;
williamr@2
   263
    std::vector<vertices_size_type> lowpt(num_vertices(g));
williamr@2
   264
        vertices_size_type vst(0);
williamr@2
   265
williamr@2
   266
        typedef typename property_value< bgl_named_params<P,T,R>,
williamr@2
   267
            vertex_predecessor_t>::type dispatch_type;
williamr@2
   268
  
williamr@2
   269
        return bicomp_dispatch3<dispatch_type>::apply
williamr@2
   270
            (g, comp, out, index_map, dtm,
williamr@2
   271
             make_iterator_property_map(lowpt.begin(), index_map, vst),
williamr@2
   272
             params, get_param(params, vertex_predecessor));
williamr@2
   273
      }
williamr@2
   274
    };
williamr@2
   275
williamr@2
   276
    template <typename DiscoverTimeMap>
williamr@2
   277
    struct bicomp_dispatch1
williamr@2
   278
    {
williamr@2
   279
      template<typename Graph, typename ComponentMap, typename OutputIterator,
williamr@2
   280
                typename VertexIndexMap, class P, class T, class R>
williamr@2
   281
      static std::pair<std::size_t, OutputIterator> apply(const Graph& g, 
williamr@2
   282
          ComponentMap comp, OutputIterator out, VertexIndexMap index_map, 
williamr@2
   283
          const bgl_named_params<P, T, R>& params, DiscoverTimeMap dtm)
williamr@2
   284
      {
williamr@2
   285
        typedef typename property_value< bgl_named_params<P,T,R>,
williamr@2
   286
            vertex_lowpoint_t>::type dispatch_type;
williamr@2
   287
williamr@2
   288
        return bicomp_dispatch2<dispatch_type>::apply
williamr@2
   289
            (g, comp, out, index_map, dtm, params, 
williamr@2
   290
             get_param(params, vertex_lowpoint));
williamr@2
   291
      }
williamr@2
   292
    };
williamr@2
   293
williamr@2
   294
    template <>
williamr@2
   295
    struct bicomp_dispatch1<error_property_not_found>
williamr@2
   296
    {
williamr@2
   297
      template<typename Graph, typename ComponentMap, typename OutputIterator,
williamr@2
   298
                typename VertexIndexMap, class P, class T, class R>
williamr@2
   299
      static std::pair<std::size_t, OutputIterator> apply(const Graph& g, 
williamr@2
   300
          ComponentMap comp, OutputIterator out, VertexIndexMap index_map, 
williamr@2
   301
          const bgl_named_params<P, T, R>& params, error_property_not_found)
williamr@2
   302
      {
williamr@2
   303
        typedef typename graph_traits<Graph>::vertices_size_type
williamr@2
   304
            vertices_size_type;
williamr@2
   305
        std::vector<vertices_size_type> discover_time(num_vertices(g));
williamr@2
   306
    vertices_size_type vst(0);
williamr@2
   307
williamr@2
   308
        typedef typename property_value< bgl_named_params<P,T,R>,
williamr@2
   309
            vertex_lowpoint_t>::type dispatch_type;
williamr@2
   310
williamr@2
   311
        return bicomp_dispatch2<dispatch_type>::apply
williamr@2
   312
            (g, comp, out, index_map, 
williamr@2
   313
              make_iterator_property_map(discover_time.begin(), index_map, vst),
williamr@2
   314
             params, get_param(params, vertex_lowpoint));
williamr@2
   315
      }
williamr@2
   316
    };
williamr@2
   317
williamr@2
   318
  }
williamr@2
   319
williamr@2
   320
  template<typename Graph, typename ComponentMap, typename OutputIterator,
williamr@2
   321
      typename DiscoverTimeMap, typename LowPointMap>
williamr@2
   322
  std::pair<std::size_t, OutputIterator>
williamr@2
   323
  biconnected_components(const Graph& g, ComponentMap comp, 
williamr@2
   324
      OutputIterator out, DiscoverTimeMap dtm, LowPointMap lowpt)
williamr@2
   325
  {
williamr@2
   326
    typedef detail::error_property_not_found dispatch_type;
williamr@2
   327
williamr@2
   328
    return detail::bicomp_dispatch3<dispatch_type>::apply
williamr@2
   329
            (g, comp, out, 
williamr@2
   330
             get(vertex_index, g), 
williamr@2
   331
             dtm, lowpt, 
williamr@2
   332
             bgl_named_params<int, buffer_param_t>(0), 
williamr@2
   333
             detail::error_property_not_found());
williamr@2
   334
  }
williamr@2
   335
williamr@2
   336
  template <typename Graph, typename ComponentMap, typename OutputIterator,
williamr@2
   337
      typename P, typename T, typename R>
williamr@2
   338
  std::pair<std::size_t, OutputIterator>
williamr@2
   339
  biconnected_components(const Graph& g, ComponentMap comp, OutputIterator out, 
williamr@2
   340
      const bgl_named_params<P, T, R>& params)
williamr@2
   341
  {
williamr@2
   342
    typedef typename property_value< bgl_named_params<P,T,R>,
williamr@2
   343
        vertex_discover_time_t>::type dispatch_type;
williamr@2
   344
williamr@2
   345
    return detail::bicomp_dispatch1<dispatch_type>::apply(g, comp, out, 
williamr@2
   346
        choose_const_pmap(get_param(params, vertex_index), g, vertex_index), 
williamr@2
   347
        params, get_param(params, vertex_discover_time));
williamr@2
   348
  }
williamr@2
   349
williamr@2
   350
  template < typename Graph, typename ComponentMap, typename OutputIterator>
williamr@2
   351
  std::pair<std::size_t, OutputIterator>
williamr@2
   352
  biconnected_components(const Graph& g, ComponentMap comp, OutputIterator out)
williamr@2
   353
  {
williamr@2
   354
    return biconnected_components(g, comp, out,  
williamr@2
   355
        bgl_named_params<int, buffer_param_t>(0));
williamr@2
   356
  }
williamr@2
   357
williamr@2
   358
  namespace graph_detail {
williamr@2
   359
    struct dummy_output_iterator
williamr@2
   360
    {
williamr@2
   361
      typedef std::output_iterator_tag iterator_category;
williamr@2
   362
      typedef void value_type;
williamr@2
   363
      typedef void pointer;
williamr@2
   364
      typedef void difference_type;
williamr@2
   365
williamr@2
   366
      struct reference {
williamr@2
   367
        template<typename T>
williamr@2
   368
        reference& operator=(const T&) { return *this; }
williamr@2
   369
      };
williamr@2
   370
williamr@2
   371
      reference operator*() const { return reference(); }
williamr@2
   372
      dummy_output_iterator& operator++() { return *this; }
williamr@2
   373
      dummy_output_iterator operator++(int) { return *this; }
williamr@2
   374
    };
williamr@2
   375
  } // end namespace graph_detail
williamr@2
   376
williamr@2
   377
  template <typename Graph, typename ComponentMap,
williamr@2
   378
      typename P, typename T, typename R>
williamr@2
   379
  std::size_t
williamr@2
   380
  biconnected_components(const Graph& g, ComponentMap comp, 
williamr@2
   381
      const bgl_named_params<P, T, R>& params)
williamr@2
   382
  {
williamr@2
   383
    return biconnected_components(g, comp,
williamr@2
   384
        graph_detail::dummy_output_iterator(), params).first;
williamr@2
   385
  }
williamr@2
   386
williamr@2
   387
  template <typename Graph, typename ComponentMap>
williamr@2
   388
  std::size_t
williamr@2
   389
  biconnected_components(const Graph& g, ComponentMap comp)
williamr@2
   390
  {
williamr@2
   391
    return biconnected_components(g, comp,
williamr@2
   392
                                  graph_detail::dummy_output_iterator()).first;
williamr@2
   393
  }
williamr@2
   394
williamr@2
   395
  template<typename Graph, typename OutputIterator, 
williamr@2
   396
      typename P, typename T, typename R>
williamr@2
   397
  OutputIterator
williamr@2
   398
  articulation_points(const Graph& g, OutputIterator out, 
williamr@2
   399
      const bgl_named_params<P, T, R>& params)
williamr@2
   400
  {
williamr@2
   401
    return biconnected_components(g, dummy_property_map(), out, 
williamr@2
   402
        params).second;
williamr@2
   403
  }
williamr@2
   404
williamr@2
   405
  template<typename Graph, typename OutputIterator>
williamr@2
   406
  OutputIterator
williamr@2
   407
  articulation_points(const Graph& g, OutputIterator out)
williamr@2
   408
  {
williamr@2
   409
    return biconnected_components(g, dummy_property_map(), out, 
williamr@2
   410
        bgl_named_params<int, buffer_param_t>(0)).second;
williamr@2
   411
  }
williamr@2
   412
williamr@2
   413
}                               // namespace boost
williamr@2
   414
williamr@2
   415
#endif  /* BOOST_GRAPH_BICONNECTED_COMPONENTS_HPP */