src/lemon/smart_graph.h
changeset 1005 63ccf7136641
parent 980 0f1044b7a3af
child 1011 5bd6c7671c9e
equal deleted inserted replaced
9:1b6ae6be50a7 10:a1fecd0c1755
    53       int first_in,first_out;      
    53       int first_in,first_out;      
    54       NodeT() : first_in(-1), first_out(-1) {}
    54       NodeT() : first_in(-1), first_out(-1) {}
    55     };
    55     };
    56     struct EdgeT 
    56     struct EdgeT 
    57     {
    57     {
    58       int head, tail, next_in, next_out;      
    58       int target, source, next_in, next_out;      
    59       //FIXME: is this necessary?
    59       //FIXME: is this necessary?
    60       EdgeT() : next_in(-1), next_out(-1) {}  
    60       EdgeT() : next_in(-1), next_out(-1) {}  
    61     };
    61     };
    62 
    62 
    63     std::vector<NodeT> nodes;
    63     std::vector<NodeT> nodes;
    95     
    95     
    96     /// Maximum edge ID.
    96     /// Maximum edge ID.
    97     ///\sa id(Edge)
    97     ///\sa id(Edge)
    98     int maxId(Edge = INVALID) const { return edges.size()-1; }
    98     int maxId(Edge = INVALID) const { return edges.size()-1; }
    99 
    99 
   100     Node tail(Edge e) const { return edges[e.n].tail; }
   100     Node source(Edge e) const { return edges[e.n].source; }
   101     Node head(Edge e) const { return edges[e.n].head; }
   101     Node target(Edge e) const { return edges[e.n].target; }
   102 
   102 
   103     /// Node ID.
   103     /// Node ID.
   104     
   104     
   105     /// The ID of a valid Node is a nonnegative integer not greater than
   105     /// The ID of a valid Node is a nonnegative integer not greater than
   106     /// \ref maxNodeId(). The range of the ID's is not surely continuous
   106     /// \ref maxNodeId(). The range of the ID's is not surely continuous
   125       return n;
   125       return n;
   126     }
   126     }
   127     
   127     
   128     Edge addEdge(Node u, Node v) {
   128     Edge addEdge(Node u, Node v) {
   129       Edge e; e.n=edges.size(); edges.push_back(EdgeT()); //FIXME: Hmmm...
   129       Edge e; e.n=edges.size(); edges.push_back(EdgeT()); //FIXME: Hmmm...
   130       edges[e.n].tail=u.n; edges[e.n].head=v.n;
   130       edges[e.n].source=u.n; edges[e.n].target=v.n;
   131       edges[e.n].next_out=nodes[u.n].first_out;
   131       edges[e.n].next_out=nodes[u.n].first_out;
   132       edges[e.n].next_in=nodes[v.n].first_in;
   132       edges[e.n].next_in=nodes[v.n].first_in;
   133       nodes[u.n].first_out=nodes[v.n].first_in=e.n;
   133       nodes[u.n].first_out=nodes[v.n].first_in=e.n;
   134 
   134 
   135       return e;
   135       return e;
   209     }
   209     }
   210 
   210 
   211     Edge _findEdge(Node u,Node v, Edge prev = INVALID) 
   211     Edge _findEdge(Node u,Node v, Edge prev = INVALID) 
   212     {
   212     {
   213       int e = (prev.n==-1)? nodes[u.n].first_out : edges[prev.n].next_out;
   213       int e = (prev.n==-1)? nodes[u.n].first_out : edges[prev.n].next_out;
   214       while(e!=-1 && edges[e].tail!=v.n) e = edges[e].next_out;
   214       while(e!=-1 && edges[e].source!=v.n) e = edges[e].next_out;
   215       prev.n=e;
   215       prev.n=e;
   216       return prev;
   216       return prev;
   217     }
   217     }
   218 
   218 
   219   };
   219   };
   305     
   305     
   306     void rollBack(const SnapShot &s)
   306     void rollBack(const SnapShot &s)
   307     {
   307     {
   308       while(s.edge_num>edges.size()) {
   308       while(s.edge_num>edges.size()) {
   309 	edge_observers.erase(Edge(edges.size()-1));
   309 	edge_observers.erase(Edge(edges.size()-1));
   310 	nodes[edges.back().head].first_in=edges.back().next_in;
   310 	nodes[edges.back().target].first_in=edges.back().next_in;
   311 	nodes[edges.back().tail].first_out=edges.back().next_out;
   311 	nodes[edges.back().source].first_out=edges.back().next_out;
   312 	edges.pop_back();
   312 	edges.pop_back();
   313       }
   313       }
   314       //nodes.resize(s.nodes_num);
   314       //nodes.resize(s.nodes_num);
   315       while(s.node_num>nodes.size()) {
   315       while(s.node_num>nodes.size()) {
   316 	node_observers.erase(Node(nodes.size()-1));
   316 	node_observers.erase(Node(nodes.size()-1));