home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung 2 / Power-Programmierung CD 2 (Tewi)(1994).iso / c / library / dos / diverses / leda / incl / ugraph.h < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-10  |  5.4 KB  |  163 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  2.1.1                                                 12-10-1991
  4. +
  5. +
  6. +  ugraph.h
  7. +
  8. +
  9. +  Copyright (c) 1991  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #ifndef UGRAPH_H
  16. #define UGRAPH_H
  17.  
  18. #include <LEDA/graph.h>
  19.  
  20.  
  21. //-----------------------------------------------------------------------------
  22. // ugraph: base class for all undirected graphs
  23. //-----------------------------------------------------------------------------
  24.  
  25. class ugraph : public graph{
  26.  
  27. public:
  28.  
  29. edge new_edge(node,node,ent);
  30.  
  31. edge new_edge(node v, node w)
  32. { ent x; init_edge_entry(x);
  33.   return new_edge(v,w,x);
  34.  }
  35.  
  36. edge new_edge(node,node,edge,edge,ent,int=0,int=0);
  37.  
  38. edge new_edge(node v, node w, edge e1 ,edge e2, int dir1=0,int dir2=0)
  39. { ent x; init_edge_entry(x);
  40.   return new_edge(v,w,e1,e2,x,dir1,dir2);
  41.  }
  42.  
  43. /* done by graph::del_edge
  44.  
  45. void del_edge(edge e) { e->t->adj_edges.del(e->adj_loc2);
  46.                         graph::(e);
  47.                        }
  48. */
  49.  
  50. list(node) adj_nodes(node) const;
  51.  
  52. node opposite(node v, edge e)  const;
  53.  
  54. int  degree(node v)     const  { return v->adj_edges.length(); }
  55.  
  56. edge adj_succ(edge e,node v) const;
  57. edge adj_pred(edge e,node v) const;
  58. edge cyclic_adj_succ(edge e,node v) const;
  59. edge cyclic_adj_pred(edge e,node v) const;
  60.  
  61. void print_edge(edge, ostream& = cout) const;
  62.  
  63. void read(string s) { graph::read(s); make_undirected(); } 
  64.  
  65. ugraph()  { undirected = true; }
  66.  
  67. ugraph(const graph& a): graph(a) { undirected = true; make_undirected(); }
  68.  
  69. ugraph(const ugraph& a) : graph((graph&)a)  { undirected = true;  }
  70.  
  71. ~ugraph() { /* ~graph does the job */ }
  72.  
  73. //subgraph constructors
  74. ugraph(ugraph&, list(node)&, list(edge)&);
  75. ugraph(ugraph&, list(edge)&);
  76.  
  77. ugraph& operator=(const ugraph& a) 
  78.                                { return (ugraph&)graph::operator=((graph&)a); }
  79.  
  80. ugraph& operator=(const graph& a)  { graph::operator=(a); 
  81.                                      make_undirected();
  82.                                      return (ugraph&)(*this);
  83.                                     }
  84.  
  85. };
  86.  
  87.  
  88. //------------------------------------------------------------------------------
  89. // UGRAPH: generic ugraphs
  90. //------------------------------------------------------------------------------
  91.  
  92. #define UGRAPH(vtype,etype)  name3(vtype,etype,UGRAPH)
  93.  
  94. #define UGRAPHdeclare2(vtype,etype)\
  95. \
  96. class UGRAPH(vtype,etype) : public ugraph {\
  97. \
  98. void init_node_entry(ent& x) const { x = Copy(vtype(0)); }\
  99. void init_edge_entry(ent& x) const { x = Copy(etype(0)); }\
  100. \
  101. void copy_node_entry(ent& x) const { Copy(*(vtype*)&x); }\
  102. void copy_edge_entry(ent& x) const { Copy(*(etype*)&x); }\
  103. \
  104. void clear_node_entry(ent& x) const { Clear(*(vtype*)&x); }\
  105. void clear_edge_entry(ent& x) const { Clear(*(etype*)&x); }\
  106. \
  107. void read_node_entry(istream& i, ent& x)  const { Read(*(vtype*)&x,i); }\
  108. void read_edge_entry(istream& i, ent& x)  const { Read(*(etype*)&x,i); }\
  109. \
  110. void write_node_entry(ostream& o, ent& x)  const { Print(*(vtype*)&x,o); }\
  111. void write_edge_entry(ostream& o, ent& x)  const { Print(*(etype*)&x,o); }\
  112. \
  113. void print_node_entry(ostream& o, ent& x)  const\
  114.      { o << "("; Print(*(vtype*)&x,o); o << ")"; }\
  115. void print_edge_entry(ostream& o, ent& x)  const\
  116.      { o << "("; Print(*(etype*)&x,o); o << ")"; }\
  117. \
  118. public:\
  119. \
  120. int cmp_node_entry(node x, node y) const { return compare(inf(x),inf(y)); }\
  121. int cmp_edge_entry(edge x, edge y) const { return compare(inf(x),inf(y)); }\
  122. \
  123.    vtype  inf(node v)         const { return vtype(graph::inf(v)); }\
  124.    etype  inf(edge e)         const { return etype(graph::inf(e)); }\
  125.    vtype& operator[] (node v)       { return *(vtype*)&ugraph::entry(v); }\
  126.    vtype  operator[] (node v) const { return vtype(ugraph::inf(v)); }\
  127.    etype& operator[] (edge e)       { return *(etype*)&ugraph::entry(e); }\
  128.    etype  operator[] (edge e) const { return etype(ugraph::inf(e)); }\
  129.    void   assign(node v,vtype x) { graph::assign(v,Ent(x)); }\
  130.    void   assign(edge e,etype x) { graph::assign(e,Ent(x)); }\
  131.    node   new_node()          { return ugraph::new_node(); }\
  132.    node   new_node(vtype a)   { return ugraph::new_node(Copy(a)); }\
  133.    edge   new_edge(node v, node w)\
  134.                               { return ugraph::new_edge(v,w); }\
  135.    edge   new_edge(node v, node w, etype a)\
  136.                               { return ugraph::new_edge(v,w,Copy(a)); }\
  137.    edge   new_edge(node v, node w, edge e1, edge e2, int dir1, int dir2)\
  138.                        { return ugraph::new_edge(v,w,e1,e2,dir1,dir2); }\
  139.    edge   new_edge(node v,node w,edge e1,edge e2,etype a,int dir1,int dir2)\
  140.                        { return ugraph::new_edge(v,w,e1,e2,Copy(a),dir1,dir2); }\
  141.    UGRAPH(vtype,etype)& operator=(const UGRAPH(vtype,etype)& a)\
  142.        {return (UGRAPH(vtype,etype)&)(ugraph::operator=((ugraph&)a)); }\
  143. \
  144.    UGRAPH(vtype,etype)& operator=(const graph& a)\
  145.        {return (UGRAPH(vtype,etype)&)(ugraph::operator=(a)); }\
  146. \
  147.    UGRAPH(vtype,etype)()                                       { }\
  148.    UGRAPH(vtype,etype)(const UGRAPH(vtype,etype)& a): ugraph((ugraph&)a) { copy_all_entries();}\
  149.    UGRAPH(vtype,etype)(const graph& a)              : ugraph(a)         { copy_all_entries();}\
  150. \
  151.    ~UGRAPH(vtype,etype)() { clear(); }\
  152. };\
  153.  
  154.  
  155.  
  156. extern void complete_graph(ugraph&,int);
  157. extern void random_graph(ugraph&,int,int);
  158. extern void test_graph(ugraph&);
  159.  
  160.  
  161. #endif
  162.