home *** CD-ROM | disk | FTP | other *** search
- /*******************************************************************************
- +
- + LEDA 2.1.1 12-10-1991
- +
- +
- + ugraph.h
- +
- +
- + Copyright (c) 1991 by Max-Planck-Institut fuer Informatik
- + Im Stadtwald, 6600 Saarbruecken, FRG
- + All rights reserved.
- +
- *******************************************************************************/
-
-
- #ifndef UGRAPH_H
- #define UGRAPH_H
-
- #include <LEDA/graph.h>
-
-
- //-----------------------------------------------------------------------------
- // ugraph: base class for all undirected graphs
- //-----------------------------------------------------------------------------
-
- class ugraph : public graph{
-
- public:
-
- edge new_edge(node,node,ent);
-
- edge new_edge(node v, node w)
- { ent x; init_edge_entry(x);
- return new_edge(v,w,x);
- }
-
- edge new_edge(node,node,edge,edge,ent,int=0,int=0);
-
- edge new_edge(node v, node w, edge e1 ,edge e2, int dir1=0,int dir2=0)
- { ent x; init_edge_entry(x);
- return new_edge(v,w,e1,e2,x,dir1,dir2);
- }
-
- /* done by graph::del_edge
-
- void del_edge(edge e) { e->t->adj_edges.del(e->adj_loc2);
- graph::(e);
- }
- */
-
- list(node) adj_nodes(node) const;
-
- node opposite(node v, edge e) const;
-
- int degree(node v) const { return v->adj_edges.length(); }
-
- edge adj_succ(edge e,node v) const;
- edge adj_pred(edge e,node v) const;
- edge cyclic_adj_succ(edge e,node v) const;
- edge cyclic_adj_pred(edge e,node v) const;
-
- void print_edge(edge, ostream& = cout) const;
-
- void read(string s) { graph::read(s); make_undirected(); }
-
- ugraph() { undirected = true; }
-
- ugraph(const graph& a): graph(a) { undirected = true; make_undirected(); }
-
- ugraph(const ugraph& a) : graph((graph&)a) { undirected = true; }
-
- ~ugraph() { /* ~graph does the job */ }
-
- //subgraph constructors
- ugraph(ugraph&, list(node)&, list(edge)&);
- ugraph(ugraph&, list(edge)&);
-
- ugraph& operator=(const ugraph& a)
- { return (ugraph&)graph::operator=((graph&)a); }
-
- ugraph& operator=(const graph& a) { graph::operator=(a);
- make_undirected();
- return (ugraph&)(*this);
- }
-
- };
-
-
- //------------------------------------------------------------------------------
- // UGRAPH: generic ugraphs
- //------------------------------------------------------------------------------
-
- #define UGRAPH(vtype,etype) name3(vtype,etype,UGRAPH)
-
- #define UGRAPHdeclare2(vtype,etype)\
- \
- class UGRAPH(vtype,etype) : public ugraph {\
- \
- void init_node_entry(ent& x) const { x = Copy(vtype(0)); }\
- void init_edge_entry(ent& x) const { x = Copy(etype(0)); }\
- \
- void copy_node_entry(ent& x) const { Copy(*(vtype*)&x); }\
- void copy_edge_entry(ent& x) const { Copy(*(etype*)&x); }\
- \
- void clear_node_entry(ent& x) const { Clear(*(vtype*)&x); }\
- void clear_edge_entry(ent& x) const { Clear(*(etype*)&x); }\
- \
- void read_node_entry(istream& i, ent& x) const { Read(*(vtype*)&x,i); }\
- void read_edge_entry(istream& i, ent& x) const { Read(*(etype*)&x,i); }\
- \
- void write_node_entry(ostream& o, ent& x) const { Print(*(vtype*)&x,o); }\
- void write_edge_entry(ostream& o, ent& x) const { Print(*(etype*)&x,o); }\
- \
- void print_node_entry(ostream& o, ent& x) const\
- { o << "("; Print(*(vtype*)&x,o); o << ")"; }\
- void print_edge_entry(ostream& o, ent& x) const\
- { o << "("; Print(*(etype*)&x,o); o << ")"; }\
- \
- public:\
- \
- int cmp_node_entry(node x, node y) const { return compare(inf(x),inf(y)); }\
- int cmp_edge_entry(edge x, edge y) const { return compare(inf(x),inf(y)); }\
- \
- vtype inf(node v) const { return vtype(graph::inf(v)); }\
- etype inf(edge e) const { return etype(graph::inf(e)); }\
- vtype& operator[] (node v) { return *(vtype*)&ugraph::entry(v); }\
- vtype operator[] (node v) const { return vtype(ugraph::inf(v)); }\
- etype& operator[] (edge e) { return *(etype*)&ugraph::entry(e); }\
- etype operator[] (edge e) const { return etype(ugraph::inf(e)); }\
- void assign(node v,vtype x) { graph::assign(v,Ent(x)); }\
- void assign(edge e,etype x) { graph::assign(e,Ent(x)); }\
- node new_node() { return ugraph::new_node(); }\
- node new_node(vtype a) { return ugraph::new_node(Copy(a)); }\
- edge new_edge(node v, node w)\
- { return ugraph::new_edge(v,w); }\
- edge new_edge(node v, node w, etype a)\
- { return ugraph::new_edge(v,w,Copy(a)); }\
- edge new_edge(node v, node w, edge e1, edge e2, int dir1, int dir2)\
- { return ugraph::new_edge(v,w,e1,e2,dir1,dir2); }\
- edge new_edge(node v,node w,edge e1,edge e2,etype a,int dir1,int dir2)\
- { return ugraph::new_edge(v,w,e1,e2,Copy(a),dir1,dir2); }\
- UGRAPH(vtype,etype)& operator=(const UGRAPH(vtype,etype)& a)\
- {return (UGRAPH(vtype,etype)&)(ugraph::operator=((ugraph&)a)); }\
- \
- UGRAPH(vtype,etype)& operator=(const graph& a)\
- {return (UGRAPH(vtype,etype)&)(ugraph::operator=(a)); }\
- \
- UGRAPH(vtype,etype)() { }\
- UGRAPH(vtype,etype)(const UGRAPH(vtype,etype)& a): ugraph((ugraph&)a) { copy_all_entries();}\
- UGRAPH(vtype,etype)(const graph& a) : ugraph(a) { copy_all_entries();}\
- \
- ~UGRAPH(vtype,etype)() { clear(); }\
- };\
-
-
-
- extern void complete_graph(ugraph&,int);
- extern void random_graph(ugraph&,int,int);
- extern void test_graph(ugraph&);
-
-
- #endif
-