_graph.c
Upload User: gzelex
Upload Date: 2007-01-07
Package Size: 707k
Code Size: 4k
Development Platform:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _graph.c
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #include <LEDA/graph.h>
  12. // constructors, destructor, operator=, ...
  13. graph::graph() 
  14. { max_n_index = -1;
  15.   max_e_index = -1; 
  16.   parent = 0; 
  17.   undirected = false;
  18.  }
  19. graph& graph::operator=(const graph& G)
  20.   if (&G == this) return *this;
  21.   clear();
  22.   node* node_vec = new node[G.max_n_index+1];
  23.   edge* edge_vec = new edge[G.max_e_index+1];
  24.   node v;
  25.   forall_nodes(v,G) 
  26.      node_vec[v->name] = new_node(v->data[0]);
  27.   edge e;
  28.   forall_nodes(v,G) 
  29.     forall_out_edges(e,v) 
  30.        edge_vec[e->name] = new_edge(node_vec[e->s->name],
  31.                                     node_vec[e->t->name], e->data[0]);
  32.   parent = G.parent;
  33.   undirected = G.undirected;
  34.   delete node_vec;
  35.   delete edge_vec;
  36.   return *this;
  37. }
  38. void graph::copy_all_entries() const
  39. { node v;
  40.   forall_nodes(v,*this) copy_node_entry(v->data[0]);
  41.   edge e;
  42.   forall_edges(e,*this) copy_edge_entry(e->data[0]);
  43. }
  44. void graph::clear_all_entries() const
  45. { node v;
  46.   forall_nodes(v,*this) clear_node_entry(v->data[0]);
  47.   edge e;
  48.   forall_edges(e,*this) clear_edge_entry(e->data[0]);
  49. }
  50. graph::graph(const graph& G)  
  51.   node* node_vec = new node[G.max_n_index+1];
  52.   edge* edge_vec = new edge[G.max_e_index+1];
  53.   max_n_index = max_e_index = -1;
  54.   node v;
  55.   forall_nodes(v,G) 
  56.      node_vec[v->name] = new_node(v->data[0]);
  57.   edge e;
  58.   forall_nodes(v,G) 
  59.     forall_out_edges(e,v) 
  60.        edge_vec[e->name] = new_edge(node_vec[e->s->name],
  61.                                     node_vec[e->t->name], e->data[0]);
  62.   parent = G.parent;
  63.   undirected = G.undirected;
  64.   delete node_vec;
  65.   delete edge_vec;
  66. }
  67. // subgraph constructors  (do not work for undirected graphs)
  68. graph::graph(graph& G, const list<node>& nl, const list<edge>& el)
  69. { // construct subgraph (nl,el) of graph G
  70.   parent = &G;
  71.   node v,w;
  72.   edge e;
  73.   node* N = new node[G.max_n_index+1];
  74.   forall(v,nl)
  75.    { if (graph_of(v) != parent) 
  76.       error_handler(1,"graph: illegal node in subgraph constructor");
  77.      N[v->name] = new_node((GenPtr)v);
  78.     }
  79.   forall(e,el)
  80.    { v = source(e);
  81.      w = target(e);
  82.      if ( graph_of(e)!= parent || N[v->name]==0 || N[w->name]==0 ) 
  83.       error_handler(1,"graph: illegal edge in subgraph constructor");
  84.      new_edge(N[v->name],N[w->name],(GenPtr)e);
  85.     }
  86.   undirected = G.undirected;
  87.   delete N;
  88.  }
  89. graph::graph(graph& G, const list<edge>& el)
  90. { /* construct subgraph of graph G with edge set el  */
  91.   node  v,w;
  92.   edge  e;
  93.   node* N = new node[G.max_n_index+1];
  94.   forall_nodes(v,G) N[v->name] = 0;
  95.   parent = &G;
  96.   forall(e,el)
  97.    { v = source(e);
  98.      w = target(e);
  99.      if (N[v->name] == 0) N[v->name] = new_node((GenPtr)v);
  100.      if (N[w->name] == 0) N[w->name] = new_node((GenPtr)w);
  101.      if ( graph_of(e) != parent )
  102.       error_handler(1,"graph: illegal edge in subgraph constructor");
  103.      new_edge(N[v->name],N[w->name],(GenPtr)e);
  104.     }
  105.   undirected = G.undirected;
  106.   delete N;
  107.  }
  108. // destructor
  109. void graph::clear()
  110.   while ( ! E.empty() ) 
  111.     delete edge(edge_link(E.pop()));
  112.   while ( ! V.empty() ) 
  113.   { node v = node(node_link(V.pop()));
  114.     v->adj_edges[0].clear();
  115.     v->adj_edges[1].clear();
  116.     delete v;
  117.    }
  118.   max_n_index = max_e_index = -1;
  119. }
  120. list<node> graph::all_nodes() const
  121. { list<node> result;
  122.   node v;
  123.   forall_nodes(v,*this) result.append(v);
  124.   return result;
  125. }
  126. list<edge> graph::all_edges() const
  127. { list<edge> result;
  128.   edge e;
  129.   forall_edges(e,*this) result.append(e);
  130.   return result;
  131. }
  132. list<edge> graph::adj_edges(node v) const
  133. { list<edge> result;
  134.   edge e;
  135.   forall_adj_edges(e,v) result.append(e);
  136.   return result;
  137. }
  138. list<edge> graph::in_edges(node v) const
  139. { list<edge> result;
  140.   edge e;
  141.   forall_in_edges(e,v) result.append(e);
  142.   return result;
  143. }
  144. list<node> graph::adj_nodes(node v) const
  145. { list<node> result;
  146.   edge e;
  147.   forall_adj_edges(e,v) result.append(opposite(v,e));
  148.   return result;
  149. }
  150. void init_node_data(const graph& G,int i, GenPtr x)
  151. { node v;
  152.   forall_nodes(v,G) v->data[i] = x;
  153.  }