Finds a minimum vertex cover in a undirected graph. The implementation relies on a recursive
algorithm. At each recursive step, the algorithm picks a unvisited vertex v and distinguishes two
cases: either v has to be added to the vertex cover or all of its neighbors.
In pseudo code, the algorithm (simplified) looks like this:

To speed up the implementation, memoization and a bounding procedure are used. The current
implementation solves instances with 150-250 vertices efficiently to optimality.
TODO JK: determine runtime complexity and add it to class description. TODO JK: run this class
through a performance profiler