This introduction to combinatorics is suitable for upper-level undergraduates and graduate students in engineering, science, and mathematics. The four-part treatment begins with a section on counting and listing that covers basic counting, functions, decision trees, and sieving methods. The following section addresses fundamental concepts in graph theory and a sampler of graph topics. The third part examines induction and recursion, sorting theory, and rooted plane trees. The final section, on generating functions, offers students a powerful tool for studying counting problems. Numerous exercises (some with solutions), notes, and references appear throughout the text.