
Explore core graph theory problems, from shortest paths and connectivity to bridges, articulation points, and minimum spanning trees, using algorithms like Dijkstra, Bellman-Ford, Tarjan, and Kruskal.
Explore depth first search traversing graph nodes and edges, backtracking, and using adjacency lists with a visited array. Learn counting components and finding bridges and articulation points in O(V+E) time.
Discover how breadth first search traverses a graph layer by layer using a queue to find shortest paths in unweighted graphs, with a practical solve and path reconstruction.
An introduction to tree algorithms. This video covers how trees are stored and represented on a computer.
Learn beginner-friendly tree algorithms by implementing recursive leaf-sum and binary-tree height calculations using depth-first search, with clear pseudocode and base-case strategies.
Root a tree with depth-first search to obtain a rooted tree with directed edges. The method uses a designated root, maintains parent pointers, and avoids revisiting the parent during traversal.
Find the center of a tree by the middle of the longest path or by peeling leaf layers, using node degrees to prune until 1 or 2 centers remain.
Learn how topological sort produces a valid ordering for directed acyclic graphs, useful for course prerequisites and program build dependencies, by performing depth-first search and producing a reverse ordering.
Explore the eager implementation of Dijkstra's shortest path algorithm in Java, including an indexed min d-ary heap, graph representation, edge relaxation, and path reconstruction.
Learn the Floyd-Warshall all-pairs shortest path solver using an adjacency matrix, distance and next matrices, handling infinity and negative cycles, and reconstructing paths between node pairs.
Learn how to detect bridges (cut edges) and articulation points (cut vertices) in undirected graphs using a depth-first search with low-link values, and implement a linear-time algorithm.
Explore the algorithm to find bridges and articulation points in an undirected adjacency-list graph, with Java source code; learn how depth-first search and low-link values identify these points.
Discover Tarjan's algorithm for finding strongly connected components by maintaining a stack and updating low-link values during DFS to identify SCCs in linear time.
Explore the existence of eulerian paths and circuits in directed and undirected graphs by analyzing node degrees, in-degrees, out-degrees, and connectivity.
Explore the Eulerian path algorithm's source code by instantiating the solver with a directed graph and retrieving the path, with in and out degree tracking, DFS, and GitHub-hosted examples.
Discover how to compute maximum flow with the Ford-Fulkerson method on a flow graph using augmenting paths and residual edges to update bottlenecks.
Explore the Ford-Fulkerson max flow algorithm implemented with depth-first search in Java, including edge and residual edge handling, augmenting paths, and a concrete max flow example for graph theory algorithms.
Explore unweighted bipartite matching by framing it as a max flow problem, building a source–bipartite graph–sink network, and extracting a maximum cardinality matching from the resulting flow.
Turns number pairs into a bipartite flow problem and solves it with max flow, building a graph from inputs to unique answers and deducing the operator for each pair.
Edmonds-Karp uses a breadth-first search to find the shortest augmenting path in the Ford-Fulkerson framework, delivering max flow with a strongly polynomial time bound O(V E^2).
Explore the Edmonds-karp network flow algorithm with Java source code, implement BFS-based augmenting paths, compute bottlenecks, and update maximum flow in a reusable solver.
Explore capacity scaling, a heuristic for network flow that prioritizes large edges to reach max flow quickly, using a decreasing delta threshold to guide augmenting paths.
Explore the capacity scaling network flow solver in Java, focusing on Delta, augmenting paths, and depth-first search to compute the maximum flow.
Dinic's algorithm finds maximum flow by building a level graph with BFS and saturating paths via DFS to a blocking flow, pruning dead ends, enabling maximum matching for bipartite graphs.
Learn the Dinic's algorithm implementation in Java, building level graphs with breadth-first search, finding blocking flows via depth-first search, and using the next array to prune edges toward maximum flow.
Learn how Prim's algorithm constructs a minimum spanning tree on a weighted graph using the lazy version, via a priority queue, visited nodes, and handling stale edges.
Learn Prim's eager algorithm for minimum spanning trees, using an index priority queue to maintain vertex edge pairs and relax edges. Compare with the lazy version and discuss graph performance.
Discover prim's minimum spanning tree source code in Java, focusing on the eager implementation, edge relaxation, and the indexed priority queue that computes the MST cost and edges.
This is the sparse table data structure from my DS video series. We need to understand the sparse table DS to understand the solution to the Lowest Common Ancestor (LCA) problem
Explore a Java min sparse table implementation that supports fast min range queries, using a dynamic programming sparse table and an index table to track positions.
Learn to find the lowest common ancestor in rooted trees using an Euler tour, depth tracking, and a sparse table for fast queries.
Welcome to this Graph Theory Algorithms course!
Graph theory is a fundamental branch of mathematics that deals with the study of graphs, networks, and their applications in real-world scenarios. This course is designed to equip you with the necessary skills and knowledge to understand, analyze, and solve problems related to graph theory.
In this course, you will receive a thorough introduction to graph theory algorithms as they apply to computer science. Throughout the videos, we will cover a range of topics, including how to represent and store graphs on a computer, common graph theory problems encountered in real-world scenarios, famous graph traversal algorithms like DFS and BFS, as well as the lazy and eager versions of Dijkstra's shortest path algorithm. Additionally, we will explore what a topological sort is, how to identify one, and its applications. You will also learn about detecting negative cycles and finding shortest paths using the Bellman-Ford and Floyd-Warshall algorithms, discovering bridges and articulation points in graphs, understanding and detecting strongly connected components using Tarjan's algorithm, and finally, solving the traveling salesman problem with dynamic programming.
Throughout the course, we will use a hands-on approach to teaching, with plenty of examples and exercises to reinforce your understanding of the material. By the end of this course, you will have a deep understanding of graph theory algorithms and be able to apply them to solve real-world problems.
So, whether you are a computer science student, a software developer, or just someone interested in the fascinating world of graph theory, this course is for you! Join today and take your first step towards mastering the art of graph theory algorithms.