Combinatorial algorithms