27 # ifndef GRAPH_TRAVERSE_H 28 # define GRAPH_TRAVERSE_H 30 # include <tpl_agraph.H> 31 # include <tpl_dynListStack.H> 32 # include <tpl_dynListQueue.H> 39 template <
class GT,
class Itor,
51 Graph_Traverse(GT & __g, Show_Arc && __sa = Show_Arc()) : g(__g), sa(__sa) {}
53 template <
class Node_Op>
54 size_t operator () (
typename GT::Node * start, Node_Op & op)
64 Q<typename GT::Arc*> q;
65 for (Itor it(start, sa); it.has_curr(); it.next_ne())
67 typename GT::Arc * a = it.get_curr_ne();
68 typename GT::Node * tgt = g.get_connected_node(a, start);
74 const size_t & n = g.vsize();
75 while (not q.is_empty() and count < n)
77 typename GT::Arc * arc = q.get();
81 typename GT::Node * s = g.get_src_node(arc);
82 typename GT::Node * t = g.get_tgt_node(arc);
86 typename GT::Node * curr = s->state() ==
Processed ? t : s;
93 for (Itor it(curr, sa); it.has_curr(); it.next_ne())
95 typename GT::Arc * a = it.get_curr_ne();
98 typename GT::Node * tgt = g.get_connected_node(a, curr);
114 template <
class Node_Op>
115 size_t operator () (
typename GT::Node * start, Node_Op && op = Node_Op())
117 return (*
this)(start, op);
123 size_t exec(
typename GT::Node * start, Op & op)
130 if (not op(start,
nullptr))
133 using Pair = tuple<typename GT::Node*, typename GT::Arc*>;
135 for (Itor it(start, sa); it.has_curr(); it.next_ne())
137 typename GT::Arc * a = it.get_curr_ne();
138 typename GT::Node * tgt = g.get_connected_node(a, start);
141 q.put(make_tuple(start, a));
144 const size_t & n = g.vsize();
145 while (not q.is_empty() and count < n)
147 const Pair p = q.get();
148 typename GT::Arc * arc = get<1>(p);
153 typename GT::Node * curr = g.get_connected_node(arc, get<0>(p));
157 if (not op(curr, arc))
160 for (Itor it(curr, sa); it.has_curr(); it.next_ne())
162 typename GT::Arc * a = it.get_curr_ne();
165 typename GT::Node * tgt = g.get_connected_node(a, curr);
171 q.put(make_tuple(curr, a));
181 template <
class Operation>
182 size_t exec(
typename GT::Node * start, Operation && op = Operation())
184 return exec(start, op);
187 template <
class Node_Op,
class Arc_Op>
188 tuple<size_t, size_t> operator () (
typename GT::Node * start,
189 Node_Op & node_op, Arc_Op & arc_op)
193 Q<typename GT::Arc*> q;
195 size_t node_count = 1;
196 size_t arc_count = 0;
199 if (not node_op(start))
200 return make_tuple(1, 0);
202 for (Itor it(start, sa); it.has_curr(); it.next_ne())
204 typename GT::Arc * a = it.get_curr_ne();
205 typename GT::Node * tgt = g.get_connected_node(a, start);
211 return make_tuple(node_count, arc_count);
214 while (not q.is_empty())
216 typename GT::Arc * arc = q.get();
220 typename GT::Node * s = g.get_src_node(arc);
221 typename GT::Node * t = g.get_tgt_node(arc);
225 typename GT::Node * curr = s->state() ==
Processed ? t : s;
229 if (not node_op(curr))
230 return make_tuple(node_count, arc_count);
232 for (Itor it(curr, sa); it.has_curr(); it.next_ne())
234 typename GT::Arc * a = it.get_curr_ne();
237 typename GT::Node * tgt = g.get_connected_node(a, curr);
245 return make_tuple(node_count, arc_count);
252 return make_tuple(node_count, arc_count);
255 template <
class Node_Op,
class Arc_Op>
256 tuple<size_t, size_t> operator () (
typename GT::Node * start,
257 Node_Op && node_op = Node_Op(),
258 Arc_Op && arc_op = Arc_Op())
260 return (*
this)(start, node_op, arc_op);
265 template <
class GT,
class Itor,
269 template <
class GT,
class Itor,
274 # endif // GRAPH_TRAVERSE_H const unsigned char Processing
Definition: graph-traverse.H:42
const unsigned char Unprocessed
const unsigned char Processed
Definition: tpl_graph.H:1063
DynList< T > DynListStack
Definition: tpl_dynListStack.H:46
size_t exec(typename GT::Node *start, Op &op)
Definition: graph-traverse.H:123