In group.cpp use a better initialization value for the prune table:
prune_table = vector<int>(state_count, 20);
Maybe pass a reasonable value to the constructor or to the method call. In that case, the search doesn't need to go until:
visited_count < state_count
The loop could look like this:
for (int depth = 0; depth < max_depth; depth++)