This book provides a pedagogical and comprehensive introduction to graph theory and its applications. It contains all the standard basic material and develops significant topics and applications, such as: colorings and the timetabling problem, matchings and the optimal assignment problem, and Hamiltonian cycles and the traveling salesman problem, to name but a few. Exercises at various levels are given at the end of each chapter, and a final chapter presents a few general problems with hints for solutions, thus providing the reader with the opportunity to test and refine their knowledge on the subject. An appendix outlines the basis of computational complexity theory, in particular the definition of NP-completeness, which is essential for algorithmic applications.