This is an advanced graduate level course on algorithms, with the emphasis on computational problems that are central to both theory and practice, and on developing techniques for the design and the rigorous analysis of algorithms and data structures for such problems. It discusses topics such as network flows (max flow and min-cost flow/circulation), data structures (Fibonacci heaps, splay trees, dynamic trees), linear programming (structural results, algorithms), dealing with intractability, approximation algorithms, dealing with large data sets and computational geometry.