Algorithms: Design and Analysis, Part 1 by Tim Roughgarden