14 #ifndef UTILMM_GRAPH_UNDIRECTED_DFS_HPP 15 #define UTILMM_GRAPH_UNDIRECTED_DFS_HPP 17 #include <boost/graph/depth_first_search.hpp> 22 using namespace boost;
24 template<
class T,
class T2>
25 bool operator()(
const T&,
const T2&)
const {
return false; }
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,
35 VertexColorMap vertex_color,
36 EdgeColorMap edge_color,
37 TerminatorFunc func = TerminatorFunc())
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;
54 std::vector<VertexInfo> stack;
56 put(vertex_color, u, Color::gray());
57 vis.discover_vertex(u, g);
62 stack.push_back(std::make_pair(u, std::make_pair(ei_end, ei_end)));
64 stack.push_back(std::make_pair(u, std::make_pair(ei, ei_end)));
66 while (!stack.empty()) {
67 VertexInfo& back = stack.back();
69 tie(ei, ei_end) = back.second;
71 while (ei != ei_end) {
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)));
81 put(vertex_color, u, Color::gray());
82 vis.discover_vertex(u, g);
86 }
else if (v_color == Color::gray()) {
87 if (uv_color == EColor::white()) vis.back_edge(*ei, g);
90 vis.forward_or_cross_edge(*ei, g);
94 put(vertex_color, u, Color::black());
95 vis.finish_vertex(u, g);
100 template <
typename Graph,
typename DFSVisitor,
101 typename VertexColorMap,
typename EdgeColorMap,
105 VertexColorMap vertex_color, EdgeColorMap edge_color,
108 using namespace boost;
109 function_requires<DFSVisitorConcept<DFSVisitor, Graph> >();
110 function_requires<EdgeListGraphConcept<Graph> >();
112 typedef typename property_traits<VertexColorMap>::value_type ColorValue;
113 typedef color_traits<ColorValue> Color;
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);
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());
123 if (start_vertex != *
vertices(g).first){ vis.start_vertex(start_vertex, g);
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);
135 template <
typename Graph,
typename DFSVisitor,
typename VertexColorMap,
136 typename EdgeColorMap>
139 VertexColorMap vertex_color, EdgeColorMap edge_color)
141 using namespace boost;
146 template <
typename VertexColorMap>
149 template <
typename Graph,
typename Vertex,
150 typename DFSVisitor,
typename EdgeColorMap,
151 typename P,
typename T,
typename R>
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)
164 template <
typename Graph,
typename Vertex,
typename DFSVisitor,
165 typename EdgeColorMap,
166 typename P,
typename T,
typename R>
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)
173 std::vector<default_color_type> color_vec(
num_vertices(g));
174 default_color_type c = white_color;
176 (g, vis, make_iterator_property_map
178 choose_const_pmap(get_param(params, vertex_index),
179 g, vertex_index), c),
189 template <
typename Graph,
typename P,
typename T,
typename R>
192 const boost::bgl_named_params<P, T, R>& params)
194 using namespace boost;
195 typedef typename property_value< bgl_named_params<P, T, R>,
196 vertex_color_t>::type C;
199 choose_param(get_param(params, graph_visitor),
200 make_dfs_visitor(null_visitor())),
201 choose_param(get_param(params, root_vertex_t()),
204 get_param(params, edge_color),
205 get_param(params, vertex_color)
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())
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 > ¶ms, 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