Util--  1.1
undirected_dfs.hh
Go to the documentation of this file.
1 //=======================================================================
2 // Copyright 2006 Sylvain Joyeux
3 // * added a terminator function to undirected_dfs_visit
4 // * specialize for use with undirected_graph<>
5 //
6 // Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
7 // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
8 //
9 // Distributed under the Boost Software License, Version 1.0. (See
10 // accompanying file LICENSE_1_0.txt or copy at
11 // http://www.boost.org/LICENSE_1_0.txt)
12 //=======================================================================
13 //
14 #ifndef UTILMM_GRAPH_UNDIRECTED_DFS_HPP
15 #define UTILMM_GRAPH_UNDIRECTED_DFS_HPP
16 
17 #include <boost/graph/depth_first_search.hpp>
18 #include <vector>
19 
20 namespace utilmm {
21  namespace detail {
22  using namespace boost;
23  struct nontruth2 {
24  template<class T, class T2>
25  bool operator()(const T&, const T2&) const { return false; }
26  };
27 
28  template <typename IncidenceGraph, typename DFSVisitor,
29  typename VertexColorMap, typename EdgeColorMap,
30  typename TerminatorFunc>
32  (const IncidenceGraph& g,
33  typename graph_traits<IncidenceGraph>::vertex_descriptor u,
34  DFSVisitor& vis,
35  VertexColorMap vertex_color,
36  EdgeColorMap edge_color,
37  TerminatorFunc func = TerminatorFunc())
38  {
39  function_requires<IncidenceGraphConcept<IncidenceGraph> >();
40  function_requires<DFSVisitorConcept<DFSVisitor, IncidenceGraph> >();
41  typedef typename graph_traits<IncidenceGraph>::vertex_descriptor Vertex;
42  typedef typename graph_traits<IncidenceGraph>::edge_descriptor Edge;
43  function_requires<ReadWritePropertyMapConcept<VertexColorMap,Vertex> >();
44  function_requires<ReadWritePropertyMapConcept<EdgeColorMap,Edge> >();
45  typedef typename property_traits<VertexColorMap>::value_type ColorValue;
46  typedef typename property_traits<EdgeColorMap>::value_type EColorValue;
47  function_requires< ColorValueConcept<ColorValue> >();
48  function_requires< ColorValueConcept<EColorValue> >();
49  typedef color_traits<ColorValue> Color;
50  typedef color_traits<EColorValue> EColor;
51  typedef typename graph_traits<IncidenceGraph>::out_edge_iterator Iter;
52  typedef std::pair<Vertex, std::pair<Iter, Iter> > VertexInfo;
53 
54  std::vector<VertexInfo> stack;
55 
56  put(vertex_color, u, Color::gray());
57  vis.discover_vertex(u, g);
58 
59  Iter ei, ei_end;
60  tie(ei, ei_end) = out_edges(u, g);
61  if (func(u, g))
62  stack.push_back(std::make_pair(u, std::make_pair(ei_end, ei_end)));
63  else
64  stack.push_back(std::make_pair(u, std::make_pair(ei, ei_end)));
65 
66  while (!stack.empty()) {
67  VertexInfo& back = stack.back();
68  u = back.first;
69  tie(ei, ei_end) = back.second;
70  stack.pop_back();
71  while (ei != ei_end) {
72  Vertex v = target(*ei, g);
73  vis.examine_edge(*ei, g);
74  ColorValue v_color = get(vertex_color, v);
75  EColorValue uv_color = get(edge_color, *ei);
76  put(edge_color, *ei, EColor::black());
77  if (v_color == Color::white()) {
78  vis.tree_edge(*ei, g);
79  stack.push_back(std::make_pair(u, std::make_pair(++ei, ei_end)));
80  u = v;
81  put(vertex_color, u, Color::gray());
82  vis.discover_vertex(u, g);
83  tie(ei, ei_end) = out_edges(u, g);
84  if (func(u, g))
85  ei = ei_end;
86  } else if (v_color == Color::gray()) {
87  if (uv_color == EColor::white()) vis.back_edge(*ei, g);
88  ++ei;
89  } else { // if (v_color == Color::black())
90  vis.forward_or_cross_edge(*ei, g);
91  ++ei;
92  }
93  }
94  put(vertex_color, u, Color::black());
95  vis.finish_vertex(u, g);
96  }
97  }
98  } // namespace detail
99 
100  template <typename Graph, typename DFSVisitor,
101  typename VertexColorMap, typename EdgeColorMap,
102  typename Vertex>
103  void
104  undirected_dfs(const Graph& g, DFSVisitor vis,
105  VertexColorMap vertex_color, EdgeColorMap edge_color,
106  Vertex start_vertex)
107  {
108  using namespace boost;
109  function_requires<DFSVisitorConcept<DFSVisitor, Graph> >();
110  function_requires<EdgeListGraphConcept<Graph> >();
111 
112  typedef typename property_traits<VertexColorMap>::value_type ColorValue;
113  typedef color_traits<ColorValue> Color;
114 
115  typename graph_traits<Graph>::vertex_iterator ui, ui_end;
116  for (tie(ui, ui_end) = vertices(g); ui != ui_end; ++ui) {
117  put(vertex_color, *ui, Color::white()); vis.initialize_vertex(*ui, g);
118  }
119  typename graph_traits<Graph>::edge_iterator ei, ei_end;
120  for (tie(ei, ei_end) = edges(g); ei != ei_end; ++ei)
121  put(edge_color, *ei, Color::white());
122 
123  if (start_vertex != *vertices(g).first){ vis.start_vertex(start_vertex, g);
124  detail::undir_dfv_impl_term(g, start_vertex, vis, vertex_color, edge_color, detail::nontruth2());
125  }
126 
127  for (tie(ui, ui_end) = vertices(g); ui != ui_end; ++ui) {
128  ColorValue u_color = get(vertex_color, *ui);
129  if (u_color == Color::white()) { vis.start_vertex(*ui, g);
130  detail::undir_dfv_impl_term(g, *ui, vis, vertex_color, edge_color, detail::nontruth2());
131  }
132  }
133  }
134 
135  template <typename Graph, typename DFSVisitor, typename VertexColorMap,
136  typename EdgeColorMap>
137  void
138  undirected_dfs(const Graph& g, DFSVisitor vis,
139  VertexColorMap vertex_color, EdgeColorMap edge_color)
140  {
141  using namespace boost;
142  undirected_dfs(g, vis, vertex_color, edge_color, *vertices(g).first, detail::nontruth2());
143  }
144 
145  namespace detail {
146  template <typename VertexColorMap>
147  struct udfs_dispatch {
148 
149  template <typename Graph, typename Vertex,
150  typename DFSVisitor, typename EdgeColorMap,
151  typename P, typename T, typename R>
152  static void
153  apply(const Graph& g, DFSVisitor vis, Vertex start_vertex,
154  const bgl_named_params<P, T, R>&,
155  EdgeColorMap edge_color,
156  VertexColorMap vertex_color)
157  {
158  undirected_dfs(g, vis, vertex_color, edge_color, start_vertex);
159  }
160  };
161 
162  template <>
163  struct udfs_dispatch<boost::detail::error_property_not_found> {
164  template <typename Graph, typename Vertex, typename DFSVisitor,
165  typename EdgeColorMap,
166  typename P, typename T, typename R>
167  static void
168  apply(const Graph& g, DFSVisitor vis, Vertex start_vertex,
169  const bgl_named_params<P, T, R>& params,
170  EdgeColorMap edge_color,
171  boost::detail::error_property_not_found)
172  {
173  std::vector<default_color_type> color_vec(num_vertices(g));
174  default_color_type c = white_color; // avoid warning about un-init
176  (g, vis, make_iterator_property_map
177  (color_vec.begin(),
178  choose_const_pmap(get_param(params, vertex_index),
179  g, vertex_index), c),
180  edge_color,
181  start_vertex);
182  }
183  };
184 
185  } // namespace detail
186 
187 
188  // Named Parameter Variant
189  template <typename Graph, typename P, typename T, typename R>
190  void
191  undirected_dfs(const Graph& g,
192  const boost::bgl_named_params<P, T, R>& params)
193  {
194  using namespace boost;
195  typedef typename property_value< bgl_named_params<P, T, R>,
196  vertex_color_t>::type C;
198  (g,
199  choose_param(get_param(params, graph_visitor),
200  make_dfs_visitor(null_visitor())),
201  choose_param(get_param(params, root_vertex_t()),
202  *vertices(g).first),
203  params,
204  get_param(params, edge_color),
205  get_param(params, vertex_color)
206  );
207  }
208 
209 
210  template <typename IncidenceGraph, typename DFSVisitor,
211  typename VertexColorMap, typename EdgeColorMap,
212  typename TerminatorFunc>
214  (const IncidenceGraph& g,
215  typename boost::graph_traits<IncidenceGraph>::vertex_descriptor u,
216  DFSVisitor vis, VertexColorMap vertex_color, EdgeColorMap edge_color,
217  TerminatorFunc func = TerminatorFunc())
218  {
219  detail::undir_dfv_impl_term(g, u, vis, vertex_color, edge_color, func);
220  }
221 
222 
223 } // namespace boost
224 
225 
226 #endif
std::pair< typename undirected_graph< BidirectionalGraph >::vertex_iterator, typename undirected_graph< BidirectionalGraph >::vertex_iterator > vertices(const undirected_graph< BidirectionalGraph, GRef > &g)
Definition: undirected_graph.hh:171
Definition: undirected_graph.hh:345
void undirected_depth_first_visit(const IncidenceGraph &g, typename boost::graph_traits< IncidenceGraph >::vertex_descriptor u, DFSVisitor vis, VertexColorMap vertex_color, EdgeColorMap edge_color, TerminatorFunc func=TerminatorFunc())
Definition: undirected_dfs.hh:214
Definition: undirected_dfs.hh:147
BidirectionalGraph::vertices_size_type num_vertices(const undirected_graph< BidirectionalGraph, GRef > &g)
Definition: undirected_graph.hh:205
Definition: auto_flag.hh:6
void put(undirected_property_map< PropertyMap > &map, EdgeDescriptor e, ValueType value)
Definition: undirected_graph.hh:328
Definition: undirected_dfs.hh:23
static void apply(const Graph &g, DFSVisitor vis, Vertex start_vertex, const bgl_named_params< P, T, R > &, EdgeColorMap edge_color, VertexColorMap vertex_color)
Definition: undirected_dfs.hh:153
static void apply(const Graph &g, DFSVisitor vis, Vertex start_vertex, const bgl_named_params< P, T, R > &params, EdgeColorMap edge_color, boost::detail::error_property_not_found)
Definition: undirected_dfs.hh:168
bool operator()(const T &, const T2 &) const
Definition: undirected_dfs.hh:25
void undir_dfv_impl_term(const IncidenceGraph &g, typename graph_traits< IncidenceGraph >::vertex_descriptor u, DFSVisitor &vis, VertexColorMap vertex_color, EdgeColorMap edge_color, TerminatorFunc func=TerminatorFunc())
Definition: undirected_dfs.hh:32
std::pair< typename undirected_graph< BidirectionalGraph >::edge_iterator, typename undirected_graph< BidirectionalGraph >::edge_iterator > edges(const undirected_graph< BidirectionalGraph, GRef > &g)
Definition: undirected_graph.hh:179
std::pair< typename undirected_graph< BidirectionalGraph, GRef >::out_edge_iterator, typename undirected_graph< BidirectionalGraph, GRef >::out_edge_iterator > out_edges(const typename BidirectionalGraph::vertex_descriptor u, const undirected_graph< BidirectionalGraph, GRef > &g)
Definition: undirected_graph.hh:187
boost::graph_traits< BidirectionalGraph >::vertex_descriptor target(const Edge &e, const undirected_graph< BidirectionalGraph, GRef > &g)
Definition: undirected_graph.hh:278
void undirected_dfs(const Graph &g, DFSVisitor vis, VertexColorMap vertex_color, EdgeColorMap edge_color, Vertex start_vertex)
Definition: undirected_dfs.hh:104

Generated on Mon Sep 24 2018 17:06:40 for Util-- by doxygen 1.8.13
SourceForge.net Project Page