The course illustrates the main modeling techniques for solving optimization problems, both tractable than computationally hard. The course introduces mathematical programming techniques, based on linear programming (LP) with both real and integer variables. The geometry of LP is studied (polyhedra), duality, branch-and-bound and cutting planes, totally unimodular matrices. The main notions of computational complexity are recalled. Some standard optimization problems on graphs are discussed such as minimum and maximum path, the maximum matching problem, the assignment, the minimum spanning tree, the maximum flow, the minimum and maximum cut in a graph, the traling salesman problem, the minimum vertex cover, the independent set. For polynomial problems, the solving algorithms from the literature are described. Furthermore, alternative approaches based on (integer) LP are also discussed.