This textbook presents a theoretical treatment of linear programming, network flows and applications, integer programming, and computational complexity. The author includes a rigorous discussion of theory, numerous examples and exercises, and geometric intuitive explanations. He also offers computational tips and interpretation of software input. Unlike other books, this text incorporates duality throughout its chapters, rather than treating it as an add-on topic. It also discusses computational complexity theory, which can be used to classify problems according to the appropriate solution method.