Fundamentals of algorithm design and computational complexity, including: analysis of algorithms, graph algorithms, greedy algorithms, divide-and-conquer, dynamic programming, network flow, approximation algorithms, the theory of NP-completeness, and various NP-complete problems.