Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
hamiltonian.H
1 # ifndef HAMILTONIAN_H
2 # define HAMILTONIAN_H
3 
4 # include <tpl_graph.H>
5 
6 namespace Aleph
7 {
8 
26 template <class GT,
27  class SN = Dft_Show_Node<GT>,
28  class SA = Dft_Show_Arc<GT> >
30 {
31  SN & sn;
32  SA & sa;
33 
34  bool test_graph(GT & g)
35  {
36  I(not g.is_digraph());
37 
38  const size_t & n = g.get_num_nodes();
39 
40  for (Node_Iterator<GT, SN> i(g, sn); i.has_curr(); i.next())
41  {
42  typename GT::Node * src = i.get_curr();
43  const size_t & nsrc = g.get_num_arcs(src);
44 
45  i.next();
46 
47  for (Node_Iterator<GT, SN> j(i); j.has_curr(); j.next())
48  if (nsrc + g.get_num_arcs(j.get_curr()) < n)
49  return false;
50  }
51 
52  return true;
53  }
54 
55  bool test_digraph(GT & g)
56  {
57  I(g.is_digraph());
58 
59  g.reset_counter_nodes();
60 
61  // una primera pasada sobre arcos para contar grados de entrada
62  for (Arc_Iterator<GT, SA> it(g, sa); it.has_curr(); it.next())
63  NODE_COUNTER(it.get_tgt_node())++;
64 
65  const size_t & n = g.get_num_nodes();
66 
67  for (Node_Iterator<GT, SN> i(g, sn); i.has_curr(); i.next())
68  {
69  typename GT::Node * src = i.get_curr();
70 
71  for (Node_Iterator<GT, SN> j(g, sn); j.has_curr(); j.next())
72  {
73  typename GT::Node * tgt = j.get_current();
74 
75  if (src == tgt)
76  continue;
77 
78  if (g.get_num_arcs(src) + NODE_COUNTER(tgt) >= n)
79  continue;
80 
81  // buscar si hay arco src-->tgt
82  bool terminate = true;
83  for (Node_Arc_Iterator<GT, SA> it(src, sa); it.has_curr();
84  it.next())
85  if (src == it.get_tgt_node())
86  {
87  terminate = false;
88  break;
89  }
90 
91  if (terminate)
92  return false;
93  }
94  }
95 
96  return true;
97  }
98 
99 public:
100 
101  Test_Hamiltonian_Sufficiency(SN && __sn = SN(), SA && __sa = SA())
102  : sn(__sn), sa(__sa)
103  {
104  // empty
105  }
106 
107  // retorna true si el grafo o digrafo satisface la prueba de
108  // suficiencia para ser hamiltoniano.
109  bool operator () (GT & g)
110  {
111  if (g.is_digraph())
112  return test_digraph(g);
113  else
114  return test_graph(g);
115  }
116 };
117 
118 
119 
120 } // end namespace Aleph
121 
122 # endif // HAMILTONIAN_H
Definition: hamiltonian.H:29
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: tpl_graph.H:694

Leandro Rabindranath León