  We consider the $k$-prize-collecting Steiner tree problem. An instance is
composed of an integer $k$ and a graph $G$ with costs on edges and penalties on
vertices. The objective is to find a tree spanning at least $k$ vertices which
minimizes the cost of the edges in the tree plus the penalties of vertices not
in the tree. This is one of the most fundamental network design problems and is
a common generalization of the prize-collecting Steiner tree and the
$k$-minimum spanning tree problems. Our main result is a 2-approximation
algorithm, which improves on the currently best known approximation factor of
3.96 and has a faster running time. The algorithm builds on a modification of
the primal-dual framework of Goemans and Williamson, and reveals interesting
properties that can be applied to other similar problems.
