#### Overview of this book

C++ is a mature multi-paradigm programming language that enables you to write high-level code with a high degree of control over the hardware. Today, significant parts of software infrastructure, including databases, browsers, multimedia frameworks, and GUI toolkits, are written in C++. This book starts by introducing C++ data structures and how to store data using linked lists, arrays, stacks, and queues. In later chapters, the book explains the basic algorithm design paradigms, such as the greedy approach and the divide-and-conquer approach, which are used to solve a large variety of computational problems. Finally, you will learn the advanced technique of dynamic programming to develop optimized implementations of several algorithms discussed in the book. By the end of this book, you will have learned how to implement standard data structures and algorithms in efficient and scalable C++ 14 code.
Free Chapter
1. Lists, Stacks, and Queues
2. Trees, Heaps, and Graphs
3. Hash Tables and Bloom Filters
4. Divide and Conquer
5. Greedy Algorithms
6. Graph Algorithms I
7. Graph Algorithms II
8. Dynamic Programming I
9. Dynamic Programming II

## The Graph Traversal Problem

Imagine that you have recently moved into an apartment in a new neighborhood. As you meet your new neighbors and make new friends, people often recommend restaurants to dine at in the vicinity. You wish to visit all the recommended restaurants, so you pull out a map of the neighborhood and mark all the restaurants and your home on the map, which already has all the roads marked on it. If we represent each restaurant and your home as a vertex, and the roads connecting the restaurants as edges in a graph, the problem of visiting all the vertices in the graph, when starting from a given vertex, is called the graph traversal problem.

In the following figure, the numbers in blue are assumed vertex IDs. Vertex 1 is Home, and the restaurants are labeled from R1 to R7. None of the edges have arrows since the edges are assumed to be bidirectional, that is, you can travel on the roads in either direction: