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