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_matgraph.H
1 # ifndef TPL_MAT_GRAPH_H
2 # define TPL_MAT_GRAPH_H
3 
4 # include <tpl_graph.H>
5 # include <tpl_sort_utils.H>
6 
7 using namespace Aleph;
8 
9 namespace Aleph
10 {
11 
12  template <typename GT> inline static
13 typename GT::Node * get_node(DynArray<typename GT::Node *> & nodes,
14  const long & i)
15 {
16  if (i >= nodes.size())
17  throw std::out_of_range("Index of node out of range");
18 
19  return nodes.access(i);
20 }
21 
22  template <typename GT> inline static long
23 node_index(DynArray<typename GT::Node *> & nodes,
24  const long & n, typename GT::Node * p)
25 {
26  return Aleph::binary_search<typename GT::Node*>(nodes, p, 0, n - 1);
27 }
28 
29  inline static long
30 index_array(const long & i, const long & j, const long & n)
31 {
32  if (i >= n or j >= n)
33  throw std::out_of_range("Matrix index out of range");
34 
35  return i + j*n;
36 }
37 
38  template <typename Entry>
39 inline static Entry * read_matrix(const DynArray<Entry> & mat,
40  const long & i, const long & j,
41  const long & n)
42 {
43  const long index = index_array(i, j, n);
44  if (not mat.exist(index))
45  return NULL;
46 
47  return &const_cast<Entry&>(mat.access(index));
48 }
49 
50  template <typename Entry>
51 inline static void write_matrix(DynArray<Entry> & mat,
52  const long & i,
53  const long & j,
54  const long & n,
55  const Entry & entry)
56 {
57  mat[index_array(i, j, n)] = entry;
58 }
59 
109  template <class GT, class SA = Dft_Show_Arc<GT> >
111 {
112 public:
114  typedef GT Graph_Type;
115 
117  typedef typename GT::Node_Type Node_Type;
118 
120  typedef typename GT::Arc_Type Arc_Type;
121 
123  typedef typename GT::Node Node;
124 
126  typedef typename GT::Arc Arc;
127 
128 private:
129 
130  DynArray<Node*> nodes;
131  GT * lgraph;
132  mutable size_t num_nodes;
133  SA & sa;
134 
135  struct Mat_Entry
136  {
137  Arc * arc;
138  Mat_Entry(Arc * __arc = NULL) : arc(__arc) { /* empty */ }
139  };
140 
142 
143 public:
144 
147  inline void copy_list_graph(GT & g);
148 
150  Map_Matrix_Graph(GT & g, SA && __sa = SA())
151  : lgraph(&g), num_nodes(g.get_num_nodes()), sa(__sa)
152  {
153  copy_list_graph(g);
154  }
155 
156  Map_Matrix_Graph(GT & g, SA & __sa)
157  : lgraph(&g), num_nodes(g.get_num_nodes()), sa(__sa)
158  {
159  copy_list_graph(g);
160  }
161 
164  {
165  copy_list_graph(*(mat.lgraph));
166  }
167 
170 
180  inline Map_Matrix_Graph & operator = (GT & g);
181 
194  inline Node * operator () (const long & i);
195 
211  inline long operator () (Node * node) const;
212 
232  inline Arc * operator () (Node * src_node, Node * tgt_node) const;
233 
249  inline Arc * operator () (const long & i, const long & j) const;
250 
252  GT & get_list_graph() { return *lgraph; }
253 
256  const size_t & get_num_nodes() const { return num_nodes; }
257 };
258 
259 
260  template <class GT, class SA> typename GT::Node *
262 {
263  return get_node <GT> (nodes, i);
264 }
265 
266  template <class GT, class SA> long
267 Map_Matrix_Graph<GT, SA>::operator () (typename GT::Node * node) const
268 {
269  return node_index <GT> (nodes, num_nodes, node);
270 }
271 
272  template <class GT, class SA> typename GT::Arc *
273 Map_Matrix_Graph<GT, SA>::operator () (const long & i, const long & j) const
274 {
275  Mat_Entry * mat_entry = read_matrix<Mat_Entry>(mat, i, j, num_nodes);
276  if (mat_entry == NULL)
277  return NULL;
278 
279  return mat_entry->arc;
280 }
281 
282  template <class GT, class SA> typename GT::Arc *
283 Map_Matrix_Graph<GT, SA>::operator () (Node * src_node, Node * tgt_node) const
284 {
285  Mat_Entry * mat_entry =
286  read_matrix<Mat_Entry>(mat, node_index<GT>(nodes, num_nodes, src_node),
287  node_index<GT>(nodes, num_nodes, tgt_node),
288  num_nodes);
289  if (mat_entry == NULL)
290  return NULL;
291 
292  return mat_entry->arc;
293 }
294 
295  template <class GT, class SA> Map_Matrix_Graph<GT, SA> &
297 {
298  if (this == &mat)
299  return *this;
300 
301  copy_list_graph(*(mat.lgraph));
302  return *this;
303 }
304 
305  template <class GT, class SA>
307 {
308  copy_list_graph(g);
309 }
310 
311  template <class GT, class SA>
313 {
314  // copiar atributos
315  lgraph = &g;
316  num_nodes = g.get_num_nodes();
317  nodes.cut(); // limpiar arreglos dinámicos de contenidos anteriores
318  mat.cut();
319  int i = 0;
320  for (typename GT::Node_Iterator it(g); it.has_curr(); it.next(), ++i)
321  nodes[i] = it.get_current_node();
322 
323  quicksort(nodes); // ordenar nodes para soportar búsqueda binaria
324  for (typename GT::Node_Iterator nit(g); nit.has_current(); nit.next())
325  {
326  Node * src = nit.get_current_node();
327  const long src_idx = node_index<GT>(nodes, num_nodes, src);
328 
329  // para cada arco de src escribirlo en la matriz mat
330  for (Out_Iterator<GT, SA> ait(src, sa); ait.has_curr(); ait.next())
331  {
332  Arc * arc = ait.get_current_arc();
333  Node * tgt = g.get_connected_node(arc, src);
334  const long tgt_idx = node_index<GT>(nodes, num_nodes, tgt);
335  write_matrix<Mat_Entry>(mat, src_idx, tgt_idx, num_nodes, arc);
336  }
337  }
338 }
339 
369  template <typename GT, class SA = Dft_Show_Arc<GT> >
371 {
372 public:
373 
375  typedef GT Graph_Type;
376 
379  typedef typename GT::Node_Type Node_Type;
380 
383  typedef typename GT::Arc_Type Arc_Type;
384 
386  typedef typename GT::Node Node;
387 
389  typedef typename GT::Arc Arc;
390 
391 private:
392 
393  DynArray<Node_Type> nodes;
394  DynArray<Arc_Type> arcs;
395  mutable size_t n;
396  mutable Arc_Type Null_Value;
397  SA & sa;
398 
399  void copy(Matrix_Graph & mat)
400  {
401  if (this == &mat)
402  return;
403 
404  n = mat.n; // copiar atributos
405  Null_Value = mat.Null_value;
406  nodes.cut(); // limpiar memoria de arreglos dinámicos
407  arcs.cut();
408  arcs.set_default_initial_value(Null_Value);
409 
410  // recorrer mat[i,j] y copiarla a nodes[], arcs[]
411  for (int i = 0; i < n; ++i)
412  {
413  nodes[i] = mat.nodes[i];
414  for (int j = 0; j < n; ++j)
415  {
416  const long mat_index = index_array(i, j, n);
417  if (not arcs.exist(mat_index))
418  continue;
419  arcs.touch(mat_index) = mat.arcs.access(mat_index);
420  }
421  }
422  }
423 
424  void copy(GT & g)
425  {
426  n = g.get_num_nodes();
427  DynArray<typename GT::Node *> ptr; // arreglo temporal
428 
429  int i = 0;
430  for (typename GT::Node_Iterator it(g); it.has_current(); it.next(), ++i)
431  ptr[i] = it.get_current_node();
432 
433  quicksort(ptr); // ordenar por si se relaciona con Map_Matrix_Graph
434 
435  arcs.set_default_initial_value(Null_Value);
436 
437  for (i = 0; i < n; ++i) // coloca contenidos de ptr[] en nodes[]
438  {
439  typename GT::Node * src = ptr[i];
440  nodes[i] = src->get_info();
441  for (Out_Iterator<GT, SA> it(src); it.has_current(); it.next())
442  {
443  typename GT::Arc * arc = it.get_current_arc();
444  typename GT::Node * tgt = it.get_tgt_node();
445  const long j = node_index<GT>(ptr, n, tgt);
446  const long mat_index = index_array(i, j, n);
447  arcs[mat_index] = arc->get_info();
448  }
449  }
450  }
451 
452 public:
453 
455  const size_t & get_num_nodes() const { return n; }
456 
458  const Arc_Type & null_value() const { return Null_Value; }
459 
477  Matrix_Graph(GT & g, const Arc_Type & null, SA && __sa = SA())
478  : Null_Value(null), sa(__sa)
479  {
480  copy(g);
481  }
482 
483  Matrix_Graph(GT & g, const Arc_Type & null, SA & __sa)
484  : Null_Value(null), sa(__sa)
485  {
486  copy(g);
487  }
488 
498  {
499  copy(mat);
500  }
501 
515  {
516  copy(mat);
517  return *this;
518  }
519 
534  {
535  copy(g);
536  return *this;
537  }
538 
555  const Arc_Type & operator () (const long & i, const long & j) const
556  {
557  const long mat_index = index_array(i, j, n);
558  if (not arcs.exist(mat_index)) // ¿Existe entrada?
559  return Null_Value; // No ==> no hay arco
560 
561  return arcs.access(mat_index);
562  }
563 
573  Node_Type & operator () (const long & i) const
574  {
575  if (i >= n)
576  throw std::out_of_range("node index out of range");
577 
578  return const_cast<Node_Type &>(nodes.access(i));
579  }
580 
597  Arc_Type & operator () (const long & i, const long & j)
598  {
599  const long mat_index = index_array(i, j, n);
600 
601  return arcs.touch(mat_index);
602  }
603 };
604 
631  template <class GT, typename __Entry_Type, class SA = Dft_Show_Arc<GT> >
632 class Ady_Mat
633 {
634 public:
635 
637  typedef GT Graph_Type;
638 
640  typedef __Entry_Type Entry_Type;
641 
644  typedef typename GT::Node_Type Node_Type;
645 
648  typedef typename GT::Arc_Type Arc_Type;
649 
651  typedef typename GT::Node Node;
652 
654  typedef typename GT::Arc Arc;
655 
656 private:
657 
658  GT * lgraph;
659  DynArray<Node*> nodes;
661  mutable size_t num_nodes;
662  mutable Entry_Type Null_Value;
663 
664  void test_same_graph(Ady_Mat & mat)
665  {
666  if (lgraph == mat.lgraph)
667  return;
668 
669  throw
670  std::domain_error("mat does not refers the same GT than this");
671  }
672 
673  void copy_nodes(GT & g)
674  {
675  lgraph = &g;
676  num_nodes = g.get_num_nodes();
677  nodes.cut(); // limpiar memoria por los nodos
678 
679  // coloca punteros a nodos en el arreglo nodes[]
680  int i = 0;
681  for (typename GT::Node_Iterator it(g); it.has_current(); it.next(), ++i)
682  nodes[i] = it.get_current_node();
683 
684  quicksort(nodes); // ordena para luego hacer búsqueda binaria
685  }
686 
687  Ady_Mat & copy(Ady_Mat & mat)
688  {
689  if (this == &mat)
690  return *this;
691 
692  test_same_graph(mat);
693  Null_Value = mat.Null_Value;
694  copy(mat.lgraph);
695 
696  return *this;
697  }
698 
699 public:
700 
703  Node * operator () (const long & i)
704  {
705  return Aleph::get_node<GT>(nodes, i);
706  }
707 
710  long operator () (Node * node) const
711  {
712  return node_index<GT>(nodes, num_nodes, node);
713  }
714 
729  Entry_Type & operator () (const long & i, const long & j)
730  {
731  return mat.touch(index_array(i, j, num_nodes));
732  }
733 
748  const Entry_Type & operator () (const long & i, const long & j) const
749  {
750  const long index = index_array(i, j, num_nodes);
751 
752  if (mat.exist(index))
753  return mat.access(index);
754 
755  return Null_Value;
756  }
757 
775  Entry_Type & operator () (Node * src, Node * tgt)
776  {
777  return (*this)(node_index <GT> (nodes, num_nodes, src),
778  node_index <GT> (nodes, num_nodes, tgt));
779  }
780 
798  const Entry_Type & operator () (Node * src, Node * tgt) const
799  {
800  return (*this)(node_index <GT> (nodes, num_nodes, src),
801  node_index <GT> (nodes, num_nodes, tgt));
802  }
803 
805  GT & get_list_graph() { return *lgraph; }
806 
808  const Entry_Type & null_value() const { return Null_Value; }
809 
812  const size_t & get_num_nodes() const { return num_nodes; }
813 
829  Ady_Mat(GT & g) : lgraph(&g), num_nodes(lgraph->get_num_nodes())
830  {
831  copy_nodes(g);
832  }
833 
848  Ady_Mat(GT & g, const Entry_Type & null)
849  : lgraph(&g), num_nodes(lgraph->get_num_nodes()), Null_Value(null)
850  {
851  copy_nodes(*lgraph);
852  }
853 
855  void set_null_value(const Entry_Type & null) { Null_Value = null; }
856 
858  Ady_Mat(Ady_Mat & mat)
859  {
860  copy(mat);
861  }
862 
886  template <class Operation> void operate_all_arcs_list_graph();
887 
917  template <class Operation> void operate_all_arcs_list_graph(void * ptr);
918 
938  template <class Operation> void operate_all_arcs_matrix();
939 
964  template <class Operation>
965  void operate_all_arcs_matrix(void * ptr);
966 };
967 
968 
969  template <class GT, typename __Entry_Type, class SA>
970  template <class Operation>
972 { // recorrer todos los nodos del grafo
973  for (typename GT::Node_Iterator nit(*lgraph); nit.has_current(); nit.next())
974  {
975  Node * src = nit.get_current_node();
976  const long src_idx = node_index<Graph_Type>(nodes, num_nodes, src);
977 
978  // recorrer todos los arcos del nodo origen
979  for (Out_Iterator<GT, SA> at(src); at.has_current(); at.next())
980  {
981  Arc * arc = at.get_current_arc();
982  const long tgt_idx =
983  node_index<Graph_Type>(nodes, num_nodes, arc->get_tgt_node());
984  Entry_Type & entry =
985  mat.touch(index_array(src_idx, tgt_idx, num_nodes));
986 
987  Operation () (*this, arc, src_idx, tgt_idx, entry);
988  }
989  }
990 }
991 
992  template <class GT, typename __Entry_Type, class SA>
993  template <class Operation>
995 {
996  const long & n = num_nodes;
997  for (int s = 0; s < n; ++s)
998  {
999  Node * src_node = get_node<GT>(nodes, s);
1000  for (int t = 0; t < n; ++t)
1001  {
1002  Node * tgt_node = get_node<GT>(nodes, t);
1003  Entry_Type & entry = mat.touch(index_array(s, t, num_nodes));
1004 
1005  Operation () (*this, src_node, tgt_node, s, t, entry);
1006  }
1007  }
1008 }
1009 
1010  template <class GT, typename __Entry_Type, class SA>
1011  template <class Operation>
1013 { // recorrer todos los nodos del grafo
1014  for (typename GT::Node_Iterator nit(*lgraph); nit.has_current(); nit.next())
1015  {
1016  Node * src = nit.get_current_node();
1017  const long src_idx = node_index<Graph_Type>(nodes, num_nodes, src);
1018 
1019  // recorrer todos los arcos del nodo origen
1020  for (Out_Iterator<GT, SA> at(src); at.has_current(); at.next())
1021  {
1022  Arc * arc = at.get_current_arc();
1023  Node * tgt = lgraph->get_tgt_node(arc);
1024  const long tgt_idx = node_index<Graph_Type>(nodes, num_nodes, tgt);
1025  Entry_Type & entry = // asegurar acceso a mat(src_idx, tgt_idx)
1026  mat.touch(index_array(src_idx, tgt_idx, num_nodes));
1027 
1028  Operation () (*this, arc, src_idx, tgt_idx, entry, ptr);
1029  }
1030  }
1031 }
1032 
1033  template <class GT, typename __Entry_Type, class SA>
1034  template <class Operation>
1036 {
1037  const long & n = num_nodes;
1038 
1039  for (int s = 0; s < n; ++s)
1040  {
1041  Node * src_node = get_node<GT>(nodes, s);
1042 
1043  for (int t = 0; t < n; ++t)
1044  {
1045  Node * tgt_node = get_node<GT>(nodes, t);
1046  Entry_Type & entry = mat.touch(index_array(s, t, num_nodes));
1047  Operation () (*this, src_node, tgt_node, s, t, entry, ptr);
1048  }
1049  }
1050 }
1051 
1071  template <class GT, class SA = Dft_Show_Arc<GT> >
1073 {
1074 public:
1075 
1077  typedef GT Graph_Type;
1078 
1080  typedef typename GT::Node Node;
1081 
1083  typedef typename GT::Arc Arc;
1084 
1085 private:
1086 
1087  BitArray bit_array;
1088  GT * lgraph;
1090  mutable size_t n;
1091 
1092  void copy_list_graph(GT & g)
1093  {
1094  n = g.get_num_nodes();
1095  nodes.cut(); // liberar memoria
1096 
1097  // copiar todos los nodos de g al arreglo nodes[]
1098  int i = 0;
1099  for (typename GT::Node_Iterator it(g); it.has_current(); it.next())
1100  nodes[i++] = static_cast<typename GT::Node*>(it.get_current_node());
1101 
1102  quicksort(nodes); // ordenar para luego hacer búsqueda binaria
1103 
1104  // recorrer todos los nodos de g para asignar los arcos en bit_array
1105  for (typename GT::Node_Iterator it(g); it.has_current(); it.next())
1106  {
1107  typename GT::Node * src = it.get_current_node();
1108  const size_t src_idx = node_index<Graph_Type>(nodes, n, src);
1109 
1110  // recorrer los arcos de src para asignar entrada en matriz
1111  for (Out_Iterator<GT, SA> jt(src); jt.has_current(); jt.next())
1112  {
1113  typename GT::Node * tgt = jt.get_tgt_node();
1114  const size_t tgt_idx = node_index<Graph_Type>(nodes, n, tgt);
1115  bit_array[index_array(src_idx, tgt_idx, n)] = 1;
1116  }
1117  }
1118  }
1119 
1120  struct Proxy
1121  {
1122  BitArray & bit_array;
1123 
1124  const size_t bit_index;
1125 
1126  Proxy(Bit_Mat_Graph & __bitmat, const long & i, const long & j)
1127  : bit_array(__bitmat.bit_array), bit_index(index_array(i, j, __bitmat.n))
1128  {
1129  // empty
1130  }
1131 
1132  Proxy& operator = (const Proxy & proxy)
1133  {
1134  bit_array[bit_index] = proxy.bit_array[proxy.bit_index];
1135  }
1136 
1137  Proxy& operator = (const int & i)
1138  {
1139  bit_array[bit_index] = i;
1140 
1141  return *this;
1142  }
1143 
1144  operator int () const
1145  {
1146  return bit_array[bit_index];
1147  }
1148  };
1149 
1150 public:
1151 
1153  const size_t & get_num_nodes() const { return n; }
1154 
1156  Bit_Mat_Graph() : lgraph(NULL) {}
1157 
1160  Bit_Mat_Graph(GT & g)
1161  : bit_array(g.get_num_nodes()*g.get_num_nodes()), lgraph(&g)
1162  {
1163  copy_list_graph(g);
1164  }
1165 
1168  : bit_array(bitmat.bit_array), lgraph(bitmat.lgraph),
1169  nodes(bitmat.nodes), n(bitmat.n)
1170  {
1171  // empty
1172  }
1173 
1175  Bit_Mat_Graph(const size_t & dim)
1176  : bit_array(dim*dim), lgraph(NULL), nodes(dim), n(dim)
1177  {
1178  // empty
1179  }
1180 
1183  void set_list_graph(GT & g)
1184  {
1185  const size_t & n = g.get_num_nodes();
1186  bit_array.set_size(n*n);
1187  lgraph = &g;
1188  copy_list_graph(g);
1189  }
1190 
1193  GT * get_list_graph() { return lgraph; }
1194 
1197  {
1198  if (this == &bitmat)
1199  return *this;
1200 
1201  lgraph = bitmat.lgraph;
1202  bit_array = bitmat.bit_array;
1203 
1204  return *this;
1205  }
1206 
1209  {
1210  if (&g == lgraph)
1211  return *this;
1212 
1213  copy_list_graph(g);
1214 
1215  return *this;
1216  }
1217 
1220  Node * operator () (const long & i)
1221  {
1222  if (lgraph == NULL)
1223  throw std::domain_error("There is no a GT object");
1224 
1225  return Aleph::get_node<GT>(nodes, i);
1226  }
1229  long operator () (Node * node) const
1230  {
1231  if (lgraph == NULL)
1232  throw std::domain_error("There is no a GT object");
1233 
1234  return node_index<GT>(nodes, n, node);
1235  }
1236 
1237  Proxy operator () (const long & i, const long & j)
1238  {
1239  return Proxy(*this, i, j);
1240  }
1241 
1242  Proxy operator () (const long & i, const long & j) const
1243  {
1244  return Proxy(const_cast<Bit_Mat_Graph&>(*this), i, j);
1245  }
1246 
1247  Proxy operator () (Node * src_node, Node * tgt_node)
1248  {
1249  if (lgraph == NULL)
1250  throw std::domain_error("There is no a GT object");
1251 
1252  return Proxy(*this, node_index<GT>(nodes, n, src_node),
1253  node_index<GT>(nodes, n, tgt_node));
1254  }
1255 
1256  Proxy operator () (Node * src_node, Node * tgt_node) const
1257  {
1258  if (lgraph == NULL)
1259  throw std::domain_error("There is no a GT object");
1260 
1261  return Proxy(*this, node_index<GT>(nodes, n, src_node),
1262  node_index<GT>(nodes, n, tgt_node));
1263  }
1264 };
1265 
1266 } // end namespace Aleph
1267 
1268 # endif // TPL_MAT_GRAPH_H
Matrix_Graph(Matrix_Graph &mat)
Definition: tpl_matgraph.H:497
Node * operator()(const long &i)
Definition: tpl_matgraph.H:1220
GT Graph_Type
El tipo de grafo representado con listas de adyacencia.
Definition: tpl_matgraph.H:637
GT::Arc Arc
El tipo de arco usado en la representación con listas de adyacencia.
Definition: tpl_matgraph.H:654
void cut(const size_t new_dim=0)
Definition: tpl_dynArray.H:1040
GT::Node Node
El tipo de nodo que se maneja el objeto GT.
Definition: tpl_matgraph.H:123
GT Graph_Type
El tipo de Graph_List asociado a la matriz.
Definition: tpl_matgraph.H:114
Ady_Mat(GT &g)
Definition: tpl_matgraph.H:829
GT & get_list_graph()
Retorna una referencia al grafo representado con lista de adyacencia.
Definition: tpl_matgraph.H:805
const size_t & get_num_nodes() const
Definition: tpl_matgraph.H:256
GT * get_list_graph()
Definition: tpl_matgraph.H:1193
Bit_Mat_Graph()
Constructor vacío.
Definition: tpl_matgraph.H:1156
size_t size() const
Retorna dimensión actual (más lejano índice escrito)
Definition: tpl_dynArray.H:523
Definition: bitArray.H:96
void quicksort(T *a, const int l, const int r, Compare &cmp)
Definition: tpl_sort_utils.H:1213
T & touch(const size_t i)
Definition: tpl_dynArray.H:915
GT::Node Node
El tipo de nodo en GT.
Definition: tpl_matgraph.H:1080
Definition: tpl_matgraph.H:110
const size_t & get_num_nodes() const
Definition: tpl_matgraph.H:812
void operate_all_arcs_matrix()
Definition: tpl_matgraph.H:994
Definition: tpl_matgraph.H:370
Bit_Mat_Graph(const Bit_Mat_Graph &bitmat)
Constructor copia.
Definition: tpl_matgraph.H:1167
Map_Matrix_Graph & operator=(Map_Matrix_Graph &mat)
Asignación de matriz de adyacencia.
Definition: tpl_matgraph.H:296
Matrix_Graph & operator=(Matrix_Graph &mat)
Definition: tpl_matgraph.H:514
void set_default_initial_value(const T &value)
Definition: tpl_dynArray.H:541
GT::Node_Type Node_Type
Definition: tpl_matgraph.H:644
Ady_Mat(GT &g, const Entry_Type &null)
Definition: tpl_matgraph.H:848
Ady_Mat(Ady_Mat &mat)
Constructor copia.
Definition: tpl_matgraph.H:858
const size_t & get_num_nodes() const
Retorna el número de nodos del grafo (dimensión de la matriz).
Definition: tpl_matgraph.H:1153
bool exist(const size_t i) const
Definition: tpl_dynArray.H:854
Node * operator()(const long &i)
Definition: tpl_matgraph.H:703
const size_t & get_num_nodes() const
Retorna el número de nodos del grafo (que es la dimensión de la matriz)
Definition: tpl_matgraph.H:455
GT::Node Node
El tipo de nodo usado en la representación con listas de adyacencia.
Definition: tpl_matgraph.H:651
Definition: tpl_graph.H:1186
Definition: tpl_matgraph.H:1072
GT::Node Node
El tipo de Graph_Node que usado en el GT.
Definition: tpl_matgraph.H:386
void operate_all_arcs_list_graph()
Definition: tpl_matgraph.H:971
Definition: tpl_matgraph.H:632
GT::Arc_Type Arc_Type
Definition: tpl_matgraph.H:648
GT Graph_Type
El tipo de grafo GT.
Definition: tpl_matgraph.H:1077
GT::Node_Type Node_Type
Definition: tpl_matgraph.H:379
void next()
Adelanta el iterador una posición.
Definition: filter_iterator.H:143
const Arc_Type & null_value() const
El valor constante que representa la entrada nula en la matriz.
Definition: tpl_matgraph.H:458
GT::Arc_Type Arc_Type
Definition: tpl_matgraph.H:383
void set_size(const size_t sz)
Reajusta la dimensión del arreglo.
Definition: bitArray.H:203
__Entry_Type Entry_Type
El tipo de dato que alberga la matriz.
Definition: tpl_matgraph.H:640
Bit_Mat_Graph(const size_t &dim)
Constructor especificando una dimensión.
Definition: tpl_matgraph.H:1175
Bit_Mat_Graph(GT &g)
Definition: tpl_matgraph.H:1160
Node * operator()(const long &i)
Definition: tpl_matgraph.H:261
Map_Matrix_Graph(GT &g, SA &&__sa=SA())
Constructor a partir de un grafo representado con listas de adyacencia.
Definition: tpl_matgraph.H:150
const Entry_Type & null_value() const
Retorna el valor considerado como nulo.
Definition: tpl_matgraph.H:808
const Arc_Type & operator()(const long &i, const long &j) const
Definition: tpl_matgraph.H:555
Bit_Mat_Graph & operator=(const Bit_Mat_Graph &bitmat)
Asignación de matriz.
Definition: tpl_matgraph.H:1196
Matrix_Graph(GT &g, const Arc_Type &null, SA &&__sa=SA())
Definition: tpl_matgraph.H:477
GT Graph_Type
El tipo de grafo representado con listas de adyacencia.
Definition: tpl_matgraph.H:375
T & access(const size_t i)
Definition: tpl_dynArray.H:793
GT::Arc_Type Arc_Type
El tipo atributo de arco que guarda los nodos en el objeto GT.
Definition: tpl_matgraph.H:120
void copy_list_graph(GT &g)
Definition: tpl_matgraph.H:312
GT::Arc Arc
El tipo de arco en GT.
Definition: tpl_matgraph.H:1083
void set_null_value(const Entry_Type &null)
Declara un valor nulo para la matriz de adyacencia auxiliar.
Definition: tpl_matgraph.H:855
Map_Matrix_Graph(Map_Matrix_Graph &mat)
Constructor copia.
Definition: tpl_matgraph.H:163
void set_list_graph(GT &g)
Definition: tpl_matgraph.H:1183
GT::Arc Arc
El tipo de Graph_Arc que usado en el GT.
Definition: tpl_matgraph.H:389
GT::Node_Type Node_Type
El tipo atributo de nodo que guarda los nodos en el objeto GT.
Definition: tpl_matgraph.H:117
GT::Arc Arc
El tipo de arco que se maneja el objeto GT.
Definition: tpl_matgraph.H:126
GT & get_list_graph()
Retorna una referencia al grafo representado con listas enlazadas.
Definition: tpl_matgraph.H:252

Leandro Rabindranath León