The main objective of this work is to develop a thorough understanding of the structure of graphs and the techniques used to analyze problems in graph theory. Fundamental graph algorithms are also included. Examples and over 600 exercises - at various levels of difficulty - guide students.