This textbook introduces students of mathematics and computer science to the interrelated fields of graph theory, algorithms and complexity. No specific previous knowledge is assumed. The central theme of the book is a geometrical problem called the Steiner tree problem.