home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / diverses / leda / src / graph / _graph.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-15  |  4.9 KB  |  234 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  2.1.1                                                 11-15-1991
  4. +
  5. +
  6. +  _graph.c
  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.  
  16. #include <LEDA/graph.h>
  17.  
  18. // constructors, destructor, operator=, ...
  19.  
  20. graph::graph() 
  21. { max_node_index = -1;
  22.   max_edge_index = -1; 
  23.   parent = 0; 
  24.   undirected = false;
  25.  }
  26.  
  27.  
  28. graph& graph::operator=(const graph& G)
  29. { node v,w;
  30.   edge e,e1;
  31.   node* node_vec = new node[G.max_node_index+1];
  32.  
  33.   edge* edge_vec = new edge[G.max_edge_index+1];
  34.  
  35.   clear();
  36.  
  37.  
  38.   forall_nodes(v,G) 
  39.   { copy_node_entry(v->contents);
  40.     node_vec[v->i_name] = new_node(v->contents);
  41.    }
  42.                              
  43.   forall_edges(e,G) 
  44.    { v = node_vec[e->s->i_name];
  45.      w = node_vec[e->t->i_name];
  46.      copy_edge_entry(e->contents);
  47.      edge_vec[e->i_name] = e1 = new i_edge(v,w,e->contents);
  48.      e1->loc = E.append(e1);
  49.      e1->i_name = ++max_edge_index;
  50.      w->indegree++;
  51.     }
  52.  
  53.   forall_nodes(v,G) 
  54.   forall_adj_edges(e,v)
  55.   { e1 = edge_vec[e->i_name];
  56.     if (v == e->s && e1->adj_loc == nil) 
  57.       e1->adj_loc  = node_vec[v->i_name]->adj_edges.append(e1);
  58.     else 
  59.       e1->adj_loc2 = node_vec[v->i_name]->adj_edges.append(e1);
  60.    }
  61.  
  62.   forall_nodes(v,*this) init_adj_iterator(v); 
  63.  
  64.   parent = G.parent;
  65.   undirected = G.undirected;
  66.  
  67.   delete node_vec;
  68.   delete edge_vec;
  69.  
  70.   return *this;
  71. }
  72.  
  73.  
  74. void graph::copy_all_entries()
  75. { node v;
  76.   edge e;
  77.   forall(v,V) copy_node_entry(v->contents);
  78.   forall(e,E) copy_edge_entry(e->contents);
  79. }
  80.  
  81.  
  82. graph::graph(const graph& G)  
  83. { node v,w;
  84.   edge e,e1;
  85.   node* node_vec = new node[G.max_node_index+1];
  86.   edge* edge_vec = new edge[G.max_edge_index+1];
  87.  
  88.  
  89.   max_node_index = max_edge_index = -1;
  90.  
  91.   forall_nodes(v,G) node_vec[v->i_name] = new_node(v->contents);
  92.                              
  93.   forall_edges(e,G) 
  94.    { v = node_vec[e->s->i_name];
  95.      w = node_vec[e->t->i_name];
  96.      copy_edge_entry(e->contents);
  97.      edge_vec[e->i_name] = e1 = new i_edge(v,w,e->contents);
  98.      e1->loc = E.append(e1);
  99.      e1->i_name = ++max_edge_index;
  100.      w->indegree++;
  101.     }
  102.  
  103.   forall_nodes(v,G) 
  104.   forall_adj_edges(e,v)
  105.   { e1 = edge_vec[e->i_name];
  106.     if (v == e->s && e1->adj_loc == nil) 
  107.       e1->adj_loc  = node_vec[v->i_name]->adj_edges.append(e1);
  108.     else 
  109.       e1->adj_loc2 = node_vec[v->i_name]->adj_edges.append(e1);
  110.    }
  111.  
  112.  
  113.   forall_nodes(v,*this) init_adj_iterator(v); 
  114.  
  115.   parent = G.parent;
  116.   undirected = G.undirected;
  117.  
  118.   delete node_vec;
  119.   delete edge_vec;
  120.  
  121. }
  122.  
  123.  
  124. // subgraph constructors  (do not work for undirected graphs)
  125.  
  126. graph::graph(graph& G, list(node)& nl, list(edge)& el)
  127. { // construct subgraph (nl,el) of graph G
  128.  
  129.   parent = &G;
  130.   node v,w;
  131.   edge e;
  132.  
  133.   node* N = new node[G.max_node_index+1];
  134.  
  135.   forall(v,nl)
  136.    { if (graph_of(v) != parent) 
  137.       error_handler(1,"graph: illegal node in subgraph constructor");
  138.      N[v->i_name] = new_node((ent)v);
  139.     }
  140.  
  141.   forall(e,el)
  142.    { v = source(e);
  143.      w = target(e);
  144.      if ( graph_of(e)!= parent || N[v->i_name]==0 || N[w->i_name]==0 ) 
  145.       error_handler(1,"graph: illegal edge in subgraph constructor");
  146.      new_edge(N[v->i_name],N[w->i_name],(ent)e);
  147.     }
  148.  
  149.   undirected = G.undirected;
  150.  
  151.   delete N;
  152.  
  153.  }
  154.  
  155. graph::graph(graph& G, list(edge)& el)
  156. { /* construct subgraph of graph G with edge set el  */
  157.  
  158.   node  v,w;
  159.   edge  e;
  160.   node* N = new node[G.max_node_index+1];
  161.  
  162.   forall(v,G.V) N[v->i_name] = 0;
  163.  
  164.   parent = &G;
  165.  
  166.   forall(e,el)
  167.    { v = source(e);
  168.      w = target(e);
  169.      if (N[v->i_name] == 0) N[v->i_name] = new_node((ent)v);
  170.      if (N[w->i_name] == 0) N[w->i_name] = new_node((ent)w);
  171.      if ( graph_of(e) != parent )
  172.       error_handler(1,"graph: illegal edge in subgraph constructor");
  173.      new_edge(N[v->i_name],N[w->i_name],(ent)e);
  174.     }
  175.  
  176.   undirected = G.undirected;
  177.  
  178.   delete N;
  179.  
  180.  }
  181.  
  182.  
  183. // destructor
  184.  
  185. void graph::clear()
  186. { node v;
  187.   edge e;
  188.  
  189.   if (parent==0)  // no subgraph
  190.   {
  191.    forall(e,E) { clear_edge_entry(e->contents);
  192.                  delete e;
  193.                 }
  194.    forall(v,V) { clear_node_entry(v->contents);
  195.                  v->adj_edges.clear();
  196.                  delete v;
  197.                 }
  198.   }
  199.   else           // subgraph
  200.   { 
  201.     forall(e,E) delete e;
  202.     forall(v,V) { v->adj_edges.clear();
  203.                   delete v;
  204.                  }
  205.    }
  206.  
  207.   V.clear();
  208.   E.clear();
  209.  
  210.   max_node_index = max_edge_index = -1;
  211. }
  212.  
  213.  
  214. list(node) graph::all_nodes()       const { return V; }
  215. list(edge) graph::all_edges()       const { return E; }
  216. list(edge) graph::adj_edges(node v) const { return v->adj_edges; }
  217.  
  218.  
  219. list(node) graph::adj_nodes(node v) const
  220. { list(node) result;
  221.   edge e;
  222.   forall(e,v->adj_edges) result.append(target(e));
  223.   return result;
  224. }
  225.  
  226.  
  227. int  graph::space() const
  228. { int vs = sizeof(dlink) + sizeof(i_node);
  229.   int es = 2*sizeof(dlink) + sizeof(i_edge);
  230.   return V.length()*vs + E.length()*es + 48;  
  231. }
  232.  
  233.