## Introduction

So far, we have explored a variety of common programming structures and paradigms. Now, we are going to delve into several techniques that expand on the topics we discussed previously, beginning with an assortment of advanced graph problems, and then shifting focus toward the expansive subject of dynamic programming.

In this chapter, we will discuss three well-known algorithms, namely the Bellman-Ford algorithm, Johnson's algorithm, and Kosaraju's algorithm. All of these algorithms share clear similarities with ones we have already covered in this book but extend and combine them in various ways to solve potentially complex problems with much greater efficiency than suboptimal implementations would allow. In addition to learning these specific techniques, this chapter should also increase your general familiarity with the use of fundamental graph-related techniques and provide greater insight into how those fundamentals can be applied to a diverse range of different...