Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
eulerian.H
1 # ifndef EULERIAN_H
2 # define EULERIAN_H
3 
4 # include <tpl_graph.H>
5 
6 namespace Aleph
7 {
8 
23 template <class GT,
24  class SN = Dft_Show_Node<GT>,
25  class SA = Dft_Show_Arc<GT> >
27 {
28  SN & sn;
29  SA & sa;
30 
31  bool test_graph(GT & g)
32  {
33  I(not g.is_digraph());
34 
35  for (Node_Iterator<GT, SN> it(g, sn); it.has_curr(); it.next())
36  if ((g.get_num_arcs(it.get_curr()) % 2) == 1)
37  return false;
38 
39  return true;
40  }
41 
42  bool test_digraph(GT & g)
43  {
44  I(g.is_digraph());
45 
46  g.reset_counter_nodes();
47 
48  // una primera pasada sobre arcos para contar grados de entrada
49  for (Arc_Iterator<GT, SA> it(g, sa); it.has_current(); it.next())
50  NODE_COUNTER(it.get_tgt_node())++;
51 
52  for (Node_Iterator<GT, SN> it(g, sn); it.has_curr(); it.next())
53  {
54  typename GT::Node * p = it.get_curr();
55 
56  if (g.get_num_arcs(p) != NODE_COUNTER(p))
57  return false;
58  }
59 
60  return true;
61  }
62 
63 public:
64 
65  Test_Eulerian(SN && __sn = SN(), SA && __sa = SA())
66  : sn(__sn), sa(__sa)
67  {
68  // empty
69  }
70 
71  // retorna true si el grafo el euleriano
72  bool operator () (GT & g)
73  {
74  if (g.is_digraph())
75  return test_digraph(g);
76  else
77  return test_graph(g);
78  }
79 };
80 
81 
82 } // end namespace Aleph
83 
84 # endif // EULERIAN_H
Definition: tpl_graph.H:751
#define NODE_COUNTER(p)
Definition: aleph-graph.H:226
Definition: tpl_graph.H:794
Definition: tpl_graph.H:634
void next()
Adelanta el iterador una posición.
Definition: filter_iterator.H:143
Definition: tpl_graph.H:814
Definition: eulerian.H:26

Leandro Rabindranath León