
B. Nogueira et al.
– tightness
[v], which represents the number of solution vertices that are adjacent
to v through removable edges: tightness
[v]=|{x ∈ S : (x,v) ∈ E
}|.
– μ[v], which gives a lower bound on the gain of adding v to the solution, i.e., the
gain of adding v, and removing from the solution each adjacent vertex of v or
deleting the corresponding removable edges between v and the solution vertices:
μ[v]=b(v)−
x∈S
min(c
•
(x,v),b(x)), where c
•
(x,v)= c(x,v)if (x,v) ∈ E
,
and c
•
(x,v)=∞otherwise.
– μ
[v], which indicates the gain of removing v from the solution, i.e., the gain of
removing v and adding back the removable edges that were deleted when v entered
in the solution: μ
[v]=−b(v) +
x∈S
c
◦
(x,v), where c
◦
(x,v) = c(x,v) if
(x,v)∈ E
, and c
(x,v)= 0 otherwise.
Note that the value maintained in μ[v] is a lower bound on the gain of adding v
because this data structure does not take into account the possible gains of adding back
deleted edges. For instance, the gain of adding v
1
to the solution depicted in Fig. 1
would be b(v
1
) − min(b (v
3
), c(v
1
,v
3
)) − b(v
2
) + c(v
2
,v
6
). However, μ[v
1
] in this
case would be b(v
1
) − min(b(v
3
), c(v
1
,v
3
)) − b(v
2
). We store in μ a lower bound
instead of the exact value because computing t he exact gain would mean increasing
the complexity of adding/removing a vertex to/from the solution. Such a complexity
increase would eliminate all the benefit of maintaining data structure μ.
When our algorithm begins, these data structures have the following initial values for
each v ∈ V : tightness[v]=0, tightness
[v]=0, μ[v]=b(v), and μ
[v]=−b(v).
Algorithm 1 describes how they are updated whenever we add a new vertex to the
current solution. Such an add operation takes O(), where is the maximum graph
degree. In line 2 of Algorithm 1, we loop through each vertex y adjacent to the vertex
being added v. If condition at line 3 holds true, we assume that the edge (y,v) ∈ E
has been deleted (otherwise, the solution would become infeasible), thus tightness[v]
and tightness
[v] are decreased by one, and μ
[v] and μ
[y] are increased by c(y,v).
If condition at line 3 is false, tightness[y] is increased by one, and if additionally
(y,v)∈ E
, tightness
[y] is also increased by one. Note that, at the end of the loop,
the value of μ[y] for each y adjacent to v is decreased by b(v) if (y,v) /∈ E
, and by
min(b(v), c(y,v)), otherwise.
The procedure for updating the data structures when a vertex is removed is similar to
Algorithm 1. Except that at lines 4–8, 12, 13, and 15, subtract operations are exchanged
by sum operations and vice versa.
2.2 Neighborhood exploration
To find an improving move in N
1
, we propose two exploration procedures. The first
one takes O(|V |) and it works by searching for a vertex v ∈ V \ S, s uch that μ[v] >
0. If such a vertex is found, a N
1
(v) move will improve the solution. The second
exploration procedure is O(|E|). It consists in exploring each adjacent vertex of a
solution vertex x ∈ S and trying to find a vertex y ∈ V \ S, such that (x, y) ∈ E \ E
,
μ[y]+μ
[x]+b(x)>0. Applying a N
1
move to add such a vertex y also improves
the solution. The expression μ[y]+μ
[x]+b(x) gives the gain of adding y to the
123