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_components.H
1 # ifndef TPL_COMPONENTS_H
2 # define TPL_COMPONENTS_H
3 
4 # include <htlist.H>
5 
6 namespace Aleph {
7 
8 
19  template <class GT, class SA = Dft_Show_Arc<GT> >
21 {
22  SA & sa;
23  GT * gptr;
24  size_t count;
25 
26 public:
27 
28  Build_Subgraph(SA && __sa = SA()) : sa(__sa) { /* empty */ }
29 
30  Build_Subgraph(SA & __sa) : sa(__sa) { /* empty */ }
31 
32 private:
33 
34  void build_subgraph(GT & sg, typename GT::Node * g_src)
35  {
36  if (IS_NODE_VISITED(g_src, Build_Subtree))
37  return;
38 
39  NODE_BITS(g_src).set_bit(Build_Subtree, true); // g_src visitado
40  ++count;
41 
42  typename GT::Node * sg_src = mapped_node <GT> (g_src);
43  if (sg_src == NULL) // ¿está mapeado g_src?
44  { // No, cree imagen de g_src en el subgrafo sg y mapee
45  sg_src = sg.insert_node(g_src->get_info());
46  GT::map_nodes(g_src, sg_src);
47  }
48 
49  for (Node_Arc_Iterator<GT, SA> i(g_src, sa); // explore desde g_src
50  count < gptr->get_num_nodes() and i.has_current(); i.next())
51  {
52  typename GT::Arc * arc = i.get_current_arc();
53  if (IS_ARC_VISITED(arc, Build_Subtree))
54  continue; // avance próximo arco
55 
56  ARC_BITS(arc).set_bit(Build_Subtree, true); // arc visitado
57 
58  typename GT::Node * g_tgt = i.get_tgt_node(); // destino de arc
59  typename GT::Node * sg_tgt = mapped_node <GT> (g_tgt);
60 
61  if (sg_tgt == NULL) // ¿está mapeado en sg?
62  { // no, hay que mapearlo e insertarlo en el subgrafo sg
63  sg_tgt = sg.insert_node(g_tgt->get_info());
64  GT::map_nodes(g_tgt, sg_tgt);
65  }
66 
67  // tenemos nodos en subgrafo, insertamos arco y mapeamos
68  typename GT::Arc * sg_arc =
69  sg.insert_arc(sg_src, sg_tgt, arc->get_info());
70 
71  GT::map_arcs(arc, sg_arc);
72 
73  build_subgraph(sg, g_tgt);
74  }
75  }
76 
77  template <template <class> class List>
78  void build_subgraph(List<typename GT::Node*> & l, typename GT::Node * p)
79  {
80  if (IS_NODE_VISITED(p, Build_Subtree))
81  return;
82 
83  NODE_BITS(p).set_bit(Build_Subtree, true); // g_src visitado
84  ++count;
85  l.append(p);
86 
87  for (Node_Arc_Iterator<GT, SA> it(p, sa); // explore desde g_src
88  count < gptr->get_num_nodes() and it.has_curr(); it.next())
89  {
90  typename GT::Arc * arc = it.get_current_arc();
91  if (IS_ARC_VISITED(arc, Build_Subtree))
92  continue; // avance próximo arco
93 
94  ARC_BITS(arc).set_bit(Build_Subtree, true); // arc visitado
95 
96  build_subgraph(l, it.get_tgt_node());
97  }
98  }
99 
100  public:
101 
118  void operator () (GT & g, GT & sg, typename GT::Node * g_src)
119  {
120  gptr = &g;
121  count = 0;
122  build_subgraph (sg, g_src);
123  }
124 
141  typename GT::Node * src)
142  {
143  gptr = &g;
144  count = 0;
145  build_subgraph<DynDlist>(list, src);
146  }
147 
164  typename GT::Node * src)
165  {
166  gptr = &g;
167  count = 0;
168  build_subgraph<DynList>(list, src);
169  }
170 };
171 
172 
197  template <class GT, class SA = Dft_Show_Arc<GT> >
199 {
200  SA & sa;
201 
202 
203 public:
204 
205  Inconnected_Components(SA && __sa = SA()) : sa(__sa) { /* empty */ }
206 
207  Inconnected_Components(SA & __sa) : sa(__sa) { /* empty */ }
208 
209  template <template <class> class List>
210  void compute_blocks(GT & g, List <GT> & list)
211  {
212  g.reset_nodes();
213  g.reset_arcs();
214  size_t count = 0; // contador de nodos visitados
215  for (typename GT::Node_Iterator it(g); // recorrer nodos de g
216  count < g.get_num_nodes() and it.has_curr(); it.next())
217  {
218  typename GT::Node * curr = it.get_current_node();
219  if (IS_NODE_VISITED(curr, Build_Subtree))
220  continue;
221 
222  GT & subgraph = list.append(GT()); // grafo insertado en list
223 
224  Build_Subgraph <GT, SA> build(sa);
225  build(g, subgraph, curr);
226 
227  count += subgraph.get_num_nodes();
228  }
229  }
230 
231  template <template <class> class List>
232  void compute_lists(GT & g, List<List<typename GT::Node*> > & list)
233  {
234  g.reset_nodes();
235  g.reset_arcs();
236  size_t count = 0; // contador de nodos visitados
237  for (typename GT::Node_Iterator i(g); // recorrer nodos de g
238  count < g.get_num_nodes() and i.has_curr(); i.next())
239  {
240  typename GT::Node * curr = i.get_current_node();
241  if (IS_NODE_VISITED(curr, Build_Subtree))
242  continue;
243 
244  // crear subgrafo componente inconexo conectado por curr_node
245  List<typename GT::Node*> & l =
246  list.append(List<typename GT::Node*>());
247 
248  Build_Subgraph <GT, SA> build(sa);
249  build(g, l, curr);
250 
251  count += l.size();
252  }
253  }
254 
255  void operator () (GT & g, DynDlist <GT> & list)
256  {
257  compute_blocks<DynDlist>(g, list);
258  }
259 
260  void operator () (GT & g, DynDlist<DynDlist<typename GT::Node*> > & list)
261  {
262  compute_lists<DynDlist>(g, list);
263  }
264 
279  void operator () (GT & g, DynList <GT> & list)
280  {
281  compute_blocks<DynList>(g, list);
282  }
283 
298  void operator () (GT & g, DynList<DynList<typename GT::Node*> > & list)
299  {
300  compute_lists<DynList>(g, list);
301  }
302 };
303 
304 
305 } // end namespace Aleph
306 
307 # endif // TPL_COMPONENTS_H
Itor::difference_type count(const Itor &beg, const Itor &end, const T &value)
Definition: ahAlgo.H:127
#define IS_NODE_VISITED(p, bit)
Definition: aleph-graph.H:242
void operator()(GT &g, GT &sg, typename GT::Node *g_src)
Definition: tpl_components.H:118
Definition: tpl_components.H:20
#define IS_ARC_VISITED(p, bit)
Definition: aleph-graph.H:275
#define NODE_BITS(p)
Definition: aleph-graph.H:221
#define ARC_BITS(p)
Definition: aleph-graph.H:266
Definition: tpl_components.H:198
Definition: tpl_graph.H:694
Definition: List.H:23

Leandro Rabindranath León