COIN-OR::LEMON - Graph Library

Changes in / [75:6265aa2f9d7e:70:e2c2763b7aec] in lemon-main


Ignore:
Location:
lemon
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • lemon/concepts/maps.h

    r74 r51  
    5656      template<typename _ReadMap>
    5757      struct Constraints {
     58
    5859        void constraints() {
    5960          Value val = m[key];
     
    175176
    176177      template<typename _ReferenceMap>
    177       struct Constraints {
    178         void constraints() {
    179           checkConcept<ReadWriteMap<K, T>, _ReferenceMap >();
     178      struct ReferenceMapConcept {
     179
     180        void constraints() {
     181          checkConcept<ReadWriteMap, _ReferenceMap >();
    180182          m[key] = val;
    181183          val  = m[key];
     
    190192        typename _ReferenceMap::Key& own_key;
    191193        typename _ReferenceMap::Value& own_val;
    192         typename _ReferenceMap::Reference own_ref;
     194        typename _ReferenceMap::Reference& own_ref;
    193195        Key& key;
    194196        Value& val;
    195         Reference ref;
     197        Reference& ref;
    196198        _ReferenceMap& m;
    197199      };
  • lemon/list_graph.h

    r73 r57  
    112112
    113113
    114     void first(Arc& arc) const {
     114    void first(Arc& e) const {
    115115      int n;
    116116      for(n = first_node;
    117117          n!=-1 && nodes[n].first_in == -1;
    118118          n = nodes[n].next);
    119       arc.id = (n == -1) ? -1 : nodes[n].first_in;
     119      e.id = (n == -1) ? -1 : nodes[n].first_in;
    120120    }
    121121
     
    294294  typedef DigraphExtender<ListDigraphBase> ExtendedListDigraphBase;
    295295
    296   /// \addtogroup graphs
     296  /// \addtogroup digraphs
    297297  /// @{
    298298
    299   ///A general directed graph structure.
    300 
    301   ///\ref ListDigraph is a simple and fast <em>directed graph</em>
    302   ///implementation based on static linked lists that are stored in
    303   ///\c std::vector structures.   
     299  ///A list digraph class.
     300
     301  ///This is a simple and fast digraph implementation.
    304302  ///
    305303  ///It conforms to the \ref concepts::Digraph "Digraph concept" and it
    306   ///also provides several useful additional functionalities.
    307   ///Most of the member functions and nested classes are documented
    308   ///only in the concept class.
     304  ///also provides several additional useful extra functionalities.
     305  ///The most of the member functions and nested classes are
     306  ///documented only in the concept class.
    309307  ///
    310308  ///An important extra feature of this digraph implementation is that
    311309  ///its maps are real \ref concepts::ReferenceMap "reference map"s.
    312310  ///
    313   ///\sa concepts::Digraph
     311  ///\sa concepts::Digraph.
    314312
    315313  class ListDigraph : public ExtendedListDigraphBase {
    316314  private:
    317     ///ListDigraph is \e not copy constructible. Use copyDigraph() instead.
    318    
    319     ///ListDigraph is \e not copy constructible. Use copyDigraph() instead.
     315    ///ListDigraph is \e not copy constructible. Use DigraphCopy() instead.
     316   
     317    ///ListDigraph is \e not copy constructible. Use DigraphCopy() instead.
    320318    ///
    321319    ListDigraph(const ListDigraph &) :ExtendedListDigraphBase() {};
    322320    ///\brief Assignment of ListDigraph to another one is \e not allowed.
    323     ///Use copyDigraph() instead.
     321    ///Use DigraphCopy() instead.
    324322
    325323    ///Assignment of ListDigraph to another one is \e not allowed.
    326     ///Use copyDigraph() instead.
     324    ///Use DigraphCopy() instead.
    327325    void operator=(const ListDigraph &) {}
    328326  public:
     
    338336    ///Add a new node to the digraph.
    339337   
    340     ///Add a new node to the digraph.
    341     ///\return the new node.
     338    /// \return the new node.
     339    ///
    342340    Node addNode() { return Parent::addNode(); }
    343341
     
    351349    }
    352350
    353     /// Change the target of \c e to \c n
    354 
    355     /// Change the target of \c e to \c n
     351    /// Changes the target of \c e to \c n
     352
     353    /// Changes the target of \c e to \c n
    356354    ///
    357355    ///\note The <tt>ArcIt</tt>s and <tt>OutArcIt</tt>s referencing
    358356    ///the changed arc remain valid. However <tt>InArcIt</tt>s are
    359357    ///invalidated.
    360     ///
    361358    ///\warning This functionality cannot be used together with the Snapshot
    362359    ///feature.
     
    364361      Parent::changeTarget(e,n);
    365362    }
    366     /// Change the source of \c e to \c n
    367 
    368     /// Change the source of \c e to \c n
     363    /// Changes the source of \c e to \c n
     364
     365    /// Changes the source of \c e to \c n
    369366    ///
    370367    ///\note The <tt>ArcIt</tt>s and <tt>InArcIt</tt>s referencing
    371368    ///the changed arc remain valid. However <tt>OutArcIt</tt>s are
    372369    ///invalidated.
    373     ///
    374370    ///\warning This functionality cannot be used together with the Snapshot
    375371    ///feature.
     
    383379    ///valid. However <tt>OutArcIt</tt>s and <tt>InArcIt</tt>s are
    384380    ///invalidated.
    385     ///
    386381    ///\warning This functionality cannot be used together with the Snapshot
    387382    ///feature.
     
    392387    }
    393388
    394     /// Reserve memory for nodes.
    395 
    396     /// Using this function it is possible to avoid the superfluous memory
     389    /// Using this it is possible to avoid the superfluous memory
    397390    /// allocation: if you know that the digraph you want to build will
    398391    /// be very large (e.g. it will contain millions of nodes and/or arcs)
     
    402395    void reserveNode(int n) { nodes.reserve(n); };
    403396
    404     /// Reserve memory for arcs.
    405 
    406     /// Using this function it is possible to avoid the superfluous memory
     397    /// \brief Using this it is possible to avoid the superfluous memory
     398    /// allocation.
     399
     400    /// Using this it is possible to avoid the superfluous memory
    407401    /// allocation: if you know that the digraph you want to build will
    408402    /// be very large (e.g. it will contain millions of nodes and/or arcs)
     
    415409
    416410    ///This function contracts two nodes.
     411    ///
    417412    ///Node \p b will be removed but instead of deleting
    418413    ///incident arcs, they will be joined to \p a.
     
    420415    ///means that loops will be removed.
    421416    ///
    422     ///\note The <tt>ArcIt</tt>s referencing a moved arc remain
     417    ///\note The <tt>ArcIt</tt>s
     418    ///referencing a moved arc remain
    423419    ///valid. However <tt>InArcIt</tt>s and <tt>OutArcIt</tt>s
    424420    ///may be invalidated.
    425     ///
    426421    ///\warning This functionality cannot be used together with the Snapshot
    427422    ///feature.
     
    458453    ///
    459454    ///\warning This functionality cannot be used together with the
    460     ///Snapshot feature.
    461     ///
    462     ///\todo It could be implemented in a bit faster way.
     455    ///Snapshot feature.  \todo It could be implemented in a bit
     456    ///faster way.
    463457    Node split(Node n, bool connect = true) {
    464458      Node b = addNode();
     
    478472    ///the digraph, then the original arc is re-targeted to \c
    479473    ///b. Finally an arc from \c b to the original target is added.
    480     ///
    481     ///\return The newly created node.
    482     ///
    483     ///\warning This functionality cannot be used together with the
    484     ///Snapshot feature.
     474    ///\return The newly created node. 
     475    ///\warning This functionality
     476    ///cannot be used together with the Snapshot feature.
    485477    Node split(Arc e) {
    486478      Node b = addNode();
     
    491483     
    492484    /// \brief Class to make a snapshot of the digraph and restore
    493     /// it later.
    494     ///
    495     /// Class to make a snapshot of the digraph and restore it later.
     485    /// to it later.
     486    ///
     487    /// Class to make a snapshot of the digraph and to restore it
     488    /// later.
    496489    ///
    497490    /// The newly added nodes and arcs can be removed using the
    498491    /// restore() function.
    499492    ///
    500     /// \warning Arc and node deletions and other modifications (e.g.
    501     /// contracting, splitting, reversing arcs or nodes) cannot be
    502     /// restored. These events invalidate the snapshot.
     493    /// \warning Arc and node deletions cannot be restored. This
     494    /// events invalidate the snapshot.
    503495    class Snapshot {
    504496    protected:
     
    785777      Edge() {}
    786778      Edge (Invalid) { id = -1; }
    787       bool operator==(const Edge& edge) const {return id == edge.id;}
    788       bool operator!=(const Edge& edge) const {return id != edge.id;}
    789       bool operator<(const Edge& edge) const {return id < edge.id;}
     779      bool operator==(const Edge& arc) const {return id == arc.id;}
     780      bool operator!=(const Edge& arc) const {return id != arc.id;}
     781      bool operator<(const Edge& arc) const {return id < arc.id;}
    790782    };
    791783
     
    918910
    919911    void firstInc(Edge &e, bool& d, const Node& v) const {
    920       int a = nodes[v.id].first_out;
    921       if (a != -1 ) {
    922         e.id = a / 2;
    923         d = ((a & 1) == 1);
     912      int de = nodes[v.id].first_out;
     913      if (de != -1 ) {
     914        e.id = de / 2;
     915        d = ((de & 1) == 1);
    924916      } else {
    925917        e.id = -1;
     
    928920    }
    929921    void nextInc(Edge &e, bool& d) const {
    930       int a = (arcs[(e.id * 2) | (d ? 1 : 0)].next_out);
    931       if (a != -1 ) {
    932         e.id = a / 2;
    933         d = ((a & 1) == 1);
     922      int de = (arcs[(e.id * 2) | (d ? 1 : 0)].next_out);
     923      if (de != -1 ) {
     924        e.id = de / 2;
     925        d = ((de & 1) == 1);
    934926      } else {
    935927        e.id = -1;
     
    10171009    }
    10181010   
    1019     void erase(const Edge& edge) {
    1020       int n = edge.id * 2;
     1011    void erase(const Edge& arc) {
     1012      int n = arc.id * 2;
    10211013     
    10221014      if (arcs[n].next_out != -1) {
     
    10981090  };
    10991091
     1092//   typedef GraphExtender<UndirDigraphExtender<ListDigraphBase> >
     1093//   ExtendedListGraphBase;
     1094
    11001095  typedef GraphExtender<ListGraphBase> ExtendedListGraphBase;
    11011096
    11021097
    1103   /// \addtogroup graphs
     1098
     1099  /// \addtogroup digraphs
    11041100  /// @{
    11051101
    1106   ///A general undirected graph structure.
    1107 
    1108   ///\ref ListGraph is a simple and fast <em>undirected graph</em>
    1109   ///implementation based on static linked lists that are stored in
    1110   ///\c std::vector structures.
     1102  ///An undirected list digraph class.
     1103
     1104  ///This is a simple and fast undirected digraph implementation.
    11111105  ///
    1112   ///It conforms to the \ref concepts::Graph "Graph concept" and it
    1113   ///also provides several useful additional functionalities.
    1114   ///Most of the member functions and nested classes are documented
    1115   ///only in the concept class.
    1116   ///
    1117   ///An important extra feature of this graph implementation is that
     1106  ///An important extra feature of this digraph implementation is that
    11181107  ///its maps are real \ref concepts::ReferenceMap "reference map"s.
    11191108  ///
    1120   ///\sa concepts::Graph
    1121 
     1109  ///It conforms to the
     1110  ///\ref concepts::Graph "Graph concept".
     1111  ///
     1112  ///\sa concepts::Graph.
     1113  ///
    11221114  class ListGraph : public ExtendedListGraphBase {
    11231115  private:
    1124     ///ListGraph is \e not copy constructible. Use copyGraph() instead.
    1125 
    1126     ///ListGraph is \e not copy constructible. Use copyGraph() instead.
     1116    ///ListGraph is \e not copy constructible. Use GraphCopy() instead.
     1117
     1118    ///ListGraph is \e not copy constructible. Use GraphCopy() instead.
    11271119    ///
    11281120    ListGraph(const ListGraph &) :ExtendedListGraphBase()  {};
    11291121    ///\brief Assignment of ListGraph to another one is \e not allowed.
    1130     ///Use copyGraph() instead.
     1122    ///Use GraphCopy() instead.
    11311123
    11321124    ///Assignment of ListGraph to another one is \e not allowed.
    1133     ///Use copyGraph() instead.
     1125    ///Use GraphCopy() instead.
    11341126    void operator=(const ListGraph &) {}
    11351127  public:
     
    11421134    typedef ExtendedListGraphBase Parent;
    11431135
    1144     typedef Parent::OutArcIt IncEdgeIt;
    1145 
    1146     /// \brief Add a new node to the graph.
    1147     ///
    1148     /// Add a new node to the graph.
     1136    typedef Parent::OutArcIt IncArcIt;
     1137
     1138    /// \brief Add a new node to the digraph.
     1139    ///
    11491140    /// \return the new node.
     1141    ///
    11501142    Node addNode() { return Parent::addNode(); }
    11511143
    1152     /// \brief Add a new edge to the graph.
    1153     ///
    1154     /// Add a new edge to the graph with source node \c s
     1144    /// \brief Add a new edge to the digraph.
     1145    ///
     1146    /// Add a new arc to the digraph with source node \c s
    11551147    /// and target node \c t.
    11561148    /// \return the new edge.
     
    11581150      return Parent::addEdge(s, t);
    11591151    }
    1160     /// \brief Change the source of \c e to \c n
    1161     ///
    1162     /// This function changes the source of \c e to \c n.
     1152    /// \brief Changes the source of \c e to \c n
     1153    ///
     1154    /// Changes the source of \c e to \c n
    11631155    ///
    11641156    ///\note The <tt>ArcIt</tt>s and <tt>InArcIt</tt>s
    11651157    ///referencing the changed arc remain
    11661158    ///valid. However <tt>OutArcIt</tt>s are invalidated.
    1167     ///
    1168     ///\warning This functionality cannot be used together with the
    1169     ///Snapshot feature.
    11701159    void changeSource(Edge e, Node n) {
    11711160      Parent::changeSource(e,n);
    11721161    }   
    1173     /// \brief Change the target of \c e to \c n
    1174     ///
    1175     /// This function changes the target of \c e to \c n.
     1162    /// \brief Changes the target of \c e to \c n
     1163    ///
     1164    /// Changes the target of \c e to \c n
    11761165    ///
    11771166    /// \note The <tt>ArcIt</tt>s referencing the changed arc remain
    11781167    /// valid. However the other iterators may be invalidated.
    1179     ///
    1180     ///\warning This functionality cannot be used together with the
    1181     ///Snapshot feature.
    11821168    void changeTarget(Edge e, Node n) {
    11831169      Parent::changeTarget(e,n);
    11841170    }
    1185     /// \brief Change the source of \c e to \c n
    1186     ///
    1187     /// This function changes the source of \c e to \c n.
    1188     /// It also changes the proper node of the represented edge.
     1171    /// \brief Changes the source of \c e to \c n
     1172    ///
     1173    /// Changes the source of \c e to \c n. It changes the proper
     1174    /// node of the represented edge.
    11891175    ///
    11901176    ///\note The <tt>ArcIt</tt>s and <tt>InArcIt</tt>s
    11911177    ///referencing the changed arc remain
    11921178    ///valid. However <tt>OutArcIt</tt>s are invalidated.
    1193     ///
    1194     ///\warning This functionality cannot be used together with the
    1195     ///Snapshot feature.
    11961179    void changeSource(Arc e, Node n) {
    11971180      if (Parent::direction(e)) {
     
    12011184      }
    12021185    }
    1203     /// \brief Change the target of \c e to \c n
    1204     ///
    1205     /// This function changes the target of \c e to \c n.
    1206     /// It also changes the proper node of the represented edge.
     1186    /// \brief Changes the target of \c e to \c n
     1187    ///
     1188    /// Changes the target of \c e to \c n. It changes the proper
     1189    /// node of the represented edge.
    12071190    ///
    12081191    ///\note The <tt>ArcIt</tt>s and <tt>OutArcIt</tt>s
    12091192    ///referencing the changed arc remain
    12101193    ///valid. However <tt>InArcIt</tt>s are invalidated.
    1211     ///
    1212     ///\warning This functionality cannot be used together with the
    1213     ///Snapshot feature.
    12141194    void changeTarget(Arc e, Node n) {
    12151195      if (Parent::direction(e)) {
     
    12221202    ///
    12231203    /// This function contracts two nodes.
     1204    ///
    12241205    /// Node \p b will be removed but instead of deleting
    12251206    /// its neighboring arcs, they will be joined to \p a.
     
    12291210    /// \note The <tt>ArcIt</tt>s referencing a moved arc remain
    12301211    /// valid.
    1231     ///
    1232     ///\warning This functionality cannot be used together with the
    1233     ///Snapshot feature.
    12341212    void contract(Node a, Node b, bool r = true) {
    1235       for(IncEdgeIt e(*this, b); e!=INVALID;) {
    1236         IncEdgeIt f = e; ++f;
     1213      for(IncArcIt e(*this, b); e!=INVALID;) {
     1214        IncArcIt f = e; ++f;
    12371215        if (r && runningNode(e) == a) {
    12381216          erase(e);
     
    12481226
    12491227
    1250     /// \brief Class to make a snapshot of the graph and restore
    1251     /// it later.
    1252     ///
    1253     /// Class to make a snapshot of the graph and restore it later.
     1228    /// \brief Class to make a snapshot of the digraph and restore
     1229    /// to it later.
     1230    ///
     1231    /// Class to make a snapshot of the digraph and to restore it
     1232    /// later.
    12541233    ///
    12551234    /// The newly added nodes and edges can be removed
    12561235    /// using the restore() function.
    12571236    ///
    1258     /// \warning Edge and node deletions and other modifications
    1259     /// (e.g. changing nodes of edges, contracting nodes) cannot be
    1260     /// restored. These events invalidate the snapshot.
     1237    /// \warning Arc and node deletions cannot be restored. This
     1238    /// events invalidate the snapshot.
    12611239    class Snapshot {
    12621240    protected:
     
    13261304      protected:
    13271305
    1328         virtual void add(const Edge& edge) {
    1329           snapshot.addEdge(edge);
    1330         }
    1331         virtual void add(const std::vector<Edge>& edges) {
    1332           for (int i = edges.size() - 1; i >= 0; ++i) {
    1333             snapshot.addEdge(edges[i]);
    1334           }
    1335         }
    1336         virtual void erase(const Edge& edge) {
    1337           snapshot.eraseEdge(edge);
    1338         }
    1339         virtual void erase(const std::vector<Edge>& edges) {
    1340           for (int i = 0; i < int(edges.size()); ++i) {
    1341             snapshot.eraseEdge(edges[i]);
     1306        virtual void add(const Edge& arc) {
     1307          snapshot.addEdge(arc);
     1308        }
     1309        virtual void add(const std::vector<Edge>& arcs) {
     1310          for (int i = arcs.size() - 1; i >= 0; ++i) {
     1311            snapshot.addEdge(arcs[i]);
     1312          }
     1313        }
     1314        virtual void erase(const Edge& arc) {
     1315          snapshot.eraseEdge(arc);
     1316        }
     1317        virtual void erase(const std::vector<Edge>& arcs) {
     1318          for (int i = 0; i < int(arcs.size()); ++i) {
     1319            snapshot.eraseEdge(arcs[i]);
    13421320          }
    13431321        }
    13441322        virtual void build() {
    1345           Edge edge;
    1346           std::vector<Edge> edges;
    1347           for (notifier()->first(edge); edge != INVALID;
    1348                notifier()->next(edge)) {
    1349             edges.push_back(edge);
    1350           }
    1351           for (int i = edges.size() - 1; i >= 0; --i) {
    1352             snapshot.addEdge(edges[i]);
     1323          Edge arc;
     1324          std::vector<Edge> arcs;
     1325          for (notifier()->first(arc); arc != INVALID;
     1326               notifier()->next(arc)) {
     1327            arcs.push_back(arc);
     1328          }
     1329          for (int i = arcs.size() - 1; i >= 0; --i) {
     1330            snapshot.addEdge(arcs[i]);
    13531331          }
    13541332        }
    13551333        virtual void clear() {
    1356           Edge edge;
    1357           for (notifier()->first(edge); edge != INVALID;
    1358                notifier()->next(edge)) {
    1359             snapshot.eraseEdge(edge);
     1334          Edge arc;
     1335          for (notifier()->first(arc); arc != INVALID;
     1336               notifier()->next(arc)) {
     1337            snapshot.eraseEdge(arc);
    13601338          }
    13611339        }
     
    13631341        Snapshot& snapshot;
    13641342      };
    1365 
    1366       ListGraph *graph;
     1343     
     1344      ListGraph *digraph;
    13671345
    13681346      NodeObserverProxy node_observer_proxy;
    1369       EdgeObserverProxy edge_observer_proxy;
     1347      EdgeObserverProxy arc_observer_proxy;
    13701348
    13711349      std::list<Node> added_nodes;
    1372       std::list<Edge> added_edges;
     1350      std::list<Edge> added_arcs;
    13731351
    13741352
     
    13811359        if (it == added_nodes.end()) {
    13821360          clear();
    1383           edge_observer_proxy.detach();
     1361          arc_observer_proxy.detach();
    13841362          throw NodeNotifier::ImmediateDetach();
    13851363        } else {
     
    13881366      }
    13891367
    1390       void addEdge(const Edge& edge) {
    1391         added_edges.push_front(edge);       
    1392       }
    1393       void eraseEdge(const Edge& edge) {
     1368      void addEdge(const Edge& arc) {
     1369        added_arcs.push_front(arc);       
     1370      }
     1371      void eraseEdge(const Edge& arc) {
    13941372        std::list<Edge>::iterator it =
    1395           std::find(added_edges.begin(), added_edges.end(), edge);
    1396         if (it == added_edges.end()) {
     1373          std::find(added_arcs.begin(), added_arcs.end(), arc);
     1374        if (it == added_arcs.end()) {
    13971375          clear();
    13981376          node_observer_proxy.detach();
    13991377          throw EdgeNotifier::ImmediateDetach();
    14001378        } else {
    1401           added_edges.erase(it);
    1402         }
    1403       }
    1404 
    1405       void attach(ListGraph &_graph) {
    1406         graph = &_graph;
    1407         node_observer_proxy.attach(graph->notifier(Node()));
    1408         edge_observer_proxy.attach(graph->notifier(Edge()));
     1379          added_arcs.erase(it);
     1380        }       
     1381      }
     1382
     1383      void attach(ListGraph &_digraph) {
     1384        digraph = &_digraph;
     1385        node_observer_proxy.attach(digraph->notifier(Node()));
     1386        arc_observer_proxy.attach(digraph->notifier(Edge()));
    14091387      }
    14101388           
    14111389      void detach() {
    14121390        node_observer_proxy.detach();
    1413         edge_observer_proxy.detach();
     1391        arc_observer_proxy.detach();
    14141392      }
    14151393
     
    14201398      void clear() {
    14211399        added_nodes.clear();
    1422         added_edges.clear();       
     1400        added_arcs.clear();       
    14231401      }
    14241402
     
    14301408      /// To actually make a snapshot you must call save().
    14311409      Snapshot()
    1432         : graph(0), node_observer_proxy(*this),
    1433           edge_observer_proxy(*this) {}
     1410        : digraph(0), node_observer_proxy(*this),
     1411          arc_observer_proxy(*this) {}
    14341412     
    14351413      /// \brief Constructor that immediately makes a snapshot.
    14361414      ///     
    1437       /// This constructor immediately makes a snapshot of the graph.
    1438       /// \param _graph The graph we make a snapshot of.
    1439       Snapshot(ListGraph &_graph)
     1415      /// This constructor immediately makes a snapshot of the digraph.
     1416      /// \param _digraph The digraph we make a snapshot of.
     1417      Snapshot(ListGraph &_digraph)
    14401418        : node_observer_proxy(*this),
    1441           edge_observer_proxy(*this) {
    1442         attach(_graph);
     1419          arc_observer_proxy(*this) {
     1420        attach(_digraph);
    14431421      }
    14441422     
    14451423      /// \brief Make a snapshot.
    14461424      ///
    1447       /// Make a snapshot of the graph.
     1425      /// Make a snapshot of the digraph.
    14481426      ///
    14491427      /// This function can be called more than once. In case of a repeated
    14501428      /// call, the previous snapshot gets lost.
    1451       /// \param _graph The graph we make the snapshot of.
    1452       void save(ListGraph &_graph) {
     1429      /// \param _digraph The digraph we make the snapshot of.
     1430      void save(ListGraph &_digraph) {
    14531431        if (attached()) {
    14541432          detach();
    14551433          clear();
    14561434        }
    1457         attach(_graph);
     1435        attach(_digraph);
    14581436      }
    14591437     
     
    14631441      void restore() {
    14641442        detach();
    1465         for(std::list<Edge>::iterator it = added_edges.begin();
    1466             it != added_edges.end(); ++it) {
    1467           graph->erase(*it);
     1443        for(std::list<Edge>::iterator it = added_arcs.begin();
     1444            it != added_arcs.end(); ++it) {
     1445          digraph->erase(*it);
    14681446        }
    14691447        for(std::list<Node>::iterator it = added_nodes.begin();
    14701448            it != added_nodes.end(); ++it) {
    1471           graph->erase(*it);
     1449          digraph->erase(*it);
    14721450        }
    14731451        clear();
Note: See TracChangeset for help on using the changeset viewer.