Algorithmic thinking is at the heart of computer science. Whether we wish to understand the structure of a social network, design algorithms that learn from data, build autonomous robots, measure reliability of complex systems, or design strategyproof auctions, the underlying core problem is often an algorithmic one. This course will focus on two of the most celebrated and fundamental techniques in algorithm design, Network Flows and Linear Programming, covering both their underlying theory and their use in solving combinatorial problems.
Students are expected to have a mastery of undergraduate-level algorithms and complexity, and should be conversant in discrete math concepts such as graph theory, probability, and combinatorics. The course is organized around the following topics: