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_path.H
1 # ifndef TEST_PATH_H
2 # define TEST_PATH_H
3 
4 namespace Aleph {
5 
6 
26  template <class GT, class SA = Dft_Show_Arc<GT> >
28 {
29  SA & sa;
30  typename GT::Node * tgt;
31 
32  bool test_path(typename GT::Node * curr)
33  {
34  if (curr == tgt)
35  return true; // se alcanzó a tgt
36 
37  if (IS_NODE_VISITED(curr, Test_Path)) // ¿se visitó curr_node?
38  return false; // sí, no explore
39 
40  NODE_BITS(curr).set_bit(Test_Path, true); // pintar curr_node
41 
42  // buscar recursivamente a través de arcos de curr
43  for (Node_Arc_Iterator<GT, SA> i(curr, sa); i.has_current(); i.next())
44  {
45  typename GT::Arc * arc = i.get_current_arc();
46  if (IS_ARC_VISITED(arc, Test_Path))
47  continue;
48 
49  ARC_BITS(arc).set_bit(Test_Path, true); // pintar arco
50  if (test_path(i.get_tgt_node()))
51  return true;
52  }
53 
54  // todos los arcos adyacentes de curr_node explorados sin
55  // encontrar a end_node ==> no existe camino por curr_node
56  return false;
57  }
58 
59  bool test_path(GT & g, typename GT::Node * src, typename GT::Node * dest)
60  { // si el grafo es conexo ==> existe camino
61  if (not g.is_digraph() and g.get_num_arcs() >= g.get_num_nodes())
62  return true;
63 
64  g.reset_bit_nodes(Test_Path);
65  g.reset_bit_arcs(Test_Path);
66 
67  tgt = dest;
68 
69  // buscar recursivamente por arcos adyacentes a src
70  for (Node_Arc_Iterator<GT, SA> i(src, sa); i.has_current(); i.next())
71  {
72  typename GT::Arc * arc = i.get_current_arc();
73  ARC_BITS(arc).set_bit(Test_Path, true); // marcar arco
74  if (test_path(i.get_tgt_node()))
75  return true;
76  }
77 
78  // todos los arcos de start_node han sido explorados sin
79  // encontrar camino hasta end_node ==> no existe camino
80  return false;
81  }
82 
83 public:
84 
85  Test_For_Path(SA && __sa = SA()) : sa(__sa) { /* empty */ }
86 
87  Test_For_Path(SA & __sa) : sa(__sa) { /* empty */ }
88 
96  bool operator () (GT& g, typename GT::Node * start_node,
97  typename GT::Node * end_node)
98  {
99  return test_path(g, start_node, end_node);
100  }
101 };
102 
103 
104 
105 } // end namespace Aleph
106 
107 # endif // TEST_PAT_H
#define IS_NODE_VISITED(p, bit)
Definition: aleph-graph.H:242
Definition: tpl_test_path.H:27
#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
bool operator()(GT &g, typename GT::Node *start_node, typename GT::Node *end_node)
Definition: tpl_test_path.H:96
#define ARC_BITS(p)
Definition: aleph-graph.H:266
Definition: tpl_graph.H:694

Leandro Rabindranath León