# HG changeset patch
# User alpar
# Date 1100888245 0
# Node ID 072bddac076e4de531ecec3bfa602ab4fac5d1d7
# Parent  8cb323dbae93f92c71bbbdd3347ec8335e497700
reverseEdge() and contract() member-functions added.
diff -r 8cb323dbae93 -r 072bddac076e src/lemon/list_graph.h
--- a/src/lemon/list_graph.h	Fri Nov 19 17:22:29 2004 +0000
+++ b/src/lemon/list_graph.h	Fri Nov 19 18:17:25 2004 +0000
@@ -313,8 +313,9 @@
 
   ///This is a simple and fast erasable graph implementation.
   ///
-  ///It conforms to the
-  ///\ref concept::ErasableGraph "ErasableGraph" concept.
+  ///It addition that it conforms to the
+  ///\ref concept::ErasableGraph "ErasableGraph" concept,
+  ///it also provides several additional useful extra functionalities.
   ///\sa concept::ErasableGraph.
 
   class ListGraph : public ErasableListGraphBase 
@@ -324,17 +325,67 @@
 
     /// Moves the target of \c e to \c n
     ///
+    ///\note The Edge's and OutEdge's
+    ///referencing the moved edge remain
+    ///valid. However InEdge's are invalidated.
     void moveTarget(Edge e, Node n) { _moveTarget(e,n); }
     /// Moves the source of \c e to \c n
 
     /// Moves the source of \c e to \c n
     ///
+    ///\note The Edge's and InEdge's
+    ///referencing the moved edge remain
+    ///valid. However OutEdge's are invalidated.
     void moveSource(Edge e, Node n) { _moveSource(e,n); }
 
+    /// Invert the direction of an edge.
+
+    ///\note The Edge's
+    ///referencing the moved edge remain
+    ///valid. However OutEdge's  and InEdge's are invalidated.
+    void reverseEdge(Edge e) {
+      Node t=target(e);
+      _moveTarget(e,source(e));
+      _moveSource(e,t);
+    }
+
+    ///Using this it possible to avoid the superfluous memory allocation.
+
     ///Using this it possible to avoid the superfluous memory allocation.
     ///\todo more docs...
     void reserveEdge(int n) { edges.reserve(n); };
-    
+
+    ///Contract two nodes.
+
+    ///This function contracts two nodes.
+    ///
+    ///Node \p b will be removed but instead of deleting
+    ///its neighboring edges, they will be joined to \p a.
+    ///The last parameter \p r controls whether to remove loops. \c true
+    ///means that loops will be removed.
+    ///
+    ///\note The Edges
+    ///referencing the moved edge remain
+    ///valid. However InEdge's and OutEdge's
+    ///may be invalidated.
+    void contract(Node a,Node b,bool r=true) 
+    {
+      for(OutEdgeIt e(*this,b);e!=INVALID;) {
+	OutEdgeIt f=e;
+	++f;
+	if(r && target(e)==a) erase(e);
+	else moveSource(e,b);
+	e=f;
+      }
+      for(InEdgeIt e(*this,b);e!=INVALID;) {
+	InEdgeIt f=e;
+	++f;
+	if(r && source(e)==a) erase(e);
+	else moveTarget(e,b);
+	e=f;
+      }
+      erase(b);
+    }
   };
   
   /// @}