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_graph_try.H
1 # ifndef TPL_GRAPH_H
2 # define TPL_GRAPH_H
3 
4 # include <memory>
5 # include <bitArray.H>
6 # include <tpl_dynArray.H>
7 # include <tpl_sort_utils.H>
8 # include <tpl_dynMapTree.H>
9 # include <tpl_dynDlist.H>
10 # include <tpl_treapRk.H>
11 # include <tpl_aleph_graph.H>
12 # include <filter_iterator.H>
13 
14 
15 using namespace Aleph;
16 
17 namespace Aleph {
18 
19 template <typename Node_Info> class Graph_Node;
20 
21 template <typename Arc_Info> class Graph_Arc;
22 
23 class Arc_Node;
24 
25  template <class GT>
26 class Path;
27 
28  template <typename __Graph_Node, typename __Graph_Arc>
29 class List_Graph;
30 
31  template <typename __Graph_Node, typename __Graph_Arc>
32 class List_Digraph;
33 
34  template <class GT>
35 class Mat_Graph;
36 
37  template <typename MT, typename Entry_Info, typename Copy>
38 class Ady_MaT;
39 
40 
77  template <typename __Node_Info = Empty_Class>
78 class Graph_Node : public Dlink, Aleph_Graph_Node<__Node_Info>
79 {
80  friend class Arc_Node;
81 
82  typedef Aleph_Graph_Node<__Node_Info> Base_Node;
83 
84 public:
85 
86  typedef __Node_Info Node_Info;
87 
98  : Base_Node()
99  {
100  // Empty
101  }
102 
103  Graph_Node(const Graph_Node & node)
104  : Base_Node(node)
105  {
106  // Empty
107  }
108 
109  Graph_Node(Graph_Node && node)
110  : Base_Node(std::move(node))
111  {
112  // Empty
113  }
114 
128  Graph_Node(const Node_Info & info)
129  : Base_Node(info)
130  {
131  // Empty
132  }
133 
134  Graph_Node(Node_Info && info)
135  : Base_Node(std::move(info))
136  {
137  // Empty
138  }
139 
156  : Base_Node(node)
157  {
158  // Empty
159  }
160 
161  Dlink arc_list;
162 };
163 
200  template <typename __Arc_Info = Empty_Class>
201 class Graph_Arc : public Dlink, Aleph_Graph_Arc<__Arc_Info>
202 {
203  typedef Aleph_Graph_Arc<__Arc_Info> Base_Arc;
204 
205 public:
206  typedef __Arc_Info Arc_Info;
207 
208  Arc_Node * src_arc_node; // puntero al Arc_Node del nodo fuente
209  Arc_Node * tgt_arc_node; // puntero al Arc_Node del nodo destino
210 
211  Graph_Arc()
212  : src_arc_node(NULL), tgt_arc_node(NULL)
213  {
214  // Empty
215  }
216 
217  Graph_Arc(const Arc_Info & info)
218  : Base_Arc(info), src_arc_node(NULL), tgt_arc_node(NULL)
219  {
220  // Empty
221  }
222 
223  Graph_Arc(Arc_Info && info)
224  : Base_Arc(std::move(info)), src_arc_node(NULL), tgt_arc_node(NULL)
225  {
226  // Empty
227  }
228 
229  Graph_Arc(void * src, void * tgt, const Arc_Info & info)
230  : Base_Arc(src, tgt, info), src_arc_node(NULL), tgt_arc_node(NULL)
231  {
232  // Empty
233  }
234 
235  Graph_Arc(void * src, void * tgt, Arc_Info && info)
236  : Base_Arc(src, tgt, std::move(info)),
237  src_arc_node(NULL), tgt_arc_node(NULL)
238  {
239  // Empty
240  }
241 
242  Graph_Arc(void * src, void * tgt)
243  : Base_Arc(src, tgt), src_arc_node(NULL), tgt_arc_node(NULL)
244  {
245  // Empty
246  }
247 };
248 
249 struct Arc_Node : public Dlink
250 {
251  void * arc;
252  Arc_Node() : arc(NULL) {}
253  Arc_Node(void * __arc) : arc(__arc) {}
254 };
255 
284  template <typename __Graph_Node = Graph_Node<int>,
285  typename __Graph_Arc = Graph_Arc<int>>
286 class List_Graph : public Aleph_Graph <__Graph_Node, __Graph_Arc>
287 {
288 public:
289  typedef __Graph_Node Node;
290  typedef __Graph_Arc Arc;
291  typedef typename Node::Node_Info Node_Type;
292  typedef typename Arc::Arc_Info Arc_Type;
293 
294 private:
295  typedef Aleph_Graph <__Graph_Node, __Graph_Arc> Base_Graph;
296 
297  Dlink node_list; // lista de nodos
298  Dlink arc_list; // lista de arcos
299 
300  static Node * dlink_to_node(Dlink * p) { return (Node*) p; }
301 
302  static Arc * dlink_to_arc(Dlink * p) { return (Arc*) p; }
303 
304  static Arc_Node * dlink_to_arc_node(Dlink * p) { return (Arc_Node*) p; }
305 
306  static Arc * void_to_arc(Arc_Node * arc_node)
307  {
308  return (Arc*) arc_node->arc;
309  }
310 
311 
312  template <class Cmp>
313  struct Cmp_Arc
314  {
315  Cmp & cmp;
316 
317  Cmp_Arc(Cmp && __cmp = Cmp()) : cmp(__cmp) { /* empty */ }
318 
319  Cmp_Arc(Cmp & __cmp) : cmp(__cmp) { /* empty */ }
320 
321  bool operator () (Dlink * d1, Dlink * d2) const
322  {
323  Arc * arc1 = dlink_to_arc(d1); // convertir dlink d1 de arco a Arc
324  Arc * arc2 = dlink_to_arc(d2); // convertir dlink d2 de arco a Arc
325  return cmp(arc1, arc2); // al tener dos arcos invocamos a Cmp
326  }
327  };
328 
329 public:
330 
347  inline virtual Node * insert_node(Node * node);
348 
361  inline virtual Node * insert_node(const Node_Type & node_info);
362 
363 
365  inline virtual Node * insert_node(Node_Type && node_info = Node_Type());
366 
380  inline virtual void remove_node(Node * node);
381 
391  inline Node * get_first_node();
392 
393  inline Arc * get_first_arc(Node *);
394 
417  inline virtual Arc *
418  insert_arc(Node * src_node, Node * tgt_node,
419  const typename Arc::Arc_Type & arc_info);
420 
421  inline virtual Arc *
422  insert_arc(Node * src_node, Node * tgt_node,
423  typename Arc::Arc_Type && arc_info);
424 
425  inline virtual Arc * insert_arc(Node * src_node, Node * tgt_node);
426 
437  inline virtual void remove_arc(Arc * arc);
438 
450  inline virtual void disconnect_arc(Arc * arc);
451 
469  inline virtual Arc * connect_arc(Arc * arc);
470 
486  inline Arc * get_first_arc();
487 
494  template <class Compare> inline
495  void sort_arcs(Compare && cmp = Compare());
496 
497  template <class Compare> inline
498  void sort_arcs(Compare & cmp);
499 
500  GRAPH_SEARCH_METHODS;
501 
512  inline List_Graph(const List_Graph & g);
513 
514  inline List_Graph(List_Graph && g);
515 
527  inline List_Graph & operator = (const List_Graph & g);
528 
529  inline List_Graph & operator = (List_Graph && g);
530 
533  inline virtual ~List_Graph();
534 
541  class Node_Iterator : public Dlink::Iterator
542  {
543  public:
544 
546  typedef Node * Item_Type;
547 
550 
551  Node_Iterator() { /* empty */ }
552 
553  inline Node_Iterator(List_Graph & _g);
554 
556  inline Node * get_current_node();
557 
559  Node * get_current() { return get_current_node(); }
560 
562  Node * get_curr() { return get_current_node(); }
563  };
564 
572  class Node_Arc_Iterator : public Dlink::Iterator
573  {
574  Node * src_node;
575 
576  public:
577 
579  typedef Arc * Item_Type;
580 
582  typedef Node * Set_Type;
583 
585  Node_Arc_Iterator() { /* empty */ }
586 
588  Node_Arc_Iterator(Node * src)
589  : Dlink::Iterator(&(src->arc_list)), src_node(src)
590  {
591  // empty
592  }
593 
595  inline Arc * get_current_arc();
596 
598  Arc * get_current() { return get_current_arc(); }
599 
601  Arc * get_curr() { return get_current_arc(); }
602 
604  inline Node * get_tgt_node();
605 
606  Arc_Node * get_current_arc_node()
607  {
608  return dlink_to_arc_node(Dlink::Iterator::get_current());
609  }
610  };
611 
619  class Arc_Iterator : public Dlink::Iterator
620  {
621  public:
622 
624  typedef Arc * Item_Type;
625 
628 
629  Arc_Iterator() { /* empty */ }
630 
631  inline Arc_Iterator(List_Graph & _g);
632 
634  Arc * get_current_arc();
635 
637  Arc * get_current() { return get_current_arc(); }
638 
640  Arc * get_curr() { return get_current_arc(); }
641 
643  Node * get_src_node() { return (Node*) get_current_arc()->src_node; }
644 
646  Node * get_tgt_node() { return (Node*) get_current_arc()->tgt_node; }
647  };
648 
649  GRAPH_ITERATIVE_METHODS;
650 
651  List_Graph()
652  : Base_Graph(false)
653  {
654  // Empty
655  }
656 
657  void swap(List_Graph & g)
658  {
659  common_swap(g);
660  node_list.swap(&g.node_list);
661  arc_list.swap(&g.arc_list);
662  }
663 };
664 
665 
669  template <class GT>
670 struct Dft_Show_Arc
671 {
672  bool operator () (typename GT::Arc * /* arc */) const
673  {
674  return true;
675  }
676 };
677 
678 
679  template <class GT, class SA1, class SA2>
680 class Double_SA
681 {
682  SA1 & sa1;
683  SA2 & sa2;
684  typename GT::Node * s;
685 
686 public:
687 
688  Double_SA(SA1 && __sa1 = SA1(), SA2 && __sa2 = SA2())
689  : sa1(__sa1) , sa2(__sa2)
690  {
691  /* empty */
692  }
693 
694  Double_SA(SA1 & __sa1, SA2 & __sa2)
695  : sa1(__sa1) , sa2(__sa2)
696  {
697  /* empty */
698  }
699 
700  Double_SA(SA1 & __sa1, SA2 && __sa2 = SA2())
701  : sa1(__sa1) , sa2(__sa2)
702  {
703  /* empty */
704  }
705 
706  Double_SA(SA1 && __sa1, SA2 & __sa2)
707  : sa1(__sa1) , sa2(__sa2)
708  {
709  /* empty */
710  }
711 
712  bool operator () (typename GT::Arc * a)
713  {
714  return sa1(a) and sa2(a);
715  }
716 };
717 
729  template <class GT, class Show_Arc = Dft_Show_Arc<GT>>
730 class Node_Arc_Iterator :
731  public Filter_Iterator<typename GT::Node*,
732  typename GT::Node_Arc_Iterator,
733  Show_Arc>
734 {
735  typedef Filter_Iterator<typename GT::Node*,
736  typename GT::Node_Arc_Iterator,
737  Show_Arc> Filter_Itor;
738 public:
739 
740  typedef Filter_Iterator
741  <typename GT::Node*, typename GT::Node_Arc_Iterator, Show_Arc> Itor;
742 
744  typedef typename Itor::Item_Type Item_Type;
745 
747  typedef typename Itor::Set_Type Set_Type;
748 
749  Node_Arc_Iterator() { /* empty */ }
750 
756  Node_Arc_Iterator(typename GT::Node * p, Show_Arc && sa = Show_Arc())
757  : Itor(p, std::move(sa))
758  {
759  // empty
760  }
761 
767  Node_Arc_Iterator(typename GT::Node * p, Show_Arc & sa)
768  : Itor(p, sa)
769  {
770  // empty
771  }
772 };
773 
774 
786  template <class GT, class Show_Arc = Dft_Show_Arc<GT>>
787 class Arc_Iterator :
788  public Filter_Iterator<GT, typename GT::Arc_Iterator, Show_Arc>
789 {
790 public:
791 
793 
795  typedef typename Itor::Item_Type Item_Type;
796 
798  typedef typename Itor::Set_Type Set_Type;
799 
800  Arc_Iterator() { /* empty */ }
801 
807  Arc_Iterator(GT & g, Show_Arc && sa = Show_Arc())
808  : Itor(g, std::move(sa))
809  {
810  // empty
811  }
812 
818  Arc_Iterator(GT & g, Show_Arc & sa)
819  : Itor(g, sa)
820  {
821  // empty
822  }
823 };
824 
825 
829  template <class GT>
830 struct Dft_Show_Node
831 {
832  bool operator () (typename GT::Node *) const
833  {
834  return true;
835  }
836 };
837 
849  template <class GT, class Show_Node = Dft_Show_Node<GT>>
850 class Node_Iterator :
851  public Filter_Iterator<GT, typename GT::Node_Iterator, Show_Node>
852 {
853 public:
854 
856 
858  typedef typename Itor::Item_Type Item_Type;
859 
861  typedef typename Itor::Set_Type Set_Type;
862 
863  Node_Iterator() { /* empty */ }
864 
870  Node_Iterator(GT & g, Show_Node && sn = Show_Node())
871  : Itor (g, std::move(sn))
872  {
873  /* empty */
874  }
875 
881  Node_Iterator(GT & g, Show_Node & sn)
882  : Itor (g, sn)
883  {
884  /* empty */
885  }
886 };
887 
888 
905 template <typename __Graph_Node = Graph_Node<int>,
906  typename __Graph_Arc = Graph_Arc<int>>
907 class List_Digraph : public List_Graph<__Graph_Node, __Graph_Arc>
908 {
910 
911 public:
912 
913  typedef __Graph_Node Node;
914 
915  typedef __Graph_Arc Arc;
916 
917  List_Digraph()
918  {
919  this->digraph = true;
920  }
921 
922  List_Digraph(const List_Digraph & dg) : GT()
923  {
924  this->digraph = true;
925  *this = dg;
926  }
927 
928  List_Digraph(List_Digraph && dg) : GT()
929  {
930  this->digraph = true;
931  this->swap(dg);
932  }
933 
934  List_Digraph & operator = (const List_Digraph<Node, Arc> & g)
935  {
936  if (this == &g)
937  return *this;
938 
939  copy_graph(*this, const_cast<List_Digraph<Node, Arc>&>(g));
940 
941  return *this;
942  }
943 
944  List_Digraph & operator = (List_Digraph<Node, Arc> && g)
945  {
946  this->swap(g);
947 
948  return *this;
949  }
950 };
951 
952 
964  template <class GT, class Show_Arc = Dft_Show_Arc<GT>>
965 class Out_Iterator :
966  public Filter_Iterator<typename GT::Node*,
967  typename GT::Out_Iterator,
968  Show_Arc>
969 {
970 public:
971 
972  typedef Filter_Iterator
973  <typename GT::Node*, typename GT::Out_Iterator, Show_Arc> Itor;
974 
975  Out_Iterator() { /* empty */ }
976 
982  Out_Iterator(typename GT::Node * p, Show_Arc && sa = Show_Arc())
983  : Itor(p, sa)
984  {
985  // empty
986  }
987 
993  Out_Iterator(typename GT::Node * p, Show_Arc & sa)
994  : Itor(p, sa)
995  {
996  // empty
997  }
998 };
999 
1011  template <class GT, class Show_Arc = Dft_Show_Arc<GT>>
1012 class In_Iterator :
1013  public Filter_Iterator<typename GT::Node*,
1014  typename GT::In_Iterator,
1015  Show_Arc>
1016 {
1017 public:
1018 
1019  typedef Filter_Iterator
1020  <typename GT::Node*, typename GT::In_Iterator, Show_Arc> Itor;
1021 
1022  In_Iterator() { /* empty */ }
1023 
1029  In_Iterator(typename GT::Node * p, Show_Arc && sa = Show_Arc())
1030  : Itor(p, sa)
1031  {
1032  // empty
1033  }
1034 
1040  In_Iterator(typename GT::Node * p, Show_Arc & sa)
1041  : Itor(p, sa)
1042  {
1043  // empty
1044  }
1045 };
1046 
1092  template <class GT, class SA> typename GT::Arc *
1093 search_arc(GT & g, typename GT::Node * src_node,
1094  typename GT::Node * tgt_node);
1095 
1097  template <class GT>
1098 typename GT::Node * mapped_node(typename GT::Node * p)
1099 {
1100  return (typename GT::Node *) NODE_COOKIE(p);
1101 }
1102 
1104  template <class GT>
1105 typename GT::Arc * mapped_arc(typename GT::Arc * a)
1106 {
1107  return (typename GT::Arc *) ARC_COOKIE(a);
1108 }
1109 
1112  template <class GTSRC, class GTTGT>
1113 typename GTTGT::Node * mapped_node(typename GTSRC::Node * p)
1114 {
1115  return (typename GTTGT::Node *) NODE_COOKIE(p);
1116 }
1119  template <class GTSRC, class GTTGT>
1120 typename GTTGT::Arc * mapped_arc(typename GTSRC::Arc * a)
1121 {
1122  return (typename GTTGT::Arc *) ARC_COOKIE(a);
1123 }
1124 
1143  template <class GT>
1144 void copy_graph(GT & gtgt, GT & gsrc, const bool cookie_map = false);
1145 
1151 template <class GT> inline void clear_graph(GT & g);
1152 
1167  template <class GT, class Operation, class SN = Dft_Show_Node<GT>>
1168 class Operate_On_Nodes
1169 {
1170  SN & sn;
1171 
1172 public:
1173 
1174  Operate_On_Nodes(SN & __sn) : sn(__sn) { /* empty */ }
1175 
1176  Operate_On_Nodes(SN && __sn = SN()) : sn(__sn) { /* empty */ }
1177 
1184  void operator () (GT & g, Operation op = Operation()) const
1185  {
1186  for (Node_Iterator<GT, SN> it(g, sn); it.has_curr(); it.next())
1187  op (g, it.get_curr());
1188  }
1189 
1199  void operator () (GT & g, void * ptr, Operation op = Operation()) const
1200  {
1201  for (Node_Iterator<GT, SN> it(g, sn); it.has_curr(); it.next())
1202  op (g, it.get_curr(), ptr);
1203  }
1204 };
1205 
1220  template <class GT, class Operation,
1221  class SA = Dft_Show_Arc<GT>>
1222 class Operate_On_Arcs
1223 {
1224  SA & sa;
1225 
1226 public:
1227 
1228  Operate_On_Arcs(SA & __sa) : sa(__sa) { /* empty */ }
1229 
1230  Operate_On_Arcs(SA && __sa = SA()) : sa(__sa) { /* empty */ }
1231 
1238  void operator () (GT & g, Operation op = Operation()) const
1239  {
1240  for (Arc_Iterator<GT, SA> it(g, sa); it.has_curr(); it.next())
1241  op (g, it.get_curr());
1242  }
1243 
1252  void operator () (GT & g, void * ptr, Operation op = Operation()) const
1253  {
1254  for (Arc_Iterator<GT, SA> itor(g, sa); itor.has_curr(); itor.next())
1255  op (g, itor.get_curr(), ptr);
1256  }
1257 
1264  void operator () (GT & g, typename GT::Node * p,
1265  Operation op = Operation()) const
1266  {
1267  for (Node_Arc_Iterator<GT, SA> it(p); it.has_curr(); it.next())
1268  op (g, it.get_current_arc());
1269  }
1270 
1280  void operator () (GT & g, typename GT::Node * node,
1281  void * ptr, Operation op = Operation()) const
1282  {
1283  for (Node_Arc_Iterator<GT, SA> it(node); it.has_current(); it.next())
1284  op (g, it.get_current_arc(), ptr);
1285  }
1286 };
1287 
1304  template <class GT>
1305 class Path
1306 {
1307 public:
1308 
1310  typedef typename GT::Node_Type Node_Type;
1312  typedef typename GT::Arc_Type Arc_Type;
1313 
1314 private:
1315 
1316  GT * g;
1317  void * cookie;
1318 
1319  typedef typename GT::Node Node;
1320  typedef typename GT::Arc Arc;
1321 
1322  struct Path_Desc
1323  {
1324  Node * node; // nodo origen
1325  Arc * arc; // arco adyacente
1326  Path_Desc(Node * _node = NULL, Arc * _arc = NULL)
1327  : node(_node), arc(_arc) {}
1328  };
1329 
1331 
1332 public:
1333 
1335  GT & get_graph() { return *g; }
1336 
1337  void *& get_cookie() { return cookie; }
1338 
1340  bool inside_graph(GT & gr) const { return g == &gr; }
1341 
1347  Path(GT & _g, void * __cookie = NULL) : g(&_g), cookie(__cookie) {}
1348 
1350  Path() : g(NULL), cookie(NULL) { /* empty */ }
1351 
1358  void init(Node * start_node) { list.append(Path_Desc(start_node)); }
1359 
1368  Path(GT & _g, Node * start_node, void * __cookie = NULL)
1369  : g(&_g), cookie(__cookie) { init(start_node); }
1370 
1382  void set_graph(GT & __g, Node * start_node = NULL)
1383  {
1384  clear_path();
1385  g = &__g;
1386  if (start_node == NULL)
1387  return;
1388  init(start_node);
1389  }
1390 
1392  const size_t & size() const { return list.size(); }
1393 
1395  bool is_empty() const { return list.is_empty(); }
1396 
1398  void clear_path()
1399  {
1400  while (not list.is_empty())
1401  list.remove_first();
1402  }
1403 
1405  void clear() { clear_path(); }
1406 
1408  Path(const Path & path) : g(path.g), list(path.list) {}
1409 
1411  Path & operator = (const Path & path)
1412  {
1413  if (this == &path)
1414  return *this;
1415 
1416  clear_path();
1417  g = path.g;
1418  list = path.list;
1419  return *this;
1420  }
1421 
1449  void append(Arc * arc)
1450  {
1451  if (list.is_empty())
1452  throw std::domain_error("path is empty");
1453 
1454  Path_Desc & last_path_desc = list.get_last();
1455 
1456  if (g == NULL)
1457  throw std::domain_error("Graph has not been specified");
1458 
1459  last_path_desc.arc = arc;
1460  list.append(Path_Desc(g->get_connected_node(arc, last_path_desc.node)));
1461  }
1462 
1490  void append(Node * node)
1491  {
1492  if (list.is_empty())
1493  {
1494  init(node);
1495  return;
1496  }
1497 
1498  if (g == NULL)
1499  throw std::domain_error("Graph has not been specified");
1500 
1501  Node * last_node = get_last_node();
1502  Arc * arc = search_arc(*g, last_node, node);
1503 
1504  if (arc == NULL)
1505  throw std::domain_error("There is no an arc connecting to the node");
1506 
1507  append(arc);
1508  }
1509 
1536  void insert(Arc * arc)
1537  {
1538  if (list.is_empty())
1539  throw std::domain_error("path is empty");
1540 
1541  if (g == NULL)
1542  throw std::domain_error("Graph has not been specified");
1543 
1544  Path_Desc & first_path_desc = list.get_first();
1545 
1546  Path_Desc item(g->get_connected_node(arc, first_path_desc.node), arc);
1547 
1548  list.insert(item);
1549  }
1550 
1578  void insert(Node * node)
1579  {
1580  if (list.is_empty())
1581  {
1582  init(node);
1583  return;
1584  }
1585 
1586  if (g == NULL)
1587  throw std::domain_error("Graph has not been specified");
1588 
1589  Node * first_node = get_first_node();
1590  Arc * arc = search_arc(*g, node, first_node); // busque arco last_node-node
1591  if (arc == NULL)
1592  throw std::domain_error("There is no arc connecting node");
1593 
1594  insert(arc);
1595  }
1596 
1598  Node * get_first_node() { return list.get_first().node; }
1599 
1601  Node * get_last_node() { return list.get_last().node; }
1602 
1604  Arc * get_first_arc() { return list.get_first().arc; }
1605 
1608  {
1609  if (list.is_unitarian())
1610  throw std::domain_error("Path with only a node (without any arc");
1611 
1612  typename DynDlist<Path_Desc>::Iterator it(list);
1613  it.reset_last();
1614  it.prev();
1615  return it.get_current().arc;
1616  }
1617 
1619  bool is_cycle() const { return get_first_node() == get_last_node(); }
1620 
1623  {
1624  list.remove_last();
1625  list.get_last().arc = NULL;
1626  }
1627 
1630  {
1631  list.remove_first();
1632  }
1633 
1635  void swap(Path & path)
1636  {
1637  std::swap(g, path.g);
1638  list.swap(path.list);
1639  }
1640 
1646  class Iterator : public DynDlist<Path_Desc>::Iterator
1647  {
1648  public:
1649 
1651  Iterator(Path & path) : DynDlist<Path_Desc>::Iterator(path.list) { }
1652 
1653  private:
1654 
1655  Path_Desc & get_curr_path_desc()
1656  {
1658  }
1659 
1660  public:
1661 
1664  Node * get_current_node() { return this->get_curr_path_desc().node; }
1665 
1669  {
1670  if (this->is_in_last())
1671  throw std::overflow_error("Path iterator is in last node of path");
1672 
1673  return this->get_curr_path_desc().arc;
1674  }
1675 
1677  Node * get_current() { return get_current_node(); }
1678 
1680  Node * get_curr() { return get_current_node(); }
1681 
1685  bool has_current_arc() const
1686  {
1687  return this->has_current() and not this->is_in_last();
1688  }
1689 
1691  bool has_current_node() const { return this->has_current(); }
1692  };
1693 
1700  template <class Operation>
1701  void operate_on_nodes(Operation && op = Operation())
1702  {
1703  for (Iterator it(*this); it.has_current(); it.next())
1704  op (it.get_current_node());
1705  }
1706 
1713  template <class Operation>
1714  void operate_on_arcs(Operation && op = Operation())
1715  {
1716  for (Iterator it(*this); it.has_current(); it.next())
1717  op (it.get_current_arc());
1718  }
1719 
1730  template <class Operation>
1731  void operate_on_nodes(void * ptr)
1732  {
1733  for (Iterator it(*this); it.has_current_node(); it.next())
1734  Operation(ptr) (it.get_current_node());
1735  }
1736 
1747  template <class Operation>
1748  void operate_on_arcs(void * ptr)
1749  {
1750  for (Iterator it(*this); it.has_current_arc(); it.next())
1751  Operation(ptr) (it.get_current_arc());
1752  }
1753 
1755  bool contains_node(Node * node)
1756  {
1757  for (Iterator it(*this); it.has_current_node(); it.next())
1758  if (it.get_current_node() == node)
1759  return true;
1760  return false;
1761  }
1762 
1764  bool contains_arc(Arc * arc)
1765  {
1766  for (Iterator it(*this); it.has_current_arc(); it.next())
1767  if (it.get_current_arc() == arc)
1768  return true;
1769  return false;
1770  }
1771 };
1772 
1773  template <class GT, class SA = Dft_Show_Arc<GT>> inline
1774 bool find_path_depth_first(GT & g, typename GT::Node * start_node,
1775  typename GT::Node * end_node, Path<GT> & path);
1776 
1777  template <class GT, class SA> inline
1778 bool __find_path_depth_first(GT& g, typename GT::Node * curr_node,
1779  typename GT::Arc * curr_arc,
1780  typename GT::Node * end_node, Path<GT> & curr_path)
1781 {
1782  if (curr_node == end_node) // ¿se alcanzó nodo final?
1783  { // sí, terminar añadir el arco y terminar
1784  curr_path.append(curr_arc);
1785  return true;
1786  }
1787 
1788  if (IS_NODE_VISITED(curr_node, Find_Path)) // ¿ha sido visitado?
1789  return false; // sí ==> desde él no hay camino
1790 
1791  curr_path.append(curr_arc); // añadir curr_arc al camino
1792  NODE_BITS(curr_node).set_bit(Find_Path, true);
1793 
1794  // buscar recursivamente a través de arcos de curr_node
1795  for (Node_Arc_Iterator<GT, SA> i(curr_node); i.has_current(); i.next())
1796  {
1797  typename GT::Arc * next_arc = i.get_current_arc();
1798  if (IS_ARC_VISITED(next_arc, Find_Path))
1799  continue;
1800 
1801  ARC_BITS(next_arc).set_bit(Find_Path, true);
1802  typename GT::Node * next_node = i.get_tgt_node();
1803  if (__find_path_depth_first<GT, SA> (g, next_node, next_arc,
1804  end_node, curr_path))
1805  {
1806  I(curr_path.get_last_node() == end_node);
1807 
1808  return true; // se encontró camino
1809  }
1810  }
1811 
1812  curr_path.remove_last_node();
1813 
1814  return false;
1815 }
1816 
1847  template <class GT, class SA = Dft_Show_Arc<GT>> inline
1848 bool find_path_depth_first(GT & g, typename GT::Node * start_node,
1849  typename GT::Node * end_node, Path<GT> & path)
1850 {
1851  if (not path.inside_graph(g))
1852  throw std::invalid_argument("Path does not belong to graph");
1853 
1854  path.clear_path();
1855  path.init(start_node);
1856  g.reset_bit_nodes(Find_Path);
1857  g.reset_bit_arcs(Find_Path);
1858  NODE_BITS(start_node).set_bit(Find_Path, true);
1859 
1860  // explorar recursivamente cada arco de start_node
1861  for (Node_Arc_Iterator<GT, SA> i(start_node); i.has_current(); i.next())
1862  {
1863  typename GT::Arc * arc = i.get_current_arc();
1864  ARC_BITS(arc).set_bit(Find_Path, true);
1865  typename GT::Node * next_node = i.get_tgt_node();
1866  if (IS_NODE_VISITED(next_node, Find_Path))
1867  continue;
1868 
1869  if (__find_path_depth_first<GT, SA>(g, next_node, arc, end_node, path))
1870  return true;
1871  }
1872 
1873  return false;
1874 }
1875 
1876  template <class GTS, class GTT>
1877 void map_nodes(typename GTS::Node * p, typename GTT::Node * q)
1878 {
1879  I(p != NULL and q != NULL);
1880 
1881  if (NODE_COOKIE(p) == NULL)
1882  {
1883  NODE_COOKIE(p) = q;
1884  NODE_COOKIE(q) = p;
1885  return;
1886  }
1887 
1888  NODE_COOKIE(q) = NODE_COOKIE(p);
1889  NODE_COOKIE(p) = q;
1890 }
1891 
1892  template <class GTS, class GTT>
1893 void map_arcs(typename GTS::Arc * p, typename GTT::Arc * q)
1894 {
1895  I(p != NULL and q != NULL);
1896 
1897  if (ARC_COOKIE(p) == NULL)
1898  {
1899  ARC_COOKIE(p) = q;
1900  ARC_COOKIE(q) = p;
1901 
1902  return;
1903  }
1904 
1905  ARC_COOKIE(q) = ARC_COOKIE(p);
1906  ARC_COOKIE(p) = q;
1907 }
1908 
1910 //
1911 // Implementaciones de métodos de List_Graph
1912 //
1914 
1915  template <typename Node, typename Arc>
1917 {
1918  if (Base_Graph::num_nodes == 0)
1919  throw std::range_error("Graph has not nodes");
1920 
1921  return dlink_to_node(node_list.get_next());
1922 }
1923 
1924  template <typename Node, typename Arc>
1926 {
1927  if (Base_Graph::num_arcs == 0)
1928  throw std::range_error("Graph has not arcs");
1929 
1930  return dlink_to_arc(arc_list.get_next());
1931 }
1932 
1933  template <typename Node, typename Arc>
1934 Arc * List_Graph<Node, Arc>::get_first_arc(Node * node)
1935 {
1936  if (get_num_arcs(node) == 0)
1937  throw std::range_error("node has not arcs");
1938 
1939  void * arc = dlink_to_arc_node(node->arc_list.get_next())->arc;
1940  return reinterpret_cast <Arc *> (arc);
1941 }
1942  template <typename Node, typename Arc>
1944  : Dlink::Iterator(&_g.node_list)
1945 {
1946  // empty
1947 }
1948 
1949  template <typename Node, typename Arc>
1951 {
1952  return dlink_to_node(Dlink::Iterator::get_current());
1953 }
1954 
1955  template <typename Node, typename Arc>
1957  : Dlink::Iterator(&_g.arc_list)
1958 {
1959  // empty
1960 }
1961 
1962  template <typename Node, typename Arc>
1964 {
1965  return dlink_to_arc(Dlink::Iterator::get_current());
1966 }
1967 
1968  template <typename Node, typename Arc>
1970 {
1971  return static_cast<Arc*>(get_current_arc_node()->arc);
1972 }
1973 
1974  template <typename Node, typename Arc>
1976 {
1977  return static_cast<Node*>(get_current_arc()->get_connected_node(src_node));
1978 }
1979 
1980  template <typename Node, typename Arc>
1981 Node * List_Graph<Node, Arc>::insert_node(Node * node)
1982 {
1983  ++Base_Graph::num_nodes;
1984  node_list.append(node);
1985  return node;
1986 }
1987 
1988  template <typename Node, typename Arc> Node *
1989 List_Graph<Node, Arc>::insert_node(const typename Node::Node_Type & node_info)
1990 {
1991  return List_Graph<Node, Arc>::insert_node( new Node (node_info) );
1992 }
1993 
1994  template <typename Node, typename Arc> Node *
1995 List_Graph<Node, Arc>::insert_node(typename Node::Node_Type && node_info)
1996 {
1998  (new Node (std::move(node_info)) );
1999 }
2000 
2001  template <typename Node, typename Arc> Arc *
2002 List_Graph<Node, Arc>::insert_arc(Node * src_node, Node * tgt_node)
2003 {
2004  // paso 1: apartar memoria para Arc e iniciar
2005  unique_ptr<Arc> arc ( new Arc ); // apartar memoria para arco
2006  arc->src_node = src_node; // Iniciar sus campos
2007  arc->tgt_node = tgt_node;
2008 
2009  // paso 3: (parcial): apartar Arc_Node de src_node
2010  unique_ptr<Arc_Node> src_arc_node (new Arc_Node (arc.get()));
2011 
2012  // paso 2: si es grafo ==> apartar Arc_Node de tgt_node
2013  if (not Base_Graph::digraph) // si es digrafo ==> no insertar en otro nodo
2014  { // inserción en nodo destino
2015  if (src_node == tgt_node) // ¿es un lazo?
2016  arc->tgt_arc_node = src_arc_node.get();
2017  else
2018  { // apartar arco nodo para tgt_node
2019  unique_ptr<Arc_Node> tgt_arc_node(new Arc_Node(arc.get()));
2020 
2021  // inserción en lista de adyacencia de tgt_node
2022  arc->tgt_arc_node = tgt_arc_node.get();
2023  tgt_node->arc_list.append(tgt_arc_node.get());
2024  tgt_node->num_arcs++;
2025  tgt_arc_node.release();
2026  }
2027  }
2028 
2029  // paso 3 (resto): inserción en lista adyacencia src_node
2030  arc->src_arc_node = src_arc_node.get();
2031  src_node->arc_list.append(src_arc_node.get());
2032  src_node->num_arcs++;
2033 
2034  arc_list.append(arc.get()); //paso 4:insertar en lista arcos grafo
2035  ++Base_Graph::num_arcs;
2036  src_arc_node.release();
2037 
2038  return arc.release();
2039 }
2040 
2041 
2042  template <typename Node, typename Arc>
2043 Arc * List_Graph<Node, Arc>::connect_arc(Arc * arc)
2044 {
2045  Node * src_node = get_src_node(arc);
2046  Node * tgt_node = get_tgt_node(arc);
2047  Arc_Node * src_arc_node = arc->src_arc_node;
2048  Arc_Node * tgt_arc_node = arc->tgt_arc_node;
2049 
2050  if (not Base_Graph::digraph) // si es digrafo ==> no hay que insertar en el otro nodo
2051  { // inserción en nodo destino
2052  if (src_node != tgt_node) // verificar si se trata de un ciclo
2053  { // inserción en lista de adyacencia de tgt_node
2054  tgt_node->arc_list.append(tgt_arc_node);
2055  tgt_node->num_arcs++;
2056  }
2057  }
2058 
2059  src_node->arc_list.append(src_arc_node);
2060  src_node->num_arcs++;
2061  arc_list.append(arc);
2062  ++Base_Graph::num_arcs;
2063 
2064  return arc;
2065 }
2066 
2067  template <typename Node, typename Arc> Arc *
2068 List_Graph<Node, Arc>::insert_arc(Node * src_node, Node * tgt_node,
2069  const typename Arc::Arc_Type & arc_info)
2070 {
2071  Arc * arc = List_Graph<Node, Arc>::insert_arc(src_node, tgt_node);
2072  arc->get_info() = arc_info;
2073 
2074  return arc;
2075 }
2076 
2077  template <typename Node, typename Arc> Arc *
2078 List_Graph<Node, Arc>::insert_arc(Node * src_node, Node * tgt_node,
2079  typename Arc::Arc_Type && arc_info)
2080 {
2081  Arc * arc = List_Graph<Node, Arc>::insert_arc(src_node, tgt_node);
2082  arc->get_info() = std::move(arc_info);
2083 
2084  return arc;
2085 }
2086 
2087 
2088  template <typename Node, typename Arc>
2089 void List_Graph<Node, Arc>::remove_arc(Arc * arc)
2090 { // paso 1: eliminar Arc_node de src_node
2091  Node * src_node = get_src_node(arc);
2092  Arc_Node * src_arc_node = arc->src_arc_node;
2093 
2094  src_arc_node->del(); // desenlaza src_node de la lista de nodos
2095  src_node->num_arcs--; // decrementa contador de arcos de src_node
2096  delete src_arc_node; // entrega memoria
2097 
2098  if (not Base_Graph::digraph)
2099  { // eliminación arco en nodo destino
2100  Node * tgt_node = get_tgt_node(arc);
2101  if (src_node != tgt_node) // verificar eliminación de ciclo
2102  { // paso 2: eliminar Arc_node de tgt_node
2103  Arc_Node * tgt_arc_node = arc->tgt_arc_node;
2104  tgt_arc_node->del();
2105  tgt_node->num_arcs--;
2106  delete tgt_arc_node;
2107  }
2108  }
2109 
2110  // eliminación de arco del grafo
2111  arc->del(); // desenlazar arc de lista de arcos de grafo
2112  --Base_Graph::num_arcs;
2113  delete arc;
2114 }
2115 
2116  template <typename Node, typename Arc>
2118 { // paso (1): eliminación del Arc_node del nodo origen src_node
2119  Node * src_node = get_src_node(arc);
2120  Arc_Node * src_arc_node = arc->src_arc_node;
2121  src_arc_node->del(); // desenlaza src_node de la lista de nodos
2122  src_node->num_arcs--; // decrementa contador de arcos de src_node
2123 
2124  if (not Base_Graph::digraph)
2125  { // eliminación arco en nodo destino
2126  Node * tgt_node = get_tgt_node(arc);
2127  if (src_node != tgt_node) // verificar eliminación de ciclo
2128  { // paso (2): eliminación del Arc_node del nodo destino tgt_node
2129  Arc_Node * tgt_arc_node = arc->tgt_arc_node;
2130  tgt_arc_node->del();
2131  tgt_node->num_arcs--;
2132  }
2133  }
2134 
2135  // eliminación de arco del grafo
2136  arc->del(); // desenlazar arc de la lista de arcos del grafo
2137  --Base_Graph::num_arcs;
2138 }
2139 
2140  template <typename Node, typename Arc>
2141 void List_Graph<Node, Arc>::remove_node(Node * node)
2142 {
2143  if (not Base_Graph::digraph)
2144  // Eliminar arcos adyacentes a node
2145  while (not node->arc_list.is_empty()) // mientras queden arcos
2146  { // obtener Arc_Node
2147  Arc_Node * arc_node =
2148  dlink_to_arc_node(node->arc_list.get_next());
2149  Arc * arc = void_to_arc(arc_node); // obtener el arco
2150  remove_arc(arc); // eliminarlo del grafo
2151  }
2152  else
2153  for (Arc_Iterator it(*this); it.has_current();)
2154  {
2155  Arc * arc = it.get_current();
2156  if (get_src_node(arc) == node or get_tgt_node(arc) == node)
2157  {
2158  it.next();
2159  remove_arc(arc);
2160  }
2161  else
2162  it.next();
2163  }
2164 
2165  // en este punto el nodo ya no tiene arcos
2166  node->del(); // desenlazar nodo de lista de nodos del grafo
2167  --Base_Graph::num_nodes;
2168  delete node;
2169 }
2170 
2171  template <typename Node, typename Arc>
2173 {
2174  Base_Graph::init();
2175  copy_graph(*this, const_cast<List_Graph<Node, Arc> &>(g));
2176 }
2177 
2178  template <typename Node, typename Arc>
2180 {
2181  Base_Graph::init();
2182  swap(g);
2183 }
2184 
2185  template <typename Node, typename Arc>
2187  (const List_Graph<Node, Arc> & g)
2188 {
2189  copy_graph(*this, const_cast<List_Graph<Node, Arc> &>(g));
2190 
2191  return *this;
2192 }
2193 
2194 
2195  template <typename Node, typename Arc>
2196 List_Graph<Node, Arc> & List_Graph<Node, Arc>::operator =
2197  (List_Graph<Node, Arc> && g)
2198 {
2199  swap(g);
2200  return *this;
2201 }
2202 
2203  template <typename Node, typename Arc>
2205 {
2206  clear_graph(*this);
2207 }
2208 
2209  template <typename Node, typename Arc>
2210  template <class Compare>
2211 void List_Graph<Node, Arc>::sort_arcs(Compare && cmp)
2212 {
2213  mergesort<Dlink, Cmp_Arc<Compare>>(arc_list, Cmp_Arc<Compare>(cmp));
2214 }
2215 
2216  template <typename Node, typename Arc>
2217  template <class Compare>
2218 void List_Graph<Node, Arc>::sort_arcs(Compare & cmp)
2219 {
2220  Cmp_Arc<Compare> comp(cmp);
2221  mergesort<Dlink, Cmp_Arc<Compare>>(arc_list, comp);
2222 }
2223 
2224 GRAPH_METHODS_IMPLS(List_Graph);
2225 
2226  template <class GT, class SA>
2227 typename GT::Arc * search_arc(GT & g,
2228  typename GT::Node * src, typename GT::Node * tgt)
2229 {
2230  I(src != NULL and tgt != NULL);
2231 
2232  // escoger nodo con menos arcos
2233  if (not g.is_digraph() and tgt->num_arcs < src->num_arcs)
2234  std::swap(tgt, src);
2235 
2236  for (Node_Arc_Iterator<GT, SA> itor(src); itor.has_curr(); itor.next())
2237  if (itor.get_tgt_node() == tgt)
2238  return itor.get_current_arc();
2239 
2240  return NULL;
2241 }
2242 
2243 
2244  template <class GT>
2245 typename GT::Arc * search_arc(GT & g, typename GT::Node * src_node,
2246  typename GT::Node * tgt_node)
2247 {
2248  return search_arc<GT, Dft_Show_Arc<GT>>(g, src_node, tgt_node);
2249 }
2250 
2251  template <class GT>
2252 void clear_graph(GT & g)
2253 {
2254  for (typename GT::Arc_Iterator it(g); it.has_current(); ) // eliminar arcos
2255  {
2256  typename GT::Arc * arc = it.get_current();
2257  it.next();
2258  g.remove_arc(arc);
2259  }
2260 
2261  for (typename GT::Node_Iterator it(g); it.has_current(); ) // eliminar nodos
2262  {
2263  typename GT::Node * p = it.get_current();
2264  it.next(); // avanzar antes de borrar (consistencia iterador)
2265  g.remove_node(p); // eliminarlo del grafo
2266  }
2267 }
2268 
2269 
2270  template <class GT>
2271 void copy_graph(GT & gtgt, GT & gsrc, const bool cookie_map)
2272 {
2273  IG(not gtgt.is_digraph() and gsrc.is_digraph(),
2274  gtgt.is_digraph() != gsrc.is_digraph());
2275 
2276  try
2277  {
2278  clear_graph(gtgt); // limpiar this antes de copiar
2280 
2281  // fase 1: recorrer nodos de src_graph e insertar copia en this
2282  for (typename GT::Node_Iterator it(gsrc); it.has_curr(); it.next())
2283  {
2284  typename GT::Node * src_node = it.get_current_node();
2285  unique_ptr<typename GT::Node>
2286  tgt_node(new typename GT::Node(src_node));
2287  map.insert(src_node, tgt_node.get());
2288 
2289  typename GT::Node * tgt = tgt_node.release();
2290  gtgt.insert_node(tgt); // insertar en grafo destino
2291 
2292  if (cookie_map)
2293  GT::map_nodes(src_node, tgt);
2294  }
2295 
2296  I(gtgt.get_num_nodes() == gsrc.get_num_nodes());
2297 
2298  // fase 2: por cada arco de src_graph, crear en this un
2299  // arco que conecte a los nodos mapeados de map
2300  for (typename GT::Arc_Iterator it(gsrc); it.has_current(); it.next())
2301  {
2302  typename GT::Arc * src_arc = it.get_current_arc();
2303 
2304  // obtener imágenes de nodos en el grafo destino y crear arco
2305  typename GT::Node * src_node = map(gsrc.get_src_node(src_arc));
2306  typename GT::Node * tgt_node = map(gsrc.get_tgt_node(src_arc));
2307  typename GT::Arc * tgt_arc = gtgt.insert_arc(src_node, tgt_node);
2308  tgt_arc->get_info() = src_arc->get_info();
2309  if (cookie_map)
2310  GT::map_arcs(src_arc, tgt_arc);
2311  }
2312 
2313  I(gtgt.get_num_arcs() == gsrc.get_num_arcs());
2314  }
2315  catch (...)
2316  { // Si ocurre excepción se limpia this
2317  clear_graph(gtgt);
2318  throw;
2319  }
2320 }
2321 
2322  template <class GTT, class GTS>
2323 struct Dft_Copy_Node
2324 {
2325  void operator () (typename GTT::Node * tgt, typename GTS::Node * src)
2326  {
2327  tgt->get_info() = src->get_info();
2328  }
2329 };
2330 
2331 
2332  template <class GTT, class GTS>
2333 struct Dft_Copy_Arc
2334 {
2335  void operator () (typename GTT::Arc * tgt, typename GTS::Arc * src)
2336  {
2337  tgt->get_info() = src->get_info();
2338  }
2339 };
2340 
2345  template <class GTT, class GTS,
2346  class Copy_Node = Dft_Copy_Node<GTT, GTS>,
2347  class Copy_Arc = Dft_Copy_Arc<GTT, GTS>>
2348 void inter_copy_graph(GTT & gtgt, GTS & gsrc, const bool cookie_map = false)
2349 {
2350  IG(not gtgt.is_digraph() and gsrc.is_digraph(),
2351  gtgt.is_digraph() != gsrc.is_digraph());
2352 
2353  try
2354  {
2355  clear_graph(gtgt); // limpiar this antes de copiar
2357 
2358  // fase 1: recorrer nodos de src_graph e insertar copia en this
2359  for (typename GTS::Node_Iterator it(gsrc); it.has_current(); it.next())
2360  {
2361  typename GTS::Node * src_node = it.get_current_node();
2362  unique_ptr<typename GTT::Node> tgt_node(new typename GTT::Node);
2363  Copy_Node () (tgt_node.get(), src_node);
2364  map.insert(src_node, tgt_node.get());
2365 
2366  typename GTT::Node * tgt = tgt_node.release();
2367  gtgt.insert_node(tgt); // insertar en grafo destino
2368 
2369  if (cookie_map)
2370  map_nodes<GTS, GTT>(src_node, tgt);
2371  }
2372 
2373  I(gtgt.get_num_nodes() == gsrc.get_num_nodes());
2374 
2375  // fase 2: por cada arco de src_graph, crear en this un
2376  // arco que conecte a los nodos mapeados de map
2377  for (typename GTS::Arc_Iterator it(gsrc); it.has_current(); it.next())
2378  {
2379  typename GTS::Arc * src_arc = it.get_current_arc();
2380 
2381  // obtener imágenes de nodos en el grafo destino y crear arco
2382  typename GTT::Node * src_node = map[gsrc.get_src_node(src_arc)];
2383  typename GTT::Node * tgt_node = map[gsrc.get_tgt_node(src_arc)];
2384  typename GTT::Arc * tgt_arc = gtgt.insert_arc(src_node, tgt_node);
2385  Copy_Arc () (tgt_arc, src_arc);
2386  if (cookie_map)
2387  map_arcs<GTS, GTT>(src_arc, tgt_arc);
2388  }
2389 
2390  I(gtgt.get_num_arcs() == gsrc.get_num_arcs());
2391  }
2392  catch (...)
2393  { // Si ocurre excepción se limpia this
2394  clear_graph(gtgt);
2395  throw;
2396  }
2397 }
2398 
2399 
2419 template <class GT,
2420  class SN = Dft_Show_Node<GT>,
2421  class SA = Dft_Show_Arc<GT>
2422  >
2423 class Copy_Graph
2424 {
2425  SN & sn;
2426  SA & sa;
2427 
2428 public:
2429 
2435  Copy_Graph(SA & __sa, SN & __sn)
2436  : sn(__sn), sa(__sa)
2437  {
2438  // empty
2439  }
2440 
2442  Copy_Graph(SA && __sa = SA(), SN && __sn = SN())
2443  : sn(__sn), sa(__sa)
2444  {
2445  // empty
2446  }
2447 
2449  Copy_Graph(SA & __sa, SN && __sn = SN())
2450  : sn(__sn), sa(__sa)
2451  {
2452  // empty
2453  }
2454 
2455 private:
2456 
2457  void copy(GT & gtgt, GT & gsrc, const bool cookie_map)
2458  {
2459  IG(not gtgt.is_digraph() and gsrc.is_digraph(),
2460  gtgt.is_digraph() != gsrc.is_digraph());
2461 
2462  try
2463  {
2464  clear_graph(gtgt); // limpiar this antes de copiar
2466 
2467  // fase 1: recorrer nodos de src_graph e insertar copia en this
2468  for (Node_Iterator<GT, SN> it(gsrc, sn); it.has_curr(); it.next())
2469  {
2470  typename GT::Node * src_node = it.get_curr();
2471  unique_ptr<typename GT::Node>
2472  tgt_node(new typename GT::Node(src_node));
2473  map.insert(src_node, tgt_node.get());
2474 
2475  typename GT::Node * tgt = tgt_node.release();
2476  gtgt.insert_node(tgt); // insertar en grafo destino
2477 
2478  if (cookie_map)
2479  GT::map_nodes(src_node, tgt);
2480  }
2481 
2482  // fase 2: por cada arco de src_graph, crear en this un
2483  // arco que conecte a los nodos mapeados de map
2484  for (Arc_Iterator<GT, SA> it(gsrc, sa); it.has_curr(); it.next())
2485  {
2486  typename GT::Arc * src_arc = it.get_curr();
2487 
2488  // obtener imágenes de nodos en el grafo destino y crear arco
2489  typename GT::Node * src_node = map[gsrc.get_src_node(src_arc)];
2490  typename GT::Node * tgt_node = map[gsrc.get_tgt_node(src_arc)];
2491  typename GT::Arc * tgt_arc =
2492  gtgt.insert_arc(src_node, tgt_node, src_arc->get_info());
2493 
2494  if (cookie_map)
2495  GT::map_arcs(src_arc, tgt_arc);
2496  }
2497  }
2498  catch (...)
2499  { // Si ocurre excepción se limpia this
2500  clear_graph(gtgt);
2501  throw;
2502  }
2503  }
2504 
2505 public:
2506 
2519  void operator () (GT & gtgt, GT & gsrc, const bool cookie_map = true)
2520  {
2521  copy(gtgt, gsrc, cookie_map);
2522  }
2523 };
2524 
2525 } // end namespace Aleph
2526 
2527 # endif /* TPL_GRAPH_H */
Definition: tpl_graph.H:2657
void operate_on_arcs(void *ptr)
Definition: tpl_graph_try.H:1748
Copy_Graph(SA &__sa, SN &__sn)
Definition: tpl_graph_try.H:2435
Node_Arc_Iterator(Node *src)
Instancia un iterador sobre el nodo _src_node.
Definition: tpl_graph_try.H:588
void inter_copy_graph(GTT &gtgt, GTS &gsrc, const bool cookie_map=false)
Definition: tpl_graph.H:2582
Definition: tpl_graph.H:29
virtual void remove_node(Node *node)
Definition: tpl_graph.H:2375
Node * get_current()
Definition: tpl_graph_try.H:559
const size_t & size() const
Retorna la longitud del camino en nodos.
Definition: tpl_graph_try.H:1392
Node_Iterator(GT &g, Show_Node &sn)
Definition: tpl_graph_try.H:881
void insert(Node *node)
Definition: tpl_graph_try.H:1578
Node * get_first_node() const
Definition: tpl_graph.H:2150
virtual void remove_arc(Arc *arc)
Definition: tpl_graph.H:2323
void sort_arcs(Compare &&cmp=Compare())
Definition: tpl_graph.H:2445
#define NODE_COOKIE(p)
Definition: aleph-graph.H:248
virtual ~List_Graph()
Definition: tpl_graph.H:2438
Definition: tpl_dynMapTree.H:260
Path()
Constructor vacío.
Definition: tpl_graph_try.H:1350
Node * Set_Type
El tipo de conjunto sobre el cual se itera.
Definition: tpl_graph_try.H:582
Out_Iterator(typename GT::Node *p, Show_Arc &&sa=Show_Arc())
Definition: tpl_graph_try.H:982
Definition: tpl_graph.H:38
Definition: tpl_graph.H:21
bool is_cycle() const
Retorna true si el camino conforma un ciclo.
Definition: tpl_graph_try.H:1619
Definition: tpl_graph.H:217
Node * get_last_node()
Retorna el último nodo del camino.
Definition: tpl_graph_try.H:1601
bool is_empty() const
Retorna true si el camino está vacío.
Definition: tpl_graph_try.H:1395
size_type size()
Retorna la cantidad de elementos que tiene la lista.
Definition: List.H:340
Node * Item_Type
Tipo de elemento que retorna get_current()
Definition: tpl_graph_try.H:546
Arc * get_current()
Retorna un puntero al arco actual.
Definition: tpl_graph_try.H:637
Definition: tpl_graph.H:751
Definition: tpl_graph.H:2567
Definition: tpl_graph.H:1389
Node * get_curr()
Definition: tpl_graph_try.H:562
Path(const Path &path)
Constructor copia de camino; todos los nodos y arcos se copian.
Definition: tpl_graph_try.H:1408
void insert(Arc *arc)
Definition: tpl_graph_try.H:1536
Arc * get_curr()
Definition: tpl_graph_try.H:640
#define IS_NODE_VISITED(p, bit)
Definition: aleph-graph.H:242
void swap(list &c)
Definition: List.H:486
void operate_on_nodes(Operation &&op=Operation())
Definition: tpl_graph_try.H:1701
Node * get_src_node()
Retorna el nodo origen del arco actual (sólo cuenta si es digrafo)
Definition: tpl_graph_try.H:643
Arc * get_current_arc() const
Retorna un puntero al arco actual.
In_Iterator(typename GT::Node *p, Show_Arc &&sa=Show_Arc())
Definition: tpl_graph_try.H:1029
Itor::Set_Type Set_Type
El tipo de conjunto sobre el cual se itera.
Definition: tpl_graph_try.H:861
List_Graph Set_Type
El tipo de conjunto sobre el cual se itera.
Definition: tpl_graph_try.H:549
Itor::Item_Type Item_Type
Tipo de elemento que retorna get_current()
Definition: tpl_graph_try.H:858
Node * get_current()
Definition: tpl_graph_try.H:1677
Copy_Graph(SA &__sa, SN &&__sn=SN())
Definition: tpl_graph_try.H:2449
#define ARC_COOKIE(p)
Definition: aleph-graph.H:281
Copy_Graph(SA &&__sa=SA(), SN &&__sn=SN())
Definition: tpl_graph_try.H:2442
Definition: tpl_graph.H:794
Node_Arc_Iterator()
Instancia un iterador vacío (inválido).
Definition: tpl_graph_try.H:585
Arc * get_current_arc()
Definition: tpl_graph_try.H:1668
bool inside_graph(GT &gr) const
retorna true si el camino this refiere al grafo gr
Definition: tpl_graph_try.H:1340
Arc_Iterator(GT &g, Show_Arc &sa)
Definition: tpl_graph_try.H:818
bool contains_arc(Arc *arc)
Retorna true si nodo pertenece al camino; false de lo contrario.
Definition: tpl_graph_try.H:1764
Itor::Item_Type Item_Type
Tipo de elemento que retorna get_current()
Definition: tpl_graph_try.H:744
void clear_graph(GT &g)
Definition: tpl_graph.H:2486
#define IS_ARC_VISITED(p, bit)
Definition: aleph-graph.H:275
It::Item_Type Item_Type
Tipo de elemento que retorna get_current()
Definition: filter_iterator.H:93
Itor::Set_Type Set_Type
El tipo de conjunto sobre el cual se itera.
Definition: tpl_graph_try.H:798
Definition: tpl_graph.H:1186
Out_Iterator(typename GT::Node *p, Show_Arc &sa)
Definition: tpl_graph_try.H:993
Definition: tpl_graph.H:26
Node_Arc_Iterator(typename GT::Node *p, Show_Arc &sa)
Definition: tpl_graph_try.H:767
bool find_path_depth_first(GT &g, typename GT::Node *start_node, typename GT::Node *end_node, Path< GT > &path)
Definition: tpl_graph.H:2082
Node_Arc_Iterator(typename GT::Node *p, Show_Arc &&sa=Show_Arc())
Definition: tpl_graph_try.H:756
Arc * get_last_arc()
Retorna el último arco del camino.
Definition: tpl_graph_try.H:1607
List_Graph & operator=(const List_Graph &g)
Definition: tpl_graph.H:2421
void remove_first_node()
Elimina el primer nodo del camino.
Definition: tpl_graph_try.H:1629
void swap(Path &path)
Intercambias los contenidos del camino this con el de path.
Definition: tpl_graph_try.H:1635
GT::Arc_Type Arc_Type
El tipo de atributo que contienen los arcos del camino.
Definition: tpl_graph_try.H:1312
void remove_last_node()
Elimina el último nodo del camino.
Definition: tpl_graph_try.H:1622
Definition: tpl_graph.H:582
void operate_on_nodes(void *ptr)
Definition: tpl_graph_try.H:1731
Graph_Node()
Definition: tpl_graph_try.H:97
Definition: tpl_graph.H:634
void next()
Adelanta el iterador una posición.
Definition: filter_iterator.H:143
Graph_Node(const Node_Info &info)
Definition: tpl_graph_try.H:128
In_Iterator(typename GT::Node *p, Show_Arc &sa)
Definition: tpl_graph_try.H:1040
Arc * get_current_arc() const
Retorna el arco actual.
Definition: tpl_aleph_graph.H:373
Arc * Item_Type
Tipo de elemento que retorna get_current()
Definition: tpl_graph_try.H:624
Node * get_last_node() const
Retorna el último nodo del camino.
Definition: tpl_graph.H:1823
Node * get_first_node()
Retorna el primer nodo del camino.
Definition: tpl_graph_try.H:1598
Definition: tpl_graph.H:504
virtual Arc * insert_arc(Node *src_node, Node *tgt_node, const typename Arc::Arc_Type &arc_info)
Definition: tpl_graph.H:2302
Path(GT &_g, Node *start_node, void *__cookie=NULL)
Definition: tpl_graph_try.H:1368
bool has_current_arc() const
Definition: tpl_graph_try.H:1685
#define NODE_BITS(p)
Definition: aleph-graph.H:221
Definition: tpl_graph.H:1233
Node * get_curr()
Definition: tpl_graph_try.H:1680
Iterator(Path &path)
Instancia un iterador sobre el camino path.
Definition: tpl_graph_try.H:1651
Definition: tpl_graph.H:644
Arc * get_current()
Definition: tpl_graph_try.H:598
void init(Node *start_node)
Definition: tpl_graph_try.H:1358
void clear_path()
Limpia el camino (se eliminan todos sus nodos y arcos).
Definition: tpl_graph_try.H:1398
GT::Node_Type Node_Type
El tipo de atributo que contienen los nodos del camino.
Definition: tpl_graph_try.H:1310
virtual Arc * connect_arc(Arc *arc)
Definition: tpl_graph.H:2277
Definition: tpl_aleph_graph.H:244
Definition: tpl_graph.H:19
Definition: tpl_graph.H:814
GT & get_graph()
Obtiene una referencia al grafo sobre el cual se encuentra el camino.
Definition: tpl_graph_try.H:1335
Arc * get_first_arc() const
Definition: tpl_graph.H:2159
#define ARC_BITS(p)
Definition: aleph-graph.H:266
void operate_on_arcs(Operation &&op=Operation())
Definition: tpl_graph_try.H:1714
void copy_graph(GT &gtgt, GT &gsrc, const bool cookie_map=false)
Definition: tpl_graph.H:2505
Arc_Iterator(GT &g, Show_Arc &&sa=Show_Arc())
Definition: tpl_graph_try.H:807
Arc * Item_Type
El tipo de dato que retorna get_current().
Definition: tpl_graph_try.H:579
T & get_current() const
Retorna el elemento actual del iterador.
Definition: tpl_dynDlist.H:427
Node * get_current_node()
Definition: tpl_graph_try.H:1664
Graph_Node(Graph_Node *node)
Definition: tpl_graph_try.H:155
Arc * get_first_arc()
Retorna el primer arco del camino.
Definition: tpl_graph_try.H:1604
GT::Arc * search_arc(GT &g, typename GT::Node *src_node, typename GT::Node *tgt_node)
Definition: tpl_graph.H:2461
Definition: tpl_graph.H:32
Node_Iterator(GT &g, Show_Node &&sn=Show_Node())
Definition: tpl_graph_try.H:870
Definition: filter_iterator.H:42
virtual void disconnect_arc(Arc *arc)
Definition: tpl_graph.H:2351
iterator insert(const iterator &pos, const T &value)
Definition: List.H:525
Path(GT &_g, void *__cookie=NULL)
Definition: tpl_graph_try.H:1347
bool contains_node(Node *node)
Retorna true si nodo pertenece al camino; false de lo contrario.
Definition: tpl_graph_try.H:1755
Definition: Map.H:56
void append(Arc *arc)
Definition: tpl_graph_try.H:1449
Definition: tpl_graph.H:694
Itor::Item_Type Item_Type
Tipo de elemento que retorna get_current()
Definition: tpl_graph_try.H:795
List_Graph Set_Type
El tipo de conjunto sobre el cual se itera.
Definition: tpl_graph_try.H:627
Node * get_tgt_node() const
Retorna el nodo destino del arco actual.
Key * insert(const Key &key, const Type &data)
Definition: tpl_dynMapTree.H:74
Definition: tpl_graph.H:35
Definition: tpl_aleph_graph.H:187
Definition: List.H:23
Definition: tpl_graph.H:1868
void clear()
Definition: tpl_graph_try.H:1405
Node * get_current_node()
retorna el nodo actual.
Itor::Set_Type Set_Type
El tipo de conjunto sobre el cual se itera.
Definition: tpl_graph_try.H:747
void set_graph(GT &__g, Node *start_node=NULL)
Definition: tpl_graph_try.H:1382
void append(Node *node)
Definition: tpl_graph_try.H:1490
Definition: tpl_graph.H:2557
bool has_current_node() const
Retorna true si el iterador tiene nodo actual; false de lo contrario.
Definition: tpl_graph_try.H:1691
Definition: tpl_graph.H:1443
Arc * get_curr()
Definition: tpl_graph_try.H:601
virtual Node * insert_node(Node *node)
Definition: tpl_graph.H:2215
Node * get_tgt_node()
Retorna el nodo destino del arco actual (sólo cuenta si es digrafo)
Definition: tpl_graph_try.H:646

Leandro Rabindranath León