Combinatorial optimization for undergraduates