In the winter of 1978, Professor George P61ya and I jointly taught Stanford University's introductory combinatorics course. This was a great opportunity for me, as I had known of Professor P61ya since having read his classic book, How to Solve It, as a teenager. Working with P6lya, who ·was over ninety years old at the time, was every bit as rewarding as I had hoped it would be. His creativity, intelligence, warmth and generosity of spirit, and wonderful gift for teaching continue to be an inspiration to me. Combinatorics is one of the branches of mathematics that play a crucial role in computer sCience, since digital computers manipulate discrete, finite objects. Combinatorics impinges on computing in two ways. First, the properties of graphs and other combinatorial objects lead directly to algorithms for solving graph-theoretic problems, which have widespread application in non-numerical as well as in numerical computing. Second, combinatorial methods provide many analytical tools that can be used for determining the worst-case and expected performance of computer algorithms. A knowledge of combinatorics will serve the computer scientist well. Combinatorics can be classified into three types: enumerative, eXistential, and constructive. Enumerative combinatorics deals with the counting of combinatorial objects. Existential combinatorics studies the existence or nonexistence of combinatorial configurations.