Index: lemon/Makefile.am
===================================================================
--- lemon/Makefile.am	(revision 109)
+++ lemon/Makefile.am	(revision 108)
@@ -32,5 +32,4 @@
 	lemon/path.h \
         lemon/random.h \
-	lemon/smart_graph.h \
         lemon/tolerance.h \
 	lemon/unionfind.h
Index: lemon/assert.h
===================================================================
--- lemon/assert.h	(revision 108)
+++ lemon/assert.h	(revision 112)
@@ -116,11 +116,5 @@
 				const char *assertion)
   {
-    std::cerr << file << ":" << line << ": ";
-    if (function)
-      std::cerr << function << ": ";
-    std::cerr << exception.what();
-    if (assertion)
-      std::cerr << " (assertion '" << assertion << "' failed)";
-    std::cerr << std::endl;
+    assert_fail_log(file, line, function, exception, assertion);
     std::abort();
   }
@@ -130,11 +124,5 @@
 				const char *assertion)
   {
-    std::cerr << file << ":" << line << ": ";
-    if (function)
-      std::cerr << function << ": ";
-    std::cerr << message;
-    if (assertion)
-      std::cerr << " (assertion '" << assertion << "' failed)";
-    std::cerr << std::endl;
+    assert_fail_log(file, line, function, message, assertion);
     std::abort();
   }
@@ -145,5 +133,6 @@
 				const char *assertion)
   {
-    assert_fail_abort(file, line, function, message.c_str(), assertion);
+    assert_fail_log(file, line, function, message.c_str(), assertion);
+    std::abort();
   }
 
@@ -169,5 +158,5 @@
 				  const char *assertion)
   {
-    assert_fail_error(file, line, function, message.c_str(), assertion);
+    throw AssertionFailedError(file, line, function, message.c_str(), assertion);
   }
 
@@ -193,5 +182,5 @@
 				    const char *assertion)
   {
-    assert_fail_exception(file, line, function, message.c_str(), assertion);
+    throw AssertionFailedError(file, line, function, message.c_str(), assertion);
   }
 
@@ -209,5 +198,5 @@
   (defined(LEMON_ASSERT_EXCEPTION) ? 1 : 0) +		\
   (defined(LEMON_ASSERT_CUSTOM) ? 1 : 0) > 1
-#error "Lemon assertion system is not set properly"
+#error "LEMON assertion system is not set properly"
 #endif
 
@@ -217,7 +206,7 @@
      (defined(LEMON_ASSERT_EXCEPTION) ? 1 : 0) +	\
      (defined(LEMON_ASSERT_CUSTOM) ? 1 : 0) == 1 ||	\
-     defined(LEMON_ENABLE_ASSERT)) &&			\
+     defined(LEMON_ENABLE_ASSERTS)) &&			\
   defined(LEMON_DISABLE_ASSERTS)
-#error "Lemon assertion system is not set properly"
+#error "LEMON assertion system is not set properly"
 #endif
 
@@ -257,16 +246,16 @@
 /// \ingroup exceptions
 ///
-/// \brief Macro for assertions with customizable message
-///
-/// Macro for assertions with customizable message.  
-/// \param exp An expression convertible to bool. If the expression is
-/// false, then an assertion is raised. The concrete behaviour depends
-/// on the settings of the assertion system.
-/// \param msg A \e const \e char*, a \e const std::string& or a \e
-/// const \e std::exception& parameter. The variable can be used to
-/// provide information about the circumstances of failed assertion.
-///
-/// The assertions are disabled in the default behaviour. You can
-/// enable the assertions with the following code:
+/// \brief Macro for assertion with customizable message
+///
+/// Macro for assertion with customizable message.  
+/// \param exp An expression that must be convertible to \c bool.
+/// If it is \c false, then an assertion is raised. The concrete
+/// behaviour depends on the settings of the assertion system.
+/// \param msg A <tt>const char*</tt>, a <tt>const std::string&</tt> or
+/// a <tt>const std::exception&</tt> parameter, which can be used to
+/// provide information about the circumstances of the failed assertion.
+///
+/// The assertions are disabled in the default behaviour.
+/// You can enable them with the following code:
 /// \code
 /// #define LEMON_ENABLE_ASSERTS
@@ -278,37 +267,36 @@
 /// \endcode
 /// 
-/// The %lemon assertion system has a wide range of customization
-/// properties. As default behaviour the failed assertion prints a
-/// short log message to the standard ouput and aborts the execution.
+/// The LEMON assertion system has a wide range of customization
+/// properties. As a default behaviour the failed assertion prints a
+/// short log message to the standard error and aborts the execution.
 ///
 /// The following modes can be used in the assertion system: 
 ///
-/// - \e LEMON_ASSERT_LOG The failed assert print a short convenient
-///   error message to the standard error and continues the
-///   execution.
-/// - \e LEMON_ASSERT_ABORT This mode is similar to the \e
-///   LEMON_ASSERT_LOG, but it aborts the program. It is the default
-///   operation mode when the asserts are enabled with \e
-///   LEMON_ENABLE_ASSERTS.
-/// - \e LEMON_ASSERT_ERROR The assert throws an \ref
-///   lemon::AssertionFailedError "AssertionFailedError". If the \c
-///   msg parameter is an exception, then the result of the \ref
-///   lemon::Exception::what() "what()" member function is passed as
-///   error message.
-/// - \e LEMON_ASSERT_EXCEPTION If the specified \c msg is an
-///   exception then it raised directly (solving that the exception
+/// - \c LEMON_ASSERT_LOG The failed assertion prints a short log
+///   message to the standard error and continues the execution.
+/// - \c LEMON_ASSERT_ABORT This mode is similar to the
+///   \c LEMON_ASSERT_LOG, but it aborts the program. It is the default
+///   behaviour mode when the assertions are enabled with
+///   \c LEMON_ENABLE_ASSERTS.
+/// - \c LEMON_ASSERT_ERROR The assertion throws an
+///   \ref lemon::AssertionFailedError "AssertionFailedError".
+///   If the \c msg parameter is an exception, then the result of the
+///   \ref lemon::Exception::what() "what()" member function is passed
+///   as error message.
+/// - \c LEMON_ASSERT_EXCEPTION If the specified \c msg is an
+///   exception, then it raised directly (solving that the exception
 ///   can not be thrown polymorphically), otherwise an \ref
 ///   lemon::AssertionFailedError "AssertionFailedError" is thrown with
-///   the given parameter.
-/// - \e LEMON_ASSERT_CUSTOM The user can define an own assertion
-///   handler functions. Three overloaded functions should be defined
-///   with the following parameter lists:
+///   the given parameters.
+/// - \c LEMON_ASSERT_CUSTOM The user can define own assertion handler
+///   functions. Three overloaded functions should be defined with the
+///   following parameter lists:
 ///   \code
-///     void custom_assert_handler(const char* file, int line, 
-///                                const char* function, const char* message, const char* expression);
-///     void custom_assert_handler(const char* file, int line, 
-///                                const char* function, const std::string& message, const char* expression);
-///     void custom_assert_handler(const char* file, int line, 
-///                                const char* function, const std::exception& message, const char* expression);
+///     void custom_assert_handler(const char* file, int line, const char* function,
+///                                const char* message, const char* assertion);
+///     void custom_assert_handler(const char* file, int line, const char* function,
+///                                const std::string& message, const char* assertion);
+///     void custom_assert_handler(const char* file, int line, const char* function,
+///                                const std::exception& message, const char* assertion);
 ///   \endcode
 ///   The name of the functions should be defined as the \c
@@ -318,10 +306,10 @@
 ///   \endcode
 ///   Whenever an assertion is occured, one of the custom assertion
-///   handler is called with appropiate parameters.
-///
-/// The assertion mode can be changed within one compilation unit, if
-/// the macros are redefined with other settings and the
-/// lemon/assert.h file is reincluded then the behaviour is changed
-/// appropiately to the new settings.
+///   handlers is called with appropiate parameters.
+///
+/// The assertion mode can also be changed within one compilation unit.
+/// If the macros are redefined with other settings and the
+/// \ref lemon/assert.h "assert.h" file is reincluded, then the
+/// behaviour is changed appropiately to the new settings.
 #  define LEMON_ASSERT(exp, msg)					\
   (static_cast<void> (!!(exp) ? 0 : (					\
@@ -347,5 +335,5 @@
 
 #  ifndef LEMON_ASSERT_HANDLER
-#    define LEMON_ASSERT(exp, msg)  (static_cast<void> (0))
+#    define LEMON_ASSERT(exp, msg)  (static_cast<void>(0))
 #    define LEMON_FIXME(msg) (static_cast<void>(0))
 #  else
Index: lemon/random.h
===================================================================
--- lemon/random.h	(revision 110)
+++ lemon/random.h	(revision 102)
@@ -66,5 +66,6 @@
 #include <iterator>
 #include <vector>
-#include <limits>
+
+#include <ctime>
 
 #include <lemon/math.h>
Index: lemon/smart_graph.h
===================================================================
--- lemon/smart_graph.h	(revision 109)
+++ 	(revision )
@@ -1,757 +1,0 @@
-/* -*- C++ -*-
- *
- * This file is a part of LEMON, a generic C++ optimization library
- *
- * Copyright (C) 2003-2008
- * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
- * (Egervary Research Group on Combinatorial Optimization, EGRES).
- *
- * Permission to use, modify and distribute this software is granted
- * provided that this copyright notice appears in all copies. For
- * precise terms see the accompanying LICENSE file.
- *
- * This software is provided "AS IS" with no warranty of any kind,
- * express or implied, and with no claim as to its suitability for any
- * purpose.
- *
- */
-
-#ifndef LEMON_SMART_GRAPH_H
-#define LEMON_SMART_GRAPH_H
-
-///\ingroup graphs
-///\file
-///\brief SmartDigraph and SmartGraph classes.
-
-#include <vector>
-
-#include <lemon/bits/invalid.h>
-
-#include <lemon/bits/base_extender.h>
-#include <lemon/bits/graph_extender.h>
-
-#include <lemon/bits/utility.h>
-#include <lemon/error.h>
-
-#include <lemon/bits/graph_extender.h>
-
-namespace lemon {
-
-  class SmartDigraph;
-  ///Base of SmartDigraph
-
-  ///Base of SmartDigraph
-  ///
-  class SmartDigraphBase {
-  protected:
-
-    struct NodeT 
-    {
-      int first_in, first_out;      
-      NodeT() {}
-    };
-    struct ArcT 
-    {
-      int target, source, next_in, next_out;      
-      ArcT() {}  
-    };
-
-    std::vector<NodeT> nodes;
-    std::vector<ArcT> arcs;
-        
-  public:
-
-    typedef SmartDigraphBase Graph;
-
-    class Node;
-    class Arc;
-
-  public:
-
-    SmartDigraphBase() : nodes(), arcs() { }
-    SmartDigraphBase(const SmartDigraphBase &_g) 
-      : nodes(_g.nodes), arcs(_g.arcs) { }
-    
-    typedef True NodeNumTag;
-    typedef True ArcNumTag;
-
-    int nodeNum() const { return nodes.size(); }
-    int arcNum() const { return arcs.size(); }
-
-    int maxNodeId() const { return nodes.size()-1; }
-    int maxArcId() const { return arcs.size()-1; }
-
-    Node addNode() {
-      int n = nodes.size();     
-      nodes.push_back(NodeT());
-      nodes[n].first_in = -1;
-      nodes[n].first_out = -1;
-      return Node(n);
-    }
-    
-    Arc addArc(Node u, Node v) {
-      int n = arcs.size(); 
-      arcs.push_back(ArcT());
-      arcs[n].source = u._id; 
-      arcs[n].target = v._id;
-      arcs[n].next_out = nodes[u._id].first_out;
-      arcs[n].next_in = nodes[v._id].first_in;
-      nodes[u._id].first_out = nodes[v._id].first_in = n;
-
-      return Arc(n);
-    }
-
-    void clear() {
-      arcs.clear();
-      nodes.clear();
-    }
-
-    Node source(Arc a) const { return Node(arcs[a._id].source); }
-    Node target(Arc a) const { return Node(arcs[a._id].target); }
-
-    static int id(Node v) { return v._id; }
-    static int id(Arc a) { return a._id; }
-
-    static Node nodeFromId(int id) { return Node(id);}
-    static Arc arcFromId(int id) { return Arc(id);}
-
-    class Node {
-      friend class SmartDigraphBase;
-      friend class SmartDigraph;
-
-    protected:
-      int _id;
-      explicit Node(int id) : _id(id) {}
-    public:
-      Node() {}
-      Node (Invalid) : _id(-1) {}
-      bool operator==(const Node i) const {return _id == i._id;}
-      bool operator!=(const Node i) const {return _id != i._id;}
-      bool operator<(const Node i) const {return _id < i._id;}
-    };
-    
-
-    class Arc {
-      friend class SmartDigraphBase;
-      friend class SmartDigraph;
-
-    protected:
-      int _id;
-      explicit Arc(int id) : _id(id) {}
-    public:
-      Arc() { }
-      Arc (Invalid) : _id(-1) {}
-      bool operator==(const Arc i) const {return _id == i._id;}
-      bool operator!=(const Arc i) const {return _id != i._id;}
-      bool operator<(const Arc i) const {return _id < i._id;}
-    };
-
-    void first(Node& node) const {
-      node._id = nodes.size() - 1;
-    }
-
-    static void next(Node& node) {
-      --node._id;
-    }
-
-    void first(Arc& arc) const {
-      arc._id = arcs.size() - 1;
-    }
-
-    static void next(Arc& arc) {
-      --arc._id;
-    }
-
-    void firstOut(Arc& arc, const Node& node) const {
-      arc._id = nodes[node._id].first_out;
-    }
-
-    void nextOut(Arc& arc) const {
-      arc._id = arcs[arc._id].next_out;
-    }
-
-    void firstIn(Arc& arc, const Node& node) const {
-      arc._id = nodes[node._id].first_in;
-    }
-    
-    void nextIn(Arc& arc) const {
-      arc._id = arcs[arc._id].next_in;
-    }
-
-  };
-
-  typedef DigraphExtender<SmartDigraphBase> ExtendedSmartDigraphBase;
-
-  ///\ingroup graphs
-  ///
-  ///\brief A smart directed graph class.
-  ///
-  ///This is a simple and fast digraph implementation.
-  ///It is also quite memory efficient, but at the price
-  ///that <b> it does support only limited (only stack-like)
-  ///node and arc deletions</b>.
-  ///It conforms to the \ref concepts::Digraph "Digraph concept" with
-  ///an important extra feature that its maps are real \ref
-  ///concepts::ReferenceMap "reference map"s.
-  ///
-  ///\sa concepts::Digraph.
-  ///
-  ///\author Alpar Juttner
-  class SmartDigraph : public ExtendedSmartDigraphBase {
-  public:
-
-    typedef ExtendedSmartDigraphBase Parent;
-
-  private:
-
-    ///SmartDigraph is \e not copy constructible. Use DigraphCopy() instead.
-
-    ///SmartDigraph is \e not copy constructible. Use DigraphCopy() instead.
-    ///
-    SmartDigraph(const SmartDigraph &) : ExtendedSmartDigraphBase() {};
-    ///\brief Assignment of SmartDigraph to another one is \e not allowed.
-    ///Use DigraphCopy() instead.
-
-    ///Assignment of SmartDigraph to another one is \e not allowed.
-    ///Use DigraphCopy() instead.
-    void operator=(const SmartDigraph &) {}
-
-  public:
-    
-    /// Constructor
-    
-    /// Constructor.
-    ///
-    SmartDigraph() {};
-    
-    ///Add a new node to the digraph.
-    
-    /// \return the new node.
-    ///
-    Node addNode() { return Parent::addNode(); }
-    
-    ///Add a new arc to the digraph.
-    
-    ///Add a new arc to the digraph with source node \c s
-    ///and target node \c t.
-    ///\return the new arc.
-    Arc addArc(const Node& s, const Node& t) { 
-      return Parent::addArc(s, t); 
-    }
-
-    /// \brief Using this it is possible to avoid the superfluous memory
-    /// allocation.
-
-    /// Using this it is possible to avoid the superfluous memory
-    /// allocation: if you know that the digraph you want to build will
-    /// be very large (e.g. it will contain millions of nodes and/or arcs)
-    /// then it is worth reserving space for this amount before starting
-    /// to build the digraph.
-    /// \sa reserveArc
-    void reserveNode(int n) { nodes.reserve(n); };
-
-    /// \brief Using this it is possible to avoid the superfluous memory
-    /// allocation.
-
-    /// Using this it is possible to avoid the superfluous memory
-    /// allocation: if you know that the digraph you want to build will
-    /// be very large (e.g. it will contain millions of nodes and/or arcs)
-    /// then it is worth reserving space for this amount before starting
-    /// to build the digraph.
-    /// \sa reserveNode
-    void reserveArc(int m) { arcs.reserve(m); };
-
-    ///Clear the digraph.
-    
-    ///Erase all the nodes and arcs from the digraph.
-    ///
-    void clear() {
-      Parent::clear();
-    }
-
-    ///Split a node.
-    
-    ///This function splits a node. First a new node is added to the digraph,
-    ///then the source of each outgoing arc of \c n is moved to this new node.
-    ///If \c connect is \c true (this is the default value), then a new arc
-    ///from \c n to the newly created node is also added.
-    ///\return The newly created node.
-    ///
-    ///\note The <tt>Arc</tt>s
-    ///referencing a moved arc remain
-    ///valid. However <tt>InArc</tt>'s and <tt>OutArc</tt>'s
-    ///may be invalidated.
-    ///\warning This functionality cannot be used together with the Snapshot
-    ///feature.
-    ///\todo It could be implemented in a bit faster way.
-    Node split(Node n, bool connect = true)
-    {
-      Node b = addNode();
-      nodes[b._id].first_out=nodes[n._id].first_out;
-      nodes[n._id].first_out=-1;
-      for(int i=nodes[b._id].first_out;i!=-1;i++) arcs[i].source=b._id;
-      if(connect) addArc(n,b);
-      return b;
-    }
-
-  public:
-    
-    class Snapshot;
-
-  protected:
-
-    void restoreSnapshot(const Snapshot &s)
-    {
-      while(s.arc_num<arcs.size()) {
-        Arc arc = arcFromId(arcs.size()-1);
-	Parent::notifier(Arc()).erase(arc);
-	nodes[arcs.back().source].first_out=arcs.back().next_out;
-	nodes[arcs.back().target].first_in=arcs.back().next_in;
-	arcs.pop_back();
-      }
-      while(s.node_num<nodes.size()) {
-        Node node = nodeFromId(nodes.size()-1);
-	Parent::notifier(Node()).erase(node);
-	nodes.pop_back();
-      }
-    }    
-
-  public:
-
-    ///Class to make a snapshot of the digraph and to restrore to it later.
-
-    ///Class to make a snapshot of the digraph and to restrore to it later.
-    ///
-    ///The newly added nodes and arcs can be removed using the
-    ///restore() function.
-    ///\note After you restore a state, you cannot restore
-    ///a later state, in other word you cannot add again the arcs deleted
-    ///by restore() using another one Snapshot instance.
-    ///
-    ///\warning If you do not use correctly the snapshot that can cause
-    ///either broken program, invalid state of the digraph, valid but
-    ///not the restored digraph or no change. Because the runtime performance
-    ///the validity of the snapshot is not stored.
-    class Snapshot 
-    {
-      SmartDigraph *_graph;
-    protected:
-      friend class SmartDigraph;
-      unsigned int node_num;
-      unsigned int arc_num;
-    public:
-      ///Default constructor.
-      
-      ///Default constructor.
-      ///To actually make a snapshot you must call save().
-      ///
-      Snapshot() : _graph(0) {}
-      ///Constructor that immediately makes a snapshot
-      
-      ///This constructor immediately makes a snapshot of the digraph.
-      ///\param _g The digraph we make a snapshot of.
-      Snapshot(SmartDigraph &graph) : _graph(&graph) {
-	node_num=_graph->nodes.size();
-	arc_num=_graph->arcs.size();
-      }
-
-      ///Make a snapshot.
-
-      ///Make a snapshot of the digraph.
-      ///
-      ///This function can be called more than once. In case of a repeated
-      ///call, the previous snapshot gets lost.
-      ///\param _g The digraph we make the snapshot of.
-      void save(SmartDigraph &graph) 
-      {
-	_graph=&graph;
-	node_num=_graph->nodes.size();
-	arc_num=_graph->arcs.size();
-      }
-
-      ///Undo the changes until a snapshot.
-      
-      ///Undo the changes until a snapshot created by save().
-      ///
-      ///\note After you restored a state, you cannot restore
-      ///a later state, in other word you cannot add again the arcs deleted
-      ///by restore().
-      void restore()
-      {
-	_graph->restoreSnapshot(*this);
-      }
-    };
-  };
-
-
-  class SmartGraphBase {
-
-  protected:
-
-    struct NodeT {
-      int first_out;
-    };
- 
-    struct ArcT {
-      int target;
-      int next_out;
-    };
-
-    std::vector<NodeT> nodes;
-    std::vector<ArcT> arcs;
-
-    int first_free_arc;
-    
-  public:
-    
-    typedef SmartGraphBase Digraph;
-
-    class Node;
-    class Arc;
-    class Edge;
-    
-    class Node {
-      friend class SmartGraphBase;
-    protected:
-
-      int _id;
-      explicit Node(int id) { _id = id;}
-
-    public:
-      Node() {}
-      Node (Invalid) { _id = -1; }
-      bool operator==(const Node& node) const {return _id == node._id;}
-      bool operator!=(const Node& node) const {return _id != node._id;}
-      bool operator<(const Node& node) const {return _id < node._id;}
-    };
-
-    class Edge {
-      friend class SmartGraphBase;
-    protected:
-
-      int _id;
-      explicit Edge(int id) { _id = id;}
-
-    public:
-      Edge() {}
-      Edge (Invalid) { _id = -1; }
-      bool operator==(const Edge& arc) const {return _id == arc._id;}
-      bool operator!=(const Edge& arc) const {return _id != arc._id;}
-      bool operator<(const Edge& arc) const {return _id < arc._id;}
-    };
-
-    class Arc {
-      friend class SmartGraphBase;
-    protected:
-
-      int _id;
-      explicit Arc(int id) { _id = id;}
-
-    public:
-      operator Edge() const { return edgeFromId(_id / 2); }
-
-      Arc() {}
-      Arc (Invalid) { _id = -1; }
-      bool operator==(const Arc& arc) const {return _id == arc._id;}
-      bool operator!=(const Arc& arc) const {return _id != arc._id;}
-      bool operator<(const Arc& arc) const {return _id < arc._id;}
-    };
-
-
-
-    SmartGraphBase()
-      : nodes(), arcs() {}
-
-    
-    int maxNodeId() const { return nodes.size()-1; } 
-    int maxEdgeId() const { return arcs.size() / 2 - 1; }
-    int maxArcId() const { return arcs.size()-1; }
-
-    Node source(Arc e) const { return Node(arcs[e._id ^ 1].target); }
-    Node target(Arc e) const { return Node(arcs[e._id].target); }
-
-    Node source(Edge e) const { return Node(arcs[2 * e._id].target); }
-    Node target(Edge e) const { return Node(arcs[2 * e._id + 1].target); }
-
-    static bool direction(Arc e) {
-      return (e._id & 1) == 1;
-    }
-
-    static Arc direct(Edge e, bool d) {
-      return Arc(e._id * 2 + (d ? 1 : 0));
-    }
-
-    void first(Node& node) const { 
-      node._id = nodes.size() - 1;
-    }
-
-    void next(Node& node) const {
-      --node._id;
-    }
-
-    void first(Arc& arc) const { 
-      arc._id = arcs.size() - 1;
-    }
-
-    void next(Arc& arc) const {
-      --arc._id;
-    }
-
-    void first(Edge& arc) const { 
-      arc._id = arcs.size() / 2 - 1;
-    }
-
-    void next(Edge& arc) const {
-      --arc._id;
-    }
-
-    void firstOut(Arc &arc, const Node& v) const {
-      arc._id = nodes[v._id].first_out;
-    }
-    void nextOut(Arc &arc) const {
-      arc._id = arcs[arc._id].next_out;
-    }
-
-    void firstIn(Arc &arc, const Node& v) const {
-      arc._id = ((nodes[v._id].first_out) ^ 1);
-      if (arc._id == -2) arc._id = -1;
-    }
-    void nextIn(Arc &arc) const {
-      arc._id = ((arcs[arc._id ^ 1].next_out) ^ 1);
-      if (arc._id == -2) arc._id = -1;
-    }
-
-    void firstInc(Edge &arc, bool& d, const Node& v) const {
-      int de = nodes[v._id].first_out;
-      if (de != -1) {
-        arc._id = de / 2;
-        d = ((de & 1) == 1);
-      } else {
-        arc._id = -1;
-        d = true;
-      }
-    }
-    void nextInc(Edge &arc, bool& d) const {
-      int de = (arcs[(arc._id * 2) | (d ? 1 : 0)].next_out);
-      if (de != -1) {
-        arc._id = de / 2;
-        d = ((de & 1) == 1);
-      } else {
-        arc._id = -1;
-        d = true;      
-      }
-    }
-    
-    static int id(Node v) { return v._id; }
-    static int id(Arc e) { return e._id; }
-    static int id(Edge e) { return e._id; }
-
-    static Node nodeFromId(int id) { return Node(id);}
-    static Arc arcFromId(int id) { return Arc(id);}
-    static Edge edgeFromId(int id) { return Edge(id);}
-
-    Node addNode() {     
-      int n = nodes.size();
-      nodes.push_back(NodeT());
-      nodes[n].first_out = -1;
-      
-      return Node(n);
-    }
-    
-    Edge addArc(Node u, Node v) {
-      int n = arcs.size();
-      arcs.push_back(ArcT());
-      arcs.push_back(ArcT());
-      
-      arcs[n].target = u._id;
-      arcs[n | 1].target = v._id;
-
-      arcs[n].next_out = nodes[v._id].first_out;
-      nodes[v._id].first_out = n;
-
-      arcs[n | 1].next_out = nodes[u._id].first_out;	
-      nodes[u._id].first_out = (n | 1);
-
-      return Edge(n / 2);
-    }
-    
-    void clear() {
-      arcs.clear();
-      nodes.clear();
-    }
-
-  };
-
-  typedef GraphExtender<SmartGraphBase> ExtendedSmartGraphBase;
-
-  /// \ingroup graphs
-  ///
-  /// \brief A smart undirected graph class.
-  ///
-  /// This is a simple and fast graph implementation.
-  /// It is also quite memory efficient, but at the price
-  /// that <b> it does support only limited (only stack-like)
-  /// node and arc deletions</b>.
-  /// Except from this it conforms to 
-  /// the \ref concepts::Graph "Graph concept".
-  ///
-  /// It also has an
-  /// important extra feature that
-  /// its maps are real \ref concepts::ReferenceMap "reference map"s.
-  ///
-  /// \sa concepts::Graph.
-  ///
-  class SmartGraph : public ExtendedSmartGraphBase {
-  private:
-
-    ///SmartGraph is \e not copy constructible. Use GraphCopy() instead.
-
-    ///SmartGraph is \e not copy constructible. Use GraphCopy() instead.
-    ///
-    SmartGraph(const SmartGraph &) : ExtendedSmartGraphBase() {};
-
-    ///\brief Assignment of SmartGraph to another one is \e not allowed.
-    ///Use GraphCopy() instead.
-
-    ///Assignment of SmartGraph to another one is \e not allowed.
-    ///Use GraphCopy() instead.
-    void operator=(const SmartGraph &) {}
-
-  public:
-
-    typedef ExtendedSmartGraphBase Parent;
-
-    /// Constructor
-    
-    /// Constructor.
-    ///
-    SmartGraph() {}
-
-    ///Add a new node to the graph.
-    
-    /// \return the new node.
-    ///
-    Node addNode() { return Parent::addNode(); }
-    
-    ///Add a new edge to the graph.
-    
-    ///Add a new edge to the graph with node \c s
-    ///and \c t.
-    ///\return the new edge.
-    Edge addEdge(const Node& s, const Node& t) { 
-      return Parent::addArc(s, t); 
-    }
-
-    ///Clear the graph.
-    
-    ///Erase all the nodes and edges from the graph.
-    ///
-    void clear() {
-      Parent::clear();
-    }
-
-  public:
-    
-    class Snapshot;
-
-  protected:
-
-    void saveSnapshot(Snapshot &s)
-    {
-      s._graph = this;
-      s.node_num = nodes.size();
-      s.arc_num = arcs.size();
-    }
-
-    void restoreSnapshot(const Snapshot &s)
-    {
-      while(s.arc_num<arcs.size()) {
-        int n=arcs.size()-1;
-        Edge arc=edgeFromId(n/2);
-	Parent::notifier(Edge()).erase(arc);
-        std::vector<Arc> dir;
-        dir.push_back(arcFromId(n));
-        dir.push_back(arcFromId(n-1));
-	Parent::notifier(Arc()).erase(dir);
-	nodes[arcs[n].target].first_out=arcs[n].next_out;
-	nodes[arcs[n-1].target].first_out=arcs[n-1].next_out;
-	arcs.pop_back();
-	arcs.pop_back();
-      }
-      while(s.node_num<nodes.size()) {
-        int n=nodes.size()-1;
-        Node node = nodeFromId(n);
-	Parent::notifier(Node()).erase(node);
-	nodes.pop_back();
-      }
-    }    
-
-  public:
-
-    ///Class to make a snapshot of the digraph and to restrore to it later.
-
-    ///Class to make a snapshot of the digraph and to restrore to it later.
-    ///
-    ///The newly added nodes and arcs can be removed using the
-    ///restore() function.
-    ///
-    ///\note After you restore a state, you cannot restore
-    ///a later state, in other word you cannot add again the arcs deleted
-    ///by restore() using another one Snapshot instance.
-    ///
-    ///\warning If you do not use correctly the snapshot that can cause
-    ///either broken program, invalid state of the digraph, valid but
-    ///not the restored digraph or no change. Because the runtime performance
-    ///the validity of the snapshot is not stored.
-    class Snapshot 
-    {
-      SmartGraph *_graph;
-    protected:
-      friend class SmartGraph;
-      unsigned int node_num;
-      unsigned int arc_num;
-    public:
-      ///Default constructor.
-      
-      ///Default constructor.
-      ///To actually make a snapshot you must call save().
-      ///
-      Snapshot() : _graph(0) {}
-      ///Constructor that immediately makes a snapshot
-      
-      ///This constructor immediately makes a snapshot of the digraph.
-      ///\param g The digraph we make a snapshot of.
-      Snapshot(SmartGraph &graph) {
-        graph.saveSnapshot(*this);
-      }
-
-      ///Make a snapshot.
-
-      ///Make a snapshot of the graph.
-      ///
-      ///This function can be called more than once. In case of a repeated
-      ///call, the previous snapshot gets lost.
-      ///\param g The digraph we make the snapshot of.
-      void save(SmartGraph &graph) 
-      {
-        graph.saveSnapshot(*this);
-      }
-
-      ///Undo the changes until a snapshot.
-      
-      ///Undo the changes until a snapshot created by save().
-      ///
-      ///\note After you restored a state, you cannot restore
-      ///a later state, in other word you cannot add again the arcs deleted
-      ///by restore().
-      void restore()
-      {
-        _graph->restoreSnapshot(*this);
-      }
-    };
-  };
-  
-} //namespace lemon
-
-
-#endif //LEMON_SMART_GRAPH_H
