Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
tpl_test_cycle.H
1 # ifndef TPL_TEST_CYCLE_H
2 # define TPL_TEST_CYCLE_H
3 
4 namespace Aleph {
5 
6 
17  template <class GT, class SA = Dft_Show_Arc<GT>>
19 {
20  typename GT::Node * src;
21  SA & sa;
22 
23  bool test_cycle(typename GT::Node * curr)
24  {
25  if (src == curr)
26  return true; // ciclo detectado!
27 
28  if (IS_NODE_VISITED(curr, Test_Cycle))
29  return false;
30 
31  NODE_BITS(curr).set_bit(Test_Cycle, true); // marque nodo
32 
33  // buscar caminos desde current_node a ver si llega a src_node
34  for (Node_Arc_Iterator<GT, SA> it(curr, sa); it.has_current(); it.next())
35  {
36  typename GT::Arc * arc = it.get_current_arc();
37  if (IS_ARC_VISITED(arc, Test_Cycle))
38  continue;
39 
40  ARC_BITS(arc).set_bit(Test_Cycle, true); // marque arco
41 
42  if (test_cycle(it.get_tgt_node()))
43  return true; // ciclo encontrado desde el arco actual
44  }
45 
46  // En este punto se han explorado caminos desde curr_node
47  // sin encontrar src_node ==> no existe ciclo por curr_node
48  return false;
49  }
50 
51  bool test_cycle(GT & g, typename GT::Node * s)
52  {
53  src = s;
54 
55  g.reset_bit_nodes(Test_Cycle); // reiniciar Test_Cycle para nodos
56  g.reset_bit_arcs(Test_Cycle); // reiniciar Test_Cycle para arcos
57 
58  // explorar recursivamente por arcos adyacentes a src_node
59  for (Node_Arc_Iterator<GT, SA> it(src, sa); it.has_curr(); it.next())
60  {
61  typename GT::Arc * arc = it.get_current_arc();
62  if (IS_ARC_VISITED(arc, Test_Cycle))
63  continue;
64 
65  ARC_BITS(arc).set_bit(Test_Cycle, true); // pintar arco
66 
67  if (test_cycle(it.get_tgt_node()))
68  return true; // ciclo detectado
69  }
70 
71  // Se han explorado todos los caminos desde src_node
72  // sin encontrar de nuevo a src_node ==> no hay ciclo
73  return false;
74  }
75 
76 public:
77 
78  Test_For_Cycle(SA && __sa = SA()) : sa(__sa) { /* empty */ }
79 
80  Test_For_Cycle(SA & __sa) : sa(__sa) { /* empty */ }
81 
91  bool operator () (GT & g, typename GT::Node * src)
92  {
93  return this->test_cycle(g, src);
94  }
95 };
96 
97 } // end namespace Aleph
98 
99 
100 # endif // TPL_TEST_CYCLE_H
#define IS_NODE_VISITED(p, bit)
Definition: aleph-graph.H:242
#define IS_ARC_VISITED(p, bit)
Definition: aleph-graph.H:275
void next()
Adelanta el iterador una posición.
Definition: filter_iterator.H:143
#define NODE_BITS(p)
Definition: aleph-graph.H:221
#define ARC_BITS(p)
Definition: aleph-graph.H:266
Definition: tpl_test_cycle.H:18
Definition: tpl_graph.H:694
bool operator()(GT &g, typename GT::Node *src)
Definition: tpl_test_cycle.H:91

Leandro Rabindranath León