graph.h
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:31k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  graph.h
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #ifndef LEDA_GRAPH_H
  12. #define LEDA_GRAPH_H
  13. #include <LEDA/basic.h>
  14. #include <LEDA/list.h>
  15. #include <LEDA/graph_objects.h>
  16. #include <LEDA/graph_map.h>
  17. //------------------------------------------------------------------------------
  18. // graph: base class for all graphs
  19. //------------------------------------------------------------------------------
  20. /*{Manpage {graph} {} {Graphs} }*/
  21. class graph {
  22. /*{Mdefinition
  23. An instance $G$ of the data type $graph$ consists of a list $V$  of nodes
  24. and a list $E$  of edges ($node$ and $edge$ are item types). A pair of nodes 
  25. $(v,w) in Vtimes V$ is associated with every edge $ein E$; $v$ is called 
  26. the {em source} of $e$ and $w$ is called the {em target} of $e$. Two lists 
  27. of edges are associated with every node $v$: the list
  28. $out_edges(v) = {e in E abs source(e) = v}$ of edges starting in $v$, 
  29. and the list $in_edges(v) = {e in E abs target(e) = v}$ of
  30. edges ending in $v$. Distinct graphs have disjoint node and edge sets. 
  31. A graph with empty node list is called {em empty}.
  32. A graph is either {em directed} or {em undirected}; the main difference
  33. between directed and undirected edges is the definition of {em adjacent}. 
  34. Undirected graphs are the subject of section ref{Undirected Graphs}. 
  35. In a directed graph an edge is adjacent to its source and in an undirected 
  36. graph it is adjacent to its source and target. In a directed graph a node $w$ 
  37. is adjacent to a node $v$ if there is an edge $(v,w) in E$; in an undirected 
  38. graph $w$ is adjacent to $v$ if there is an edge $(v,w)$ or $(w,v)$ in the 
  39. graph. The {em adjacency list} of a node $v$ is the list of edges adjacent 
  40. to $v$; more precisely, for directed graphs the adjacency list of $v$ is 
  41. equal to $out_edges(v)$ and for undirected graphs it is the concatenation
  42. of $out_edges(v)$ and $in_edges(v)$. 
  43. The value of a variable of type node is either the node of some graph, or the
  44. special value nil (which is distinct from all nodes), or is undefined (before the first assignment to the variable). A corresponding statement is true for
  45. the variables of type edge.}*/
  46. friend class ugraph;
  47. friend class planar_map;
  48. //list<node> V;              /* list of all nodes */
  49. obj_list V;
  50. //list<edge> E;              /* list of all edges */
  51. obj_list E;
  52. int max_n_index;      // maximal node index 
  53. int max_e_index;      // maximal edge index
  54. bool   undirected;    // true iff graph is undirected
  55. /* space: 2 lists + 4 words + "virtual" = 2*20 + 5*4 bytes = 60 bytes */
  56. virtual void init_node_entry(GenPtr&)  {}
  57. virtual void init_edge_entry(GenPtr&)  {}
  58. virtual void copy_node_entry(GenPtr&) const {}
  59. virtual void copy_edge_entry(GenPtr&) const {}
  60. virtual void clear_node_entry(GenPtr&) const {}
  61. virtual void clear_edge_entry(GenPtr&) const {}
  62. virtual void read_node_entry(istream&, GenPtr&) {}
  63. virtual void read_edge_entry(istream&, GenPtr&) {}
  64. virtual void write_node_entry(ostream&, GenPtr&) const {}
  65. virtual void write_edge_entry(ostream&, GenPtr&) const {}
  66. virtual void print_node_entry(ostream&, GenPtr&) const {}
  67. virtual void print_edge_entry(ostream&, GenPtr&) const {}
  68. virtual char* node_type() const { return "void"; }
  69. virtual char* edge_type() const { return "void"; }
  70. protected:
  71. graph* parent;           // for subgraphs
  72. void copy_all_entries() const;
  73. void clear_all_entries() const;
  74. public:
  75. virtual int cmp_node_entry(node, node) const { return 0; }
  76. virtual int cmp_edge_entry(edge, edge) const { return 0; }
  77. /*{Mcreation G }*/
  78. graph();
  79. /*{Mcreate creates an object $G$ of type $graph$ and initializes it to 
  80.             the empty directed graph. }*/
  81. graph(const graph&);
  82. graph& operator=(const graph&); 
  83. virtual void clear();
  84. virtual ~graph(){ clear(); }
  85. //subgraph constructors
  86. graph(graph&, const list<node>&, const list<edge>&);
  87. graph(graph&, const list<edge>&);
  88.    graph* super()        const;
  89.    int max_node_index()   const;
  90.    int max_edge_index()   const;
  91.    int adj_edges_select() const { return undirected ? 1 : 0; }
  92.    int  space() const;
  93. /*{Moperations 1.9 4.7 }*/
  94. /*{Mtext       
  95. bigskip
  96. {bf a) Access operations} }*/
  97.    int  outdeg(node v)    const;
  98. /*{Mop     returns the outdegree of node $v$, i.e., the number of 
  99.             edges starting at $v$ ($abs out_edges(v)abs$). }*/
  100.    int  indeg(node v)     const;
  101. /*{Mop     returns the indegree of node $v$, i.e., the number of 
  102.             edges ending at $v$ ($abs in_edges(v) abs$). }*/
  103.    int  degree(node v)    const;
  104. /*{Mop     returns the degree of node $v$, i.e., the number of 
  105.             edges starting or ending at $v$. }*/
  106.    node source(edge e)    const;
  107. /*{Mop     returns the source node of edge $e$.}*/
  108.    node target(edge e)    const;
  109. /*{Mop     returns the target node of edge $e$.}*/
  110.    node opposite(node v, edge e) const;
  111. /*{Mop     returns a node of edge $e$ different from $v$ (returns $v$ 
  112.             if $e$ has source and target equal to $v$) . }*/
  113.    int  number_of_nodes() const;
  114. /*{Mop     returns the number of nodes in $G$. }*/
  115.    int  number_of_edges() const;
  116. /*{Mop     returns the number of edges in $G$. }*/
  117.    list<edge> all_edges()     const;
  118. /*{Mop     returns the list $E$ of all edges of $G$. }*/
  119.    list<node> all_nodes()     const;
  120. /*{Mop     returns the list $V$ of all nodes of $G$. }*/
  121.    list<edge> adj_edges(node v) const;
  122. /*{Mop     returns the list of all edges adjacent to $v$. }*/
  123.    list<edge> in_edges(node v) const;
  124. /*{Mop     returns the list of all edges ending at $v$. }*/
  125.    list<node> adj_nodes(node v) const;
  126. /*{Mop     returns the list of all nodes adjacent to $v$. }*/
  127.    node first_node()      const;
  128. /*{Mop       returns the first node in $V$. }*/
  129.    node last_node()       const;
  130. /*{Mop       returns the last node in $V$. }*/
  131.    node choose_node()     const;
  132. /*{Mop       returns a node of $G$ (nil if $G$ is empty). }*/
  133.    node succ_node(node v) const;
  134. /*{Mop       returns the successor of node $v$ in $V$
  135.       (nil if it does not exist). }*/
  136.    node pred_node(node v) const;
  137. /*{Mop       returns the predecessor of node $v$ in $V$
  138.       (nil if it does not exist). }*/
  139.    edge first_edge()      const;
  140. /*{Mop       returns the first edge in $E$. }*/
  141.    edge last_edge()       const;
  142. /*{Mop       returns the last edge in $E$. }*/
  143.    edge choose_edge()     const;
  144. /*{Mop       returns an edge of $G$ (nil if $G$ has no edges). }*/
  145.    edge succ_edge(edge e) const;
  146. /*{Mop       returns the successor of edge $e$ in $E$
  147.       (nil if it does not exist). }*/
  148.    edge pred_edge(edge e) const;
  149. /*{Mop       returns the predecessor of edge $e$ in $E$
  150.       (nil if it does not exist). }*/
  151.    edge first_adj_edge(node v) const;
  152. /*{Mop       returns the first edge in the adjacency list of $v$. }*/
  153.    edge last_adj_edge(node v)  const;
  154. /*{Mop       returns the last edge in the adjacency list of $v$. }*/
  155.    edge adj_succ(edge e)  const;
  156. /*{Mop       returns the successor of edge $e$ in the
  157.               adjacency list of node $source(e)$
  158.       (nil if it does not exist). }*/
  159.    edge adj_pred(edge e)  const;
  160. /*{Mop       returns the predecessor of edge $e$ in the
  161.               adjacency list of node $source(e)$
  162.       (nil if it does not exist). }*/
  163.    edge cyclic_adj_succ(edge e) const;
  164. /*{Mop       returns the cyclic successor of edge $e$ in the
  165.               adjacency list of node $source(e)$. }*/
  166.    edge cyclic_adj_pred(edge e) const;
  167. /*{Mop       returns the cyclic predecessor of edge $e$ in the
  168.       adjacency list of node $source(e)$. }*/
  169.    edge first_in_edge(node v)  const;
  170. /*{Mop       returns the first edge of $in_edges(v)$. }*/
  171.    edge last_in_edge(node v)   const;
  172. /*{Mop       returns the last edge of $in_edges(v)$. }*/
  173.    edge in_succ(edge e)  const;
  174. /*{Mop       returns the successor of edge $e$ in $in_edges(target(e))$ 
  175.               (nil if it does not exist). }*/
  176.    edge in_pred(edge e)  const;
  177. /*{Mop       returns the predecessor of edge $e$ in $in_edges(target(e))$ 
  178.               (nil if it does not exist). }*/
  179.    edge cyclic_in_succ(edge e) const;
  180. /*{Mop       returns the cyclic successor of edge $e$ in 
  181.               $in_edges(target(e))$. }*/
  182.    edge cyclic_in_pred(edge e) const;
  183. /*{Mop       returns the cyclic predecessor of edge $e$ in 
  184.               $in_edges(target(e))$. }*/
  185. protected:
  186.    GenPtr& entry(node v);
  187.    GenPtr& entry(edge e);
  188.    GenPtr  inf(node v) const;
  189.    GenPtr  inf(edge e) const;
  190.    node new_node(GenPtr);
  191.    edge new_edge(node, node, GenPtr);
  192.    edge new_edge(edge, node, GenPtr, int dir=0);
  193.    edge new_edge(edge, edge, GenPtr, int dir1=0, int dir2=0);
  194.    void assign(node v,GenPtr x);
  195.    void assign(edge e,GenPtr x);
  196. public:
  197. /*{Mtext       
  198. bigskip
  199. {bf b) Update operations} }*/
  200.    node new_node();
  201. /*{Mop        adds a new node to $G$ and returns it. }*/
  202.    edge new_edge(node v, node w) 
  203.    { GenPtr x; init_edge_entry(x);
  204.      return new_edge(v,w,x);}
  205. /*{Mop         adds a new edge $(v,w)$ to var by appending it to 
  206.                 $out_edges(v)$ and to $in_edges(w)$, and returns it.}*/
  207.    edge new_edge(edge e, node w, int dir=after) 
  208.    { GenPtr x; init_edge_entry(x);
  209.      return new_edge(e,w,x,dir); }
  210. /*{Mopl       adds a new edge $(source(e), w)$ to var by inserting it
  211.                before ($dir$ = $before$) or after ($dir$ = $after$) edge $e$ into 
  212.                $out_edges(source(e))$ and appending it to $in_edges(w)$,
  213.                and returns it. Here $before$ and $after$ are predefined
  214.                integer constants. }*/
  215.    edge new_edge(edge e1, edge e2, int d1=after, int d2=after) 
  216.    { GenPtr x; init_edge_entry(x);
  217.      return new_edge(e1,e2,x,d1,d2); }
  218. /*{Mopl       adds a new edge $(source(e1), target(e2))$ to var by 
  219.                inserting it before (if $d1$ = $before$) or after (if $d1$ = $after$) 
  220.                edge $e1$ into $out_edges(source(e1))$ and before 
  221.                (if $d2$ = $before$) or after (if $d2$ = $after$) edge $e2$ into
  222.                $in_edges(target(e2))$, and returns it. }*/ 
  223.    void hide_edge(edge e);
  224. /*{Mop        removes edge $e$ from $out_edges(source(e))$ and 
  225.                from $in_edges(target(e))$, but leaves it in the
  226.                list of all edges $E$. }*/
  227.    void restore_edge(edge e);
  228. /*{Mop        re-inserts $e$ into $out_edges(source(e))$
  229.                and into $in_edges(target(e))$.\
  230.        precond $e$ must have been
  231.                removed by a call of hide_edge before. }*/
  232.    void del_node(node v);
  233. /*{Mop       deletes node $v$ and all edges starting or ending at $v$
  234.       from $G$. }*/
  235.    void del_edge(edge e);
  236. /*{Mop       deletes the edge $e$ from $G$. }*/
  237.    void del_all_nodes(); 
  238. /*{Mop       deletes all nodes from $G$.  }*/
  239.    void del_all_edges(); 
  240. /*{Mop       deletes all edges from $G$.  }*/
  241.    edge rev_edge(edge e);
  242. /*{Mop       reverses the edge $e = (v,w)$ by removing it from $G$ 
  243.               and inserting the edge $(w,v)$ into $G$; returns the 
  244.               reversed edge. }*/
  245. graph& rev();
  246. /*{Mop        all edges in $G$ are reversed. }*/
  247. void sort_nodes(int (*cmp)(const node&, const node&));
  248. /*{Mopl      the nodes of $G$ are sorted according to the
  249.       ordering defined by the comparing function
  250.       $cmp$. Subsequent executions of forall_nodes
  251.       step through the nodes in this order.
  252.       (cf.~TOPSORT1 in section ref{Graph and network algorithms}). }*/
  253. void sort_edges(int (*cmp)(const edge&, const edge&));
  254. /*{Mopl      the edges of $G$ and all out_edges lists (but not the in_edges lists)
  255.               are sorted according to the
  256.       ordering defined by the comparing function
  257.       $cmp$. Subsequent executions of forall_edges
  258.       step through the edges in this order.
  259.               (cf.~TOPSORT1 in section ref{Graph and network algorithms}). }*/
  260. void sort_nodes(const graph_map& A);
  261. /* manual:
  262. void sort_nodes(const node_array<T>& A);
  263. */
  264. /*{Mopl      the nodes of $G$ are sorted according to the entries of
  265.               node_array $A$ (cf. section ref{Node Arrays})
  266.       precond $T$ must be linearly ordered. }*/
  267. void sort_edges(const graph_map& A);
  268. /* manual:
  269. void sort_edges(const edge_array<T>& A);
  270. */
  271. /*{Mopl      the edges of $G$ are sorted according to the entries of 
  272.               edge_array $A$ (cf. section ref{Edge Arrays})
  273.       precond $T$ must be linearly ordered. }*/
  274. void sort_edges();
  275. void sort_nodes();
  276.    list<edge> insert_reverse_edges();
  277. /*{Mop       for every edge $(v,w)$ in $G$ the reverse edge $(w,v)$ 
  278.               is inserted into $G$. Returns the list of all inserted 
  279.               edges.}*/
  280.    void make_undirected() const { *(bool*)&undirected = true; }
  281. /*{Mop       make  $G$  undirected. }*/
  282.    void make_directed() const  { *(bool*)&undirected = false; }
  283. /*{Mop       make  $G$  directed. }*/
  284.    bool is_directed() const { return !undirected; }
  285. /*{Mop       returns true if $G$  directed. }*/
  286.    bool is_undirected() const { return undirected; }
  287. /*{Mop       returns true if $G$  undirected. }*/
  288. /*
  289. virtual void clear();
  290. */
  291. /*{Mop       makes $G$ the empty graph. }*/
  292. /*{Mtext
  293. bigskip
  294. {bf c) Iterators}
  295. With the adjacency list of every node $v$ a list iterator, 
  296. called the adjacency iterator of $v$, is associated (cf. section ref{Linear Lists}). There 
  297. are operations to initialize, move, and read these iterators.  }*/
  298. void init_adj_iterator(node v)        const;
  299. /*{Mop      sets the adjacency iterator of $v$ to undefined. }*/
  300. bool next_adj_edge(edge& e,node v)    const;
  301. /*{Mopl     moves the adjacency iterator of $v$ forward by one edge
  302.              (to the first item of the adjacency list of $v$ if it was undefined) 
  303.              and returns $G$.current_adj_edge($e,v$).}*/
  304. bool current_adj_edge(edge& e, node v) const;
  305. /*{Mopl     if the adjacency iterator of $v$ is defined then the
  306.              corresponding edge is assigned to $e$ and true is returned, otherwise,
  307.              false is returned.}*/
  308. bool next_adj_node(node& w, node v)    const;
  309. /*{Mopl     if $G$.next_adj_edge($e$, $v$) = true then 
  310.      $target(e)$ is assigned to $w$ and true is returned else false is returned.}*/
  311. bool current_adj_node(node& w, node v) const;
  312. /*{Mopl     if $G$.current_adj_edge($e$, $v$) = true then
  313.      $target(e)$ is assigned to $w$ and true is returned, else false is returned.}*/
  314.  
  315.  void reset() const;
  316. /*{Mop      sets all iterators in $G$ to undefined. }*/
  317. void init_node_iterator() const {}
  318. void init_edge_iterator() const {}
  319. /*{Mtext
  320. bigskip
  321. {bf d) I/O Operations} }*/
  322. void write(ostream& O = cout) const;
  323. /*{Mopl      writes $G$ to the output stream $O$.}*/
  324. void write(string s) const;
  325. /*{Mop       writes $G$ to the file with name $s$.}*/
  326. int  read(istream& I = cin);
  327. /*{Mopl      reads a graph from the input stream $I$ and assigns
  328.               it to var. }*/
  329. int  read(string s);
  330. /*{Mop       reads a graph from the file with name $s$ and assigns
  331.               it to var. }*/
  332. void print_node(node v, ostream& O = cout)  const;
  333. /*{Mopl      prints node $v$ on the output stream $O$. }*/
  334. virtual void print_edge(edge e, ostream& O = cout) const;
  335. /*{Mopl      prints  edge $e$ on the output stream $O$. If var
  336.               is directed $e$ is represented by an arrow 
  337.               pointing from source to target. If var is undirected
  338.               $e$ is printed as an undirected line segment. }*/
  339. void print(string s, ostream& O = cout) const;
  340. /*{Mopl      pretty-prints $G$ with header line $s$ on the output 
  341.               stream $O$. }*/
  342. void print(ostream& O) const { print("",O); }
  343. /*{Mop       pretty-prints $G$ on the output stream $O$. }*/
  344. void print() const { print("");   }
  345. /*{Mop       pretty-prints $G$ on the standard ouput stream $cout$. }*/
  346. };
  347. inline int  graph::outdeg(node v) const { return v->adj_edges[0].length(); }
  348. inline int  graph::indeg(node v)  const { return v->adj_edges[1].length(); }
  349. inline int  graph::degree(node v) const { return outdeg(v) + indeg(v); }
  350. inline node graph::source(edge e)    const   { return e->s; }
  351. inline node graph::target(edge e)    const   { return e->t; }
  352. inline node graph::opposite(node v,edge e) const {return (v==e->s)?e->t:e->s;}
  353. inline graph* graph::super()       const   { return parent; }
  354. inline int graph::max_node_index() const   { return max_n_index; }
  355. inline int graph::max_edge_index() const   { return max_e_index; }
  356. inline int  graph::number_of_nodes() const   { return V.length(); }
  357. inline int  graph::number_of_edges() const   { return E.length(); }
  358. inline GenPtr& graph::entry(node v)        { return v->data[0]; }
  359. inline GenPtr& graph::entry(edge e)        { return e->data[0]; }
  360. inline void graph::assign(node v,GenPtr x) { v->data[0] = x; }
  361. inline void graph::assign(edge e,GenPtr x) { e->data[0] = x; }
  362. inline GenPtr  graph::inf(node v) const { return v->data[0]; }
  363. inline GenPtr  graph::inf(edge e) const { return e->data[0]; }
  364. inline node graph::first_node()   const { return node(node_link(V.first())); }
  365. inline node graph::last_node()    const { return node(node_link(V.last())); }
  366. inline node graph::choose_node()  const { return first_node(); }
  367. inline node graph::succ_node(node v)  const  
  368. { return node(node_link(V.succ(node_link(v)))); }
  369. inline node graph::pred_node(node v)  const  
  370. { return node(node_link(E.pred(node_link(v)))); }
  371. inline edge graph::first_edge()   const { return edge(edge_link(E.first())); }
  372. inline edge graph::last_edge()    const { return edge(edge_link(E.last())); }
  373. inline edge graph::choose_edge()  const { return first_edge(); }
  374. inline edge graph::succ_edge(edge e)  const  
  375. { return edge(edge_link(E.succ(edge_link(e)))); }
  376. inline edge graph::pred_edge(edge e)  const  
  377. { return edge(edge_link(E.pred(edge_link(e)))); }
  378. inline edge graph::first_adj_edge(node v) const
  379. { edge e = First_Adj_Edge(v,0);
  380.   if (undirected && e == Leda_Nil_Edge(0)) 
  381.   { e = First_Adj_Edge(v,1);
  382.     if (e == Leda_Nil_Edge(1)) e = nil;
  383.    }
  384.   return e ;
  385.  }
  386. inline edge graph::last_adj_edge(node v) const
  387. { int index = (undirected) ? 1 : 0;
  388.   edge e = Last_Adj_Edge(v,index);
  389.   if (undirected && e == Leda_Nil_Edge(index)) 
  390.   { e = Last_Adj_Edge(v,1-index);
  391.     if (e == Leda_Nil_Edge(1-index)) e = nil;
  392.    }
  393.   return e;
  394.  }
  395. inline edge graph::adj_succ(edge e) const
  396. { return edge(adj_link1(adj_link1(e)->succ_item())); }
  397. inline edge graph::adj_pred(edge e) const
  398. { return edge(adj_link1(adj_link1(e)->pred_item())); }
  399. inline edge graph::cyclic_adj_succ(edge e) const 
  400. { edge e1 = adj_succ(e);
  401.   return e1 ? e1 : first_adj_edge(e->s); }
  402. inline edge graph::cyclic_adj_pred(edge e) const 
  403. { edge e1 = adj_pred(e);
  404.   return e1 ? e1 : last_adj_edge(e->s); }
  405. inline edge graph::first_in_edge(node v) const
  406. { return edge(adj_link2(v->adj_edges[1].first())); }
  407. inline edge graph::last_in_edge(node v)  const
  408. { return edge(adj_link2(v->adj_edges[1].last())); }
  409. inline edge graph::in_succ(edge e)  const
  410. { return edge(adj_link2(adj_link2(e)->succ_item())); }
  411. inline edge graph::in_pred(edge e)  const
  412. { return edge(adj_link2(adj_link2(e)->pred_item())); }
  413. inline edge graph::cyclic_in_succ(edge e) const 
  414. { edge e1 = in_succ(e);
  415.   return e1 ? e1 : first_in_edge(e->t); }
  416. inline edge graph::cyclic_in_pred(edge e) const 
  417. { edge e1 = in_pred(e);
  418.   return e1 ? e1 : last_in_edge(e->t); }
  419. inline void graph::init_adj_iterator(node v) const 
  420. { v->adj_iterator = nil; }
  421. inline bool  graph::current_adj_edge(edge& e,node v) const 
  422. { return (e = v->adj_iterator) != nil;}
  423. inline bool  graph::next_adj_edge(edge& e,node v) const 
  424. { if (v->adj_iterator) 
  425.       e = v->adj_iterator = adj_succ(v->adj_iterator);
  426.   else
  427.       e = v->adj_iterator = first_adj_edge(v);
  428.   return  (e) ? true : false;
  429.  }
  430. inline bool graph::next_adj_node(node& w,node v)  const
  431. { edge e;
  432.   if (next_adj_edge(e,v))
  433.   { //w = (v==e->s) ? e->t : e->s;  // ugraph
  434.     w = e->t;
  435.     return true; 
  436.    }
  437.   else return false;
  438.  }
  439.    
  440. inline bool graph::current_adj_node(node& w,node v)  const
  441. { edge e;
  442.   if (current_adj_edge(e,v))
  443.   { //w = (v==e->s) ? e->t : e->s;  // ugraph
  444.     w = e->t;
  445.     return true; 
  446.    }
  447.   else return false;
  448. }
  449.    
  450. //------------------------------------------------------------------------------
  451. // Iteration   (macros)
  452. //------------------------------------------------------------------------------
  453. /*{Mtext            
  454. bigskip
  455. {bf e) Iteration} }*/
  456. #define forall_nodes(v,g) for (v=(g).first_node(); v; v=(g).succ_node(v) )
  457. /*{Mtext            
  458. bigskip
  459. {bf forall_nodes}($v,G$)\ 
  460. ${$ ``the nodes of $G$ are successively assigned to $v$" $}$ }*/
  461. #define forall_edges(e,g) for (e=(g).first_edge(); e; e=(g).succ_edge(e) )
  462. /*{Mtext            
  463. bigskip
  464. {bf forall_edges}($e,G$)\
  465. ${$ ``the edges of $G$ are successively assigned to $e$" $}$ }*/
  466. #define Forall_nodes(v,g) for (v=(g).last_node(); v; v=(g).pred_node(v) )
  467. /*{Mtext            
  468. bigskip
  469. {bf Forall_nodes}($v,G$)\
  470. ${$ ``the nodes of $G$ are successively assigned to $v$ in reverse order" $}$ }*/
  471. #define Forall_edges(e,g) for (e=(g).last_edge(); e; e=(g).pred_edge(e) )
  472. /*{Mtext            
  473. bigskip
  474. {bf Forall_edges}($e,G$)\ 
  475. ${$ ``the edges of $G$ are successively assigned to $e$ in reverse order" $}$ }*/
  476. #define forall_out_edges(e,v)
  477. for(e = First_Adj_Edge(v,0); e != Leda_Nil_Edge(0); e = Succ_Adj_Edge(e,0))
  478. /*{Mtext
  479. bigskip
  480. {bf forall_out_edges}($e,w$)\
  481. ${$ ``the edges of $out_edges(w)$ are successively assigned to $e$" $}$ }*/
  482. #define forall_in_edges(e,v)
  483. for(e = First_Adj_Edge(v,1); e != Leda_Nil_Edge(1); e = Succ_Adj_Edge(e,1))
  484. /*{Mtext
  485. bigskip
  486. {bf forall_in_edges}($e,w$)\
  487. ${$ ``the edges of $in_edges(w)$ are successively assigned to $e$" $}$ }*/
  488. #define ADJ_BREAK { adj_loop_index = -1; break; }
  489. #define forall_inout_edges(e,v)
  490. if (0); else for(int adj_loop_index = 1; adj_loop_index>=0; adj_loop_index--)
  491. for(e = First_Adj_Edge(v,adj_loop_index);
  492. e != Leda_Nil_Edge(adj_loop_index);
  493. e = Succ_Adj_Edge(e,adj_loop_index))
  494. /*{Mtext
  495. bigskip
  496. {bf forall_inout_edges}($e,w$)\
  497. ${$ ``the edges of $out_edges(w)$ and $in_edges(w)$ are successively assigned to $e$" $}$ }*/
  498. #define forall_adj_edges(e,v)
  499. if (0); else for(int adj_loop_index = graph_of(v)->adj_edges_select(); adj_loop_index>=0; adj_loop_index--)
  500. for(e = First_Adj_Edge(v,adj_loop_index);
  501. e != Leda_Nil_Edge(adj_loop_index);
  502. e = Succ_Adj_Edge(e,adj_loop_index))
  503. /*{Mtext
  504. bigskip
  505. {bf forall_adj_edges}($e,w$)\
  506. ${$ ``the edges adjacent to node $w$ are successively assigned to $e$" $}$ }*/
  507. #define forall_adj_nodes(u,v)
  508. if (0); else for(int adj_loop_index = graph_of(v)->adj_edges_select(); adj_loop_index>=0; adj_loop_index--)
  509. for(edge adj_loop_e = First_Adj_Edge(v,adj_loop_index);
  510. (adj_loop_e!=Leda_Nil_Edge(adj_loop_index))&&((u=opposite(v,adj_loop_e))||1);
  511. adj_loop_e = Succ_Adj_Edge(adj_loop_e,adj_loop_index))
  512. /*{Mtext
  513. bigskip
  514. {bf forall_adj_nodes}($v,w$)\
  515. ${$ ``the nodes adjacent to node $w$ are successively assigned to v" $}$ }*/
  516. /*{Mimplementation
  517. Graphs are implemented by doubly linked adjacency lists. Most operations 
  518. take constant time, except for all_nodes, all_edges, del_all_nodes,
  519. del_all_edges, clear, write, and read which take time $O(n+m)$, where 
  520. $n$ is the current number of nodes and $m$ is the current number of edges. 
  521. The space requirement is $O(n+m)$.}*/
  522. //------------------------------------------------------------------------------
  523. // GRAPH<vtype,etype> : parameterized directed graphs
  524. //------------------------------------------------------------------------------
  525. /*{Manpage {GRAPH} {vtype,etype} {Parameterized Graphs}}*/
  526. template<class vtype, class etype> 
  527. class GRAPH : public graph {
  528. /*{Mdefinition 
  529. A parameterized graph $G$ is a graph whose nodes and edges contain additional
  530. (user defined) data. Every node contains an element of a data type $vtype$, 
  531. called the node type of $G$ and every edge contains an element of a data type 
  532. $etype$ called the edge type of $G$. We use $<v,w,y>$ to denote an edge 
  533. $(v,w)$ with information $y$ and $<x>$ to denote a node with information $x$.
  534. All operations defined on instances of the data type $graph$ are also defined on
  535. instances of any parameterized graph type name. For 
  536. parameterized graphs there are additional operations to access or update the 
  537. information associated with its nodes and edges.  
  538. Instances of a parameterized graph type can be used wherever an instance 
  539. of the data type $graph$ can be used, e.g., in assignments and as 
  540. arguments to functions with formal parameters of type $graph&$. 
  541. If a function $f(graph& G)$ is called with an argument $Q$ of type 
  542. name then inside $f$ only the basic graph structure of $Q$ (the
  543. adjacency lists) can be accessed. The node and edge entries are hidden.
  544. This allows the design of generic graph algorithms, i.e., algorithms accepting
  545. instances of any parametrized graph type as argument.}*/
  546. void copy_node_entry(GenPtr& x) const  { LEDA_COPY(vtype,x); }
  547. void copy_edge_entry(GenPtr& x) const  { LEDA_COPY(etype,x); }
  548. void clear_node_entry(GenPtr& x) const { LEDA_CLEAR(vtype,x); }
  549. void clear_edge_entry(GenPtr& x) const { LEDA_CLEAR(etype,x); }
  550. void write_node_entry(ostream& o, GenPtr& x) const { LEDA_PRINT(vtype,x,o); }
  551. void write_edge_entry(ostream& o, GenPtr& x) const { LEDA_PRINT(etype,x,o); }
  552. void read_node_entry(istream& i, GenPtr& x) { vtype X; Read(X,i); x=Copy(X); }
  553. void read_edge_entry(istream& i, GenPtr& x) { etype Y; Read(Y,i); x=Copy(Y); }
  554. void init_node_entry(GenPtr& x) { LEDA_CREATE(vtype,x); }
  555. void init_edge_entry(GenPtr& x) { LEDA_CREATE(etype,x); }
  556. void print_node_entry(ostream& o, GenPtr& x)  const
  557.      { o << "("; LEDA_PRINT(vtype,x,o); o << ")"; }
  558. void print_edge_entry(ostream& o, GenPtr& x)  const
  559.      { o << "("; LEDA_PRINT(etype,x,o); o << ")"; }
  560. char* node_type()  const { return LEDA_TYPE_NAME(vtype); }
  561. char* edge_type()  const { return LEDA_TYPE_NAME(etype); }
  562. public:
  563. int cmp_node_entry(node x, node y) const { return compare(inf(x),inf(y)); }
  564. int cmp_edge_entry(edge x, edge y) const { return compare(inf(x),inf(y)); }
  565. /*{Mcreation G }*/
  566. GRAPH()  {}
  567. /*{Mcreate creates an instance var of type name and initializes it to 
  568.             the empty graph. }*/
  569. GRAPH<vtype,etype>& operator=(const GRAPH<vtype,etype>& a)
  570. { clear_all_entries();graph::operator=(a);copy_all_entries();return *this; }
  571. GRAPH(const GRAPH<vtype,etype>& a) : graph(a) { a.copy_all_entries(); } 
  572. // subgraphs
  573. GRAPH(GRAPH<vtype,etype>& a, const list<node>& b, const list<edge>& c) 
  574. : graph(a,b,c) {}
  575. GRAPH(GRAPH<vtype,etype>& a, const list<edge>& c) : graph(a,c) {}
  576. virtual ~GRAPH()   { if (parent==0) clear_all_entries(); }
  577. /*{Moperations 1.5 4.5 }*/
  578. vtype  inf(node v)    const   { return LEDA_ACCESS(vtype,graph::inf(v)); }
  579. /*{Mop    returns the information of node $v$.}*/
  580. etype  inf(edge e)    const   { return LEDA_ACCESS(etype,graph::inf(e)); }
  581. /*{Mop    returns the information of edge $e$.}*/
  582. void   assign(node v, vtype x) { operator[](v) = x; }
  583. /*{Mop    makes $x$ the information of node $v$.}*/
  584. void   assign(edge e, etype x) { operator[](e) = x; }
  585. /*{Mop    makes $x$ the information of edge $e$.}*/
  586.                 
  587. node   new_node(vtype x)        { return graph::new_node(Copy(x)); }
  588. /*{Mop    adds a new node $<x>$ to $G$ and returns it.}*/
  589. node   new_node()               { return graph::new_node(); }
  590. /*{Mop    adds a new node $<vdef>$ to $G$ and returns it. Here,
  591.            $vdef$ is the default value of type $vtype$.}*/
  592. edge   new_edge(node v, node w, etype a) {return graph::new_edge(v,w,Copy(a)); }
  593. /*{Mopl   adds a new edge $<v,w,a>$ to $G$ by appending 
  594.            it to the adjacency list of $v$ and the in_edges list of 
  595.            $w$ and returns it. }*/
  596. edge   new_edge(node v, node w) { return graph::new_edge(v,w); }
  597. /*{Mopl   adds a new edge $<v,w,edef>$ to $G$ by
  598.    appending it to the adjacency list of $v$ and
  599.            the in_edges list of $w$ and returns it. Here, $edef$ 
  600.            is the default value of type $etype$.}*/
  601. edge   new_edge(edge e, node w, etype a)
  602.                                 { return graph::new_edge(e,w,Copy(a),0); }
  603. /*{Mopl   adds a new edge $<source(e),w,a>$ to $G$ by appending it 
  604.            to the adjacency list of $source(e)$ and the in-list of 
  605.            $w$ and returns it. }*/
  606. edge   new_edge(edge e, node w) { return graph::new_edge(e,w); }
  607. /*{Mopl   adds a new edge $<source(e),w,edef>$ to $G$ by appending 
  608.            it to the adjacency list of $source(e)$ and the in_edges list of 
  609.            $w$ and returns it. Here, $edef$ is the default value of 
  610.            type $etype$.}*/
  611. edge   new_edge(edge e, node w, etype a, int dir)
  612.                                 { return graph::new_edge(e,w,Copy(a),dir); }
  613. /*{Mopl   adds a new edge $<source(e), w, a>$ to $G$
  614.    by inserting it after ($dir$ = $after$) or before ($dir$
  615.    = $before$) edge $e$ into the adjacency list of
  616.    $source(e)$ and appending it to the in_edges list of $w$.
  617.            Returns the new edge.}*/
  618. /* inherited from base graph
  619. void sort_nodes();  
  620. */
  621. /*{Mop    the nodes of $G$ are sorted according to their
  622.            contents.\
  623.            precond $vtype$ is linearly ordered.}*/
  624. /* inherited from base graph
  625. void sort_edges();
  626. */
  627. /*{Mop    the edges of $G$ are sorted according to their
  628.    contents.\ 
  629.            precond $etype$ is linearly ordered.}*/
  630. /* inherited from base graph
  631. void write(string fname) const;
  632. */
  633. /*{Mop    writes $G$ to the file with name $fname$. The
  634.            output functions $Print(vtype,ostream)$ and
  635.            $Print(etype,ostream)$ (cf. section 1.6) must
  636.            be defined.}*/
  637. /* inherited from base graph
  638. int read(string fname);
  639. */
  640. /*{Mop       reads $G$ from the file with name $fname$. The 
  641.    input functions $Read(vtype,istream)$ and 
  642.    $Read(etype,istream)$ (cf.~section 1.6) must
  643.    be defined. Returns error code\
  644.    1 quad if file $fname$ does not exist\
  645.    2 quad if graph is not of type name\
  646.    3 quad if file $fname$ does not contain a graph\
  647.    0 quad otherwise.}*/
  648. void   clear()                  { clear_all_entries(); graph::clear(); }
  649. /*{Mtext
  650. bigskip
  651. {bf Operators} }*/
  652. vtype& operator[] (node v)    { return LEDA_ACCESS(vtype,entry(v)); }
  653. /*{Marrop      returns a reference to $G$.inf($v$).}*/
  654. etype& operator[] (edge e)    { return LEDA_ACCESS(etype,entry(e)); }
  655. /*{Marrop      returns a reference to $G$.inf($e$).}*/
  656. vtype  operator[] (node v) const   { return LEDA_ACCESS(vtype,graph::inf(v)); }
  657. etype  operator[] (edge e) const   { return LEDA_ACCESS(etype,graph::inf(e)); }
  658. };
  659. /*{Mimplementation
  660. Parameterized graphs are derived from directed graphs. All additional 
  661. operations for manipulating the node and edge entries take constant
  662. time.}*/
  663. #include <LEDA/node_array.h>
  664. #include <LEDA/edge_array.h>
  665. #include <LEDA/node_list.h>
  666. #include <LEDA/node_map.h>
  667. #include <LEDA/edge_map.h>
  668. #include <LEDA/graph_gen.h>
  669. #include <LEDA/graph_misc.h>
  670. #endif