Combinatorial Algorithms: Theory and Practice