This is the standard algorithm course where the student is introduced to the different algorithm design paradigms: divide-and-conquer, greedy and dynamic programming. Network flows and applications are covered as well. In addition NP compleness is introduced from the theoretical, e.g. reductions, and practical perspective. Different methods for dealing with NP complete problems such as backtracking, branch and bound and using SAT solvers are covered.