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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _g_update.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. list<edge> graph::insert_reverse_edges()
  13. { list<edge> L;
  14.   edge e = first_edge();
  15.   if (e != nil)
  16.   { L.append(new_edge(e->t,e->s,e->data[0]));
  17.     copy_edge_entry(e->data[0]);
  18.     e = succ_edge(e);
  19.    }
  20.   edge stop = last_edge();
  21.   while (e != stop)
  22.   { L.append(new_edge(e->t,e->s,e->data[0]));
  23.     copy_edge_entry(e->data[0]);
  24.     e = succ_edge(e);
  25.    } 
  26.   return L;
  27. }
  28. void graph::reset()  const   // reset all iterators
  29. { node v;
  30.   forall_nodes(v,*this) v->adj_iterator=nil;
  31. }
  32. node graph::new_node()
  33.   GenPtr i;
  34.   init_node_entry(i);
  35.   node v = new node_struct(i); 
  36.   v->g = this;
  37.   v->name = ++max_n_index;
  38.   aux_link(v)->succ_link = nil;
  39.   V.append(node_link(v));
  40.   return v;
  41. }
  42. node graph::new_node(GenPtr i)
  43.   node v = new node_struct(i); 
  44.   v->g = this;
  45.   v->name = ++max_n_index;
  46.   aux_link(v)->succ_link = nil;
  47.   V.append(node_link(v));
  48.   return v;
  49. }
  50. void graph::del_node(node v)
  51. { if (v->g != this) error_handler(4,"del_node: v is not in G");
  52.   // delete adjacent edges
  53.   while (outdeg(v) != 0) del_edge(first_adj_edge(v));
  54.   while (indeg(v) != 0) del_edge(first_in_edge(v));
  55.   V.del(node_link(v));
  56.   if (parent==0)   // no subgraph
  57.     clear_node_entry(v->data[0]);
  58.  
  59.   delete v;
  60. }
  61. edge graph::new_edge(node v, node w, GenPtr i)
  62. { if ((v->g!=this) || (w->g!=this)) 
  63.       error_handler(6, "G.new_edge(v,w): v or w not in G");
  64.   edge e = new edge_struct(v,w,i);
  65.   e->name = ++max_e_index;
  66.   E.append(edge_link(e));
  67.   v->adj_edges[0].append(adj_link1(e));
  68.   w->adj_edges[1].append(adj_link2(e));
  69.   return e ; 
  70. }
  71. edge graph::new_edge(edge e1, node w, GenPtr i, int dir)  
  72. { //add edge (source(e1),w) after/before e1 to adjacency list of source(e1)
  73.   node v  = e1->s;
  74.   if ((v->g!=this) || (w->g!=this)) 
  75.      error_handler(9,"G.new_edge(e,w): e or w not in G");
  76.   edge e = new edge_struct(v,w,i);
  77.   e->name = ++max_e_index;
  78.   E.append(edge_link(e));
  79.   v->adj_edges[0].insert(adj_link1(e),adj_link1(e1),dir);
  80.   w->adj_edges[1].append(adj_link2(e));
  81.   return e ; 
  82. }
  83. edge graph::new_edge(edge e1, edge e2, GenPtr i, int dir1, int dir2)  
  84. { //add edge (source(e1),target(e2)) 
  85.   //after(dir=0)/before(dir=1) e1 to out-list of source(e1)
  86.   //after(dir=1)/before(dir=1) e2 to in-list of target(e2)
  87.   node v  = e1->s;
  88.   node w  = e2->t;
  89.   if ((v->g!=this) || (w->g!=this)) 
  90.      error_handler(9,"G.new_edge(e,w): e or w not in G");
  91.   edge e = new edge_struct(v,w,i);
  92.   e->name = ++max_e_index;
  93.   E.append(edge_link(e));
  94.   v->adj_edges[0].insert(adj_link1(e),adj_link1(e1),dir1);
  95.   w->adj_edges[1].insert(adj_link2(e),adj_link2(e2),dir2);
  96.   return e ; 
  97. }
  98. void graph::del_edge(edge e)
  99. { node v = e->s;
  100.   node w = e->t;
  101.   if (v->g != this) error_handler(10,"del_edge: e is not in G");
  102.      
  103.   E.del(edge_link(e));
  104.   v->adj_edges[0].del(adj_link1(e));
  105.   w->adj_edges[1].del(adj_link2(e));
  106.   if (parent == 0)  // no subgraph
  107.      clear_edge_entry(e->data[0]);
  108.   delete e; 
  109. }
  110.  
  111. void graph::hide_edge(edge e)
  112. { adj_link1 l1 = adj_link1(e);
  113.   if (l1->succ_link != l1)
  114.   { e->s->adj_edges[0].del(l1);
  115.     e->t->adj_edges[1].del(adj_link2(e));
  116.     l1->succ_link = l1;
  117.    }
  118.  }
  119. void graph::restore_edge(edge e)
  120. { adj_link1 l1 = adj_link1(e);
  121.   if (l1->succ_link == l1) 
  122.   { e->s->adj_edges[0].append(l1);
  123.     e->t->adj_edges[1].append(adj_link2(e));
  124.    }
  125.  }
  126. edge graph::rev_edge(edge e)
  127. { node v = e->s;
  128.   node w = e->t;
  129.   if (v->g != this) error_handler(11,"rev_edge: e is not in G");
  130.   v->adj_edges[0].del(adj_link1(e));
  131.   w->adj_edges[1].del(adj_link2(e));
  132.   w->adj_edges[0].append(adj_link1(e));
  133.   v->adj_edges[1].append(adj_link2(e));
  134.   e->s = w;
  135.   e->t = v;
  136.   return e; 
  137. }
  138. graph& graph::rev()              
  139. { edge e;
  140.   forall_edges(e,*this) rev_edge(e);
  141.   return *this; 
  142. }
  143. void graph::del_all_nodes() { clear(); }
  144. void graph::del_all_edges()
  145. { node v;
  146.   forall_nodes(v,*this) 
  147.   { v->adj_edges[0].clear();
  148.     v->adj_edges[1].clear();
  149.    }
  150.   while (!E.empty()) delete edge(edge_link(E.pop()));
  151.   max_e_index = -1;
  152. }