make_biconnected_planar.hpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. //=======================================================================
  2. // Copyright 2007 Aaron Windsor
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See
  5. // accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //=======================================================================
  8. #ifndef __MAKE_BICONNECTED_PLANAR_HPP__
  9. #define __MAKE_BICONNECTED_PLANAR_HPP__
  10. #include <boost/config.hpp>
  11. #include <boost/tuple/tuple.hpp> //for tie
  12. #include <boost/graph/biconnected_components.hpp>
  13. #include <boost/property_map/property_map.hpp>
  14. #include <vector>
  15. #include <iterator>
  16. #include <algorithm>
  17. #include <boost/graph/planar_detail/add_edge_visitors.hpp>
  18. namespace boost
  19. {
  20. template <typename Graph,
  21. typename PlanarEmbedding,
  22. typename EdgeIndexMap,
  23. typename AddEdgeVisitor
  24. >
  25. void make_biconnected_planar(Graph& g,
  26. PlanarEmbedding embedding,
  27. EdgeIndexMap em,
  28. AddEdgeVisitor& vis
  29. )
  30. {
  31. typedef typename graph_traits<Graph>::vertex_descriptor vertex_t;
  32. typedef typename graph_traits<Graph>::edge_descriptor edge_t;
  33. typedef typename graph_traits<Graph>::edges_size_type edge_size_t;
  34. typedef typename
  35. property_traits<PlanarEmbedding>::value_type embedding_value_t;
  36. typedef typename embedding_value_t::const_iterator embedding_iterator_t;
  37. typedef iterator_property_map
  38. <std::vector<std::size_t>::iterator, EdgeIndexMap> component_map_t;
  39. edge_size_t n_edges(num_edges(g));
  40. std::vector<vertex_t> articulation_points;
  41. std::vector<edge_size_t> component_vector(n_edges);
  42. component_map_t component_map(component_vector.begin(), em);
  43. biconnected_components(g, component_map,
  44. std::back_inserter(articulation_points));
  45. typename std::vector<vertex_t>::iterator ap, ap_end;
  46. ap_end = articulation_points.end();
  47. for(ap = articulation_points.begin(); ap != ap_end; ++ap)
  48. {
  49. vertex_t v(*ap);
  50. embedding_iterator_t pi = embedding[v].begin();
  51. embedding_iterator_t pi_end = embedding[v].end();
  52. edge_size_t previous_component(n_edges + 1);
  53. vertex_t previous_vertex = graph_traits<Graph>::null_vertex();
  54. for(; pi != pi_end; ++pi)
  55. {
  56. edge_t e(*pi);
  57. vertex_t e_source(source(e,g));
  58. vertex_t e_target(target(e,g));
  59. //Skip self-loops and parallel edges
  60. if (e_source == e_target || previous_vertex == e_target)
  61. continue;
  62. vertex_t current_vertex = e_source == v ? e_target : e_source;
  63. edge_size_t current_component = component_map[e];
  64. if (previous_vertex != graph_traits<Graph>::null_vertex() &&
  65. current_component != previous_component)
  66. {
  67. vis.visit_vertex_pair(current_vertex, previous_vertex, g);
  68. }
  69. previous_vertex = current_vertex;
  70. previous_component = current_component;
  71. }
  72. }
  73. }
  74. template <typename Graph,
  75. typename PlanarEmbedding,
  76. typename EdgeIndexMap
  77. >
  78. inline void make_biconnected_planar(Graph& g,
  79. PlanarEmbedding embedding,
  80. EdgeIndexMap em
  81. )
  82. {
  83. default_add_edge_visitor vis;
  84. make_biconnected_planar(g, embedding, em, vis);
  85. }
  86. template <typename Graph,
  87. typename PlanarEmbedding
  88. >
  89. inline void make_biconnected_planar(Graph& g, PlanarEmbedding embedding)
  90. {
  91. make_biconnected_planar(g, embedding, get(edge_index,g));
  92. }
  93. } // namespace boost
  94. #endif //__MAKE_BICONNECTED_PLANAR_HPP__