[Lemon-commits] [lemon_svn] deba: r2768 - in hugo/trunk/lemon: . bits
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 20:55:07 CET 2006
Author: deba
Date: Tue May 30 12:33:50 2006
New Revision: 2768
Modified:
hugo/trunk/lemon/bits/graph_extender.h
hugo/trunk/lemon/list_graph.h
Log:
Bug fix in the list bipartite undirected graph
Modified: hugo/trunk/lemon/bits/graph_extender.h
==============================================================================
--- hugo/trunk/lemon/bits/graph_extender.h (original)
+++ hugo/trunk/lemon/bits/graph_extender.h Tue May 30 12:33:50 2006
@@ -1477,12 +1477,19 @@
void erase(const Node& node) {
UEdge uedge;
- bool dir;
- Parent::firstInc(uedge, dir, node);
- while (uedge != INVALID ) {
- erase(uedge);
- Parent::firstInc(uedge, dir, node);
- }
+ if (Parent::aNode(node)) {
+ Parent::firstFromANode(uedge, node);
+ while (uedge != INVALID) {
+ erase(uedge);
+ Parent::firstFromANode(uedge, node);
+ }
+ } else {
+ Parent::firstFromBNode(uedge, node);
+ while (uedge != INVALID) {
+ erase(uedge);
+ Parent::firstFromBNode(uedge, node);
+ }
+ }
getNotifier(Node()).erase(node);
Parent::erase(node);
Modified: hugo/trunk/lemon/list_graph.h
==============================================================================
--- hugo/trunk/lemon/list_graph.h (original)
+++ hugo/trunk/lemon/list_graph.h Tue May 30 12:33:50 2006
@@ -648,7 +648,7 @@
protected:
struct NodeT {
- int first_edge, next_node;
+ int first_edge, prev, next;
};
struct UEdgeT {
@@ -708,14 +708,14 @@
node.id = first_anode != -1 ? (first_anode << 1) : -1;
}
void nextANode(Node& node) const {
- node.id = aNodes[node.id >> 1].next_node;
+ node.id = aNodes[node.id >> 1].next;
}
void firstBNode(Node& node) const {
- node.id = first_bnode != -1 ? (first_bnode << 1) + 1 : -1;
+ node.id = first_bnode != -1 ? (first_bnode << 1) + 1 : -1;
}
void nextBNode(Node& node) const {
- node.id = bNodes[node.id >> 1].next_node;
+ node.id = bNodes[node.id >> 1].next;
}
void first(Node& node) const {
@@ -729,22 +729,22 @@
}
void next(Node& node) const {
if (aNode(node)) {
- node.id = aNodes[node.id >> 1].next_node;
+ node.id = aNodes[node.id >> 1].next;
if (node.id == -1) {
if (first_bnode != -1) {
node.id = (first_bnode << 1) + 1;
}
}
} else {
- node.id = bNodes[node.id >> 1].next_node;
+ node.id = bNodes[node.id >> 1].next;
}
}
void first(UEdge& edge) const {
int aNodeId = first_anode;
while (aNodeId != -1 && aNodes[aNodeId].first_edge == -1) {
- aNodeId = aNodes[aNodeId].next_node != -1 ?
- aNodes[aNodeId].next_node >> 1 : -1;
+ aNodeId = aNodes[aNodeId].next != -1 ?
+ aNodes[aNodeId].next >> 1 : -1;
}
if (aNodeId != -1) {
edge.id = aNodes[aNodeId].first_edge;
@@ -756,11 +756,11 @@
int aNodeId = edges[edge.id].aNode >> 1;
edge.id = edges[edge.id].next_out;
if (edge.id == -1) {
- aNodeId = aNodes[aNodeId].next_node != -1 ?
- aNodes[aNodeId].next_node >> 1 : -1;
+ aNodeId = aNodes[aNodeId].next != -1 ?
+ aNodes[aNodeId].next >> 1 : -1;
while (aNodeId != -1 && aNodes[aNodeId].first_edge == -1) {
- aNodeId = aNodes[aNodeId].next_node != -1 ?
- aNodes[aNodeId].next_node >> 1 : -1;
+ aNodeId = aNodes[aNodeId].next != -1 ?
+ aNodes[aNodeId].next >> 1 : -1;
}
if (aNodeId != -1) {
edge.id = aNodes[aNodeId].first_edge;
@@ -849,10 +849,15 @@
aNodes.push_back(NodeT());
} else {
aNodeId = first_free_anode;
- first_free_anode = aNodes[first_free_anode].next_node;
+ first_free_anode = aNodes[first_free_anode].next;
}
- aNodes[aNodeId].next_node =
- first_anode != -1 ? (first_anode << 1) : -1;
+ if (first_anode != -1) {
+ aNodes[aNodeId].next = first_anode << 1;
+ aNodes[first_anode].prev = aNodeId << 1;
+ } else {
+ aNodes[aNodeId].next = -1;
+ }
+ aNodes[aNodeId].prev = -1;
first_anode = aNodeId;
aNodes[aNodeId].first_edge = -1;
return Node(aNodeId << 1);
@@ -865,10 +870,14 @@
bNodes.push_back(NodeT());
} else {
bNodeId = first_free_bnode;
- first_free_bnode = bNodes[first_free_bnode].next_node;
+ first_free_bnode = bNodes[first_free_bnode].next;
+ }
+ if (first_bnode != -1) {
+ bNodes[bNodeId].next = (first_bnode << 1) + 1;
+ bNodes[first_bnode].prev = (bNodeId << 1) + 1;
+ } else {
+ bNodes[bNodeId].next = -1;
}
- bNodes[bNodeId].next_node =
- first_bnode != -1 ? (first_bnode << 1) + 1 : -1;
first_bnode = bNodeId;
bNodes[bNodeId].first_edge = -1;
return Node((bNodeId << 1) + 1);
@@ -909,32 +918,51 @@
void erase(const Node& node) {
if (aNode(node)) {
int aNodeId = node.id >> 1;
- aNodes[aNodeId].next_node = first_free_anode;
+ if (aNodes[aNodeId].prev != -1) {
+ aNodes[aNodes[aNodeId].prev >> 1].next = aNodes[aNodeId].next;
+ } else {
+ first_anode = aNodes[aNodeId].next >> 1;
+ }
+ if (aNodes[aNodeId].next != -1) {
+ aNodes[aNodes[aNodeId].next >> 1].prev = aNodes[aNodeId].prev;
+ }
+ aNodes[aNodeId].next = first_free_anode;
first_free_anode = aNodeId;
} else {
int bNodeId = node.id >> 1;
- bNodes[bNodeId].next_node = first_free_bnode;
+ if (bNodes[bNodeId].prev != -1) {
+ bNodes[bNodes[bNodeId].prev >> 1].next = bNodes[bNodeId].next;
+ } else {
+ first_bnode = bNodes[bNodeId].next >> 1;
+ }
+ if (bNodes[bNodeId].next != -1) {
+ bNodes[bNodes[bNodeId].next >> 1].prev = bNodes[bNodeId].prev;
+ }
+ bNodes[bNodeId].next = first_free_bnode;
first_free_bnode = bNodeId;
}
}
void erase(const UEdge& edge) {
+
if (edges[edge.id].prev_out != -1) {
edges[edges[edge.id].prev_out].next_out = edges[edge.id].next_out;
} else {
- aNodes[edges[edge.id].aNode].first_edge = edges[edge.id].next_out;
+ aNodes[edges[edge.id].aNode >> 1].first_edge = edges[edge.id].next_out;
}
if (edges[edge.id].next_out != -1) {
edges[edges[edge.id].next_out].prev_out = edges[edge.id].prev_out;
}
+
if (edges[edge.id].prev_in != -1) {
edges[edges[edge.id].prev_in].next_in = edges[edge.id].next_in;
} else {
- bNodes[edges[edge.id].bNode].first_edge = edges[edge.id].next_in;
+ bNodes[edges[edge.id].bNode >> 1].first_edge = edges[edge.id].next_in;
}
if (edges[edge.id].next_in != -1) {
edges[edges[edge.id].next_in].prev_in = edges[edge.id].prev_in;
}
+
edges[edge.id].next_out = first_free_edge;
first_free_edge = edge.id;
}
More information about the Lemon-commits
mailing list