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_acyclique.H
1 # ifndef TPL_TEST_ACYCLIQUE_H
2 # define TPL_TEST_ACYCLIQUE_H
3 
4 namespace Aleph {
5 
6 
7 
27  template <class GT, class SA = Dft_Show_Arc<GT>>
29 {
30  SA & sa;
31 
32  bool is_acyclique(typename GT::Node * curr)
33  {
34  if (IS_NODE_VISITED(curr, Is_Acyclique))
35  return false;
36 
37  NODE_BITS(curr).set_bit(Is_Acyclique, true); // marcar nodo
38 
39  for (Node_Arc_Iterator<GT, SA> i(curr, sa); i.has_current(); i.next())
40  {
41  typename GT::Arc * arc = i.get_current_arc();
42  if (IS_ARC_VISITED(arc, Is_Acyclique))
43  continue;
44 
45  ARC_BITS(arc).set_bit(Is_Acyclique, true);
46 
47  if (not is_acyclique(i.get_tgt_node()))
48  return false;
49  }
50 
51  // todos los arcos recorridos sin encontrar ciclo ==>
52  // el grafo es acíclico pasando por curr_node
53  return true;
54  }
55 
56  bool is_acyclique(GT & g, size_t num_arcs)
57  {
58  if (g.is_digraph())
59  throw std::domain_error("is_graph_acyclique() does not work for digraps");
60 
61  if (num_arcs >= g.get_num_nodes())
62  return false;
63 
64  g.reset_bit_arcs(Is_Acyclique);
65  g.reset_bit_nodes(Is_Acyclique);
66 
67  for (typename GT::Node_Iterator it(g); it.has_current(); it.next())
68  {
69  typename GT::Node * curr = it.get_current_node();
70  if (IS_NODE_VISITED(curr, Is_Acyclique))
71  continue;
72 
73  if (not is_acyclique(curr))
74  return false;
75  }
76 
77  return true;
78 }
79 
80 public:
81 
82  Is_Graph_Acyclique(SA && __sa = SA()) : sa(__sa) { /* empty */ }
83 
84  Is_Graph_Acyclique(SA & __sa) : sa(__sa) { /* empty */ }
85 
105  bool operator () (GT & g, size_t num_arcs)
106  {
107  return is_acyclique(g, num_arcs);
108  }
109 
125  bool operator () (GT & g)
126  {
127  return is_acyclique(g, g.get_num_arcs());
128  }
129 };
130 
150  template <class GT, class SA = Dft_Show_Arc<GT>>
152 {
153  SA & sa;
154 
155 public:
156 
157  Has_Cycle(SA && __sa = SA()) : sa(__sa) { /* empty */ }
158 
159  Has_Cycle(SA & __sa) : sa(__sa) { /* empty */ }
160 
176  bool operator () (GT & g) const
177  {
178  return not Is_Graph_Acyclique <GT, SA> (sa) (g);
179  }
180 
196  bool operator () (GT & g, size_t num_arcs) const
197  {
198  return not Is_Graph_Acyclique <GT, SA> (sa) (g, num_arcs);
199  }
200 };
201 
202 
203 
204 
205 } // end namespace Aleph
206 
207 # endif // TPL_TEST_ACYCLIQUE_H
bool operator()(GT &g) const
Definition: tpl_test_acyclique.H:176
Definition: tpl_test_acyclique.H:151
#define IS_NODE_VISITED(p, bit)
Definition: aleph-graph.H:242
#define IS_ARC_VISITED(p, bit)
Definition: aleph-graph.H:275
bool operator()(GT &g, size_t num_arcs)
Definition: tpl_test_acyclique.H:105
void next()
Adelanta el iterador una posición.
Definition: filter_iterator.H:143
#define NODE_BITS(p)
Definition: aleph-graph.H:221
Definition: tpl_test_acyclique.H:28
#define ARC_BITS(p)
Definition: aleph-graph.H:266
Definition: tpl_graph.H:694

Leandro Rabindranath León