Combinatorial Algorithms: Generation, Enumeration, and Search