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

  1. /*******************************************************************************
  2. +
  3. +  LEDA  2.1.1                                                 11-15-1991
  4. +
  5. +
  6. +  _ugraph.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. #include <LEDA/ugraph.h>
  16.  
  17. //------------------------------------------------------------------------------
  18. // undirected graphs 
  19. //------------------------------------------------------------------------------
  20.  
  21. void  ugraph::print_edge(edge e,ostream& o) const
  22. { o <<   "[" << e->s->i_name << "]==";
  23.   print_edge_entry(o,e->contents);
  24.   o << "==[" << e->t->i_name << "]";
  25.  }
  26.  
  27. edge ugraph::new_edge(node v, node w, ent i) 
  28.  
  29. /*
  30.   if (v==w) error_handler(99,ugraph::new_edge: self-loop");
  31. */
  32.  
  33.   if ((v->g!=this) || (w->g!=this)) 
  34.   error_handler(1, "ugraph::new_edge(v,w): v or w  not in G ");
  35.  
  36.   edge e = graph::new_edge(v,w,i);
  37.   e->adj_loc2 = w->adj_edges.append(e);
  38.   return e;
  39.  }
  40.  
  41. edge ugraph::new_edge(node v,node w,edge e1,edge e2,ent i,int d1,int d2) 
  42.  
  43. /*
  44.   if (v==w) error_handler(99,ugraph::new_edge: self-loop");
  45. */
  46.  
  47.   if ((v->g!=this) || (w->g!=this)) 
  48.   error_handler(1, "ugraph::new_edge(v,w): v or w  not in G ");
  49.  
  50.   edge e = new i_edge(v,w,i);
  51.  
  52.   e->i_name = ++max_edge_index;
  53.   w->indegree++;
  54.   e->loc = E.append(e);
  55.  
  56.   if (v==e1->s)
  57.       e->adj_loc=v->adj_edges.insert(e,e1->adj_loc,d1);
  58.   else 
  59.       if (v==e1->t) 
  60.           e->adj_loc=v->adj_edges.insert(e,e1->adj_loc2,d1);
  61.       else 
  62.           error_handler(1,"ugraph::new_edge: e1 not adjacent to v.");
  63.  
  64.  
  65.   if (w==e2->s) 
  66.       e->adj_loc2 = w->adj_edges.insert(e,e2->adj_loc,d2);
  67.   else 
  68.       if (w==e2->t) 
  69.           e->adj_loc2 = w->adj_edges.insert(e,e2->adj_loc2,d2);
  70.       else 
  71.           error_handler(1,"ugraph::new_edge: e2 not adjacent to w.");
  72.  
  73.   return e;
  74.  }
  75.  
  76.  
  77.  
  78. list(node) ugraph::adj_nodes(node v) const
  79. { list(node) result;
  80.   edge e;
  81.   forall(e,v->adj_edges) result.append(opposite(v,e));
  82.   return result;
  83. }
  84.  
  85. // ugraph subgraph constructors:
  86.  
  87. ugraph::ugraph(ugraph& G, list(node)& nl, list(edge)& el)
  88. { // construct subugraph (nl,el) of ugraph G
  89.  
  90.   parent = &G;
  91.   node v,w;
  92.   edge e;
  93.  
  94.   node* N = new node[G.max_node_index+1];
  95.  
  96.   forall(v,nl)
  97.    { if (graph_of(v) != parent) 
  98.       error_handler(1,"ugraph: illegal node in subgraph constructor");
  99.      N[v->i_name] = new_node((ent)v);
  100.     }
  101.  
  102.   forall(e,el)
  103.    { v = source(e);
  104.      w = target(e);
  105.      if ( graph_of(e)!= parent || N[v->i_name]==0 || N[w->i_name]==0 ) 
  106.       error_handler(1,"ugraph: illegal edge in subgraph constructor");
  107.      new_edge(N[v->i_name],N[w->i_name],(ent)e);
  108.     }
  109.  
  110.   delete N;
  111.  
  112.  }
  113.  
  114. ugraph::ugraph(ugraph& G, list(edge)& el)
  115. { // construct subgraph of ugraph G with edgelist el 
  116.  
  117.   node  v,w;
  118.   edge  e;
  119.   node* N = new node[G.max_node_index+1];
  120.  
  121.   forall(v,G.V) N[v->i_name] = 0;
  122.  
  123.   parent = &G;
  124.  
  125.   forall(e,el)
  126.    { v = source(e);
  127.      w = target(e);
  128.      if (N[v->i_name] == 0) N[v->i_name] = new_node((ent)v);
  129.      if (N[w->i_name] == 0) N[w->i_name] = new_node((ent)w);
  130.      if ( graph_of(e) != parent )
  131.       error_handler(1,"ugraph: illegal edge in subgraph constructor");
  132.      new_edge(N[v->i_name],N[w->i_name],(ent)e);
  133.     }
  134.  
  135.   delete N;
  136.  
  137.  }
  138.  
  139. node ugraph::opposite(node v, edge e)  const
  140. { if (v==e->s) return e->t;
  141.   if (v==e->t) return e->s;
  142.   return 0;
  143.  }
  144.  
  145. edge ugraph::adj_succ(edge e,node v)  const
  146. { list_item loc;
  147.  
  148.   if (e->s == e->t)  
  149.        error_handler(9999,"ugraph::adj_succ: self-loop");
  150.  
  151.   if (v == e->s) 
  152.     loc = e->s->adj_edges.succ(e->adj_loc);
  153.   else if (v == e->t) 
  154.          loc = e->s->adj_edges.succ(e->adj_loc2);
  155.        else error_handler(9999,"adj_succ: v is no endpoint of e");
  156.   return (loc) ? e->s->adj_edges[loc] : 0;
  157. }
  158.  
  159. edge ugraph::adj_pred(edge e,node v)  const
  160. { list_item loc;
  161.  
  162.   if (e->s == e->t)  
  163.        error_handler(9999,"ugraph::adj_pred: self-loop");
  164.  
  165.   if (v == e->s) 
  166.      loc = e->s->adj_edges.pred(e->adj_loc);
  167.   else if (v == e->t) 
  168.          loc = e->s->adj_edges.pred(e->adj_loc2);
  169.        else error_handler(9999,"ugraph::adj_pred: v is no endpoint of e");
  170.   return (loc) ? e->s->adj_edges[loc] : 0;
  171.  }
  172.  
  173. edge ugraph::cyclic_adj_succ(edge e,node v)  const
  174. { list_item loc;
  175.  
  176.   if (e->s == e->t)  
  177.        error_handler(9999,"ugraph::cyclic_adj_succ: self-loop");
  178.  
  179.   if (v == e->s)
  180.     loc =  v->adj_edges.cyclic_succ(e->adj_loc);
  181.   else if (v == e->t)
  182.          loc =  v->adj_edges.cyclic_succ(e->adj_loc2);
  183.        else error_handler(9999,"ugraph::cyclic_adj_succ: v is no endpoint of e");
  184.   return v->adj_edges[loc];
  185.  }
  186.  
  187. edge ugraph::cyclic_adj_pred(edge e,node v)  const
  188. { list_item loc;
  189.  
  190.   if (e->s == e->t)  
  191.        error_handler(9999,"ugraph::cyclic_adj_pred: self-loop");
  192.  
  193.   if (v == e->s)
  194.     loc =  v->adj_edges.cyclic_pred(e->adj_loc);
  195.   else if (v == e->t)
  196.          loc =  v->adj_edges.cyclic_pred(e->adj_loc2);
  197.        else error_handler(9999,"ugraph::cyclic_adj_pred: v is no endpoint of e");
  198.   return v->adj_edges[loc];
  199.  }
  200.  
  201.