e7fd88f82cd1284e56b32e59e4e9574c26aeb1a0
Dynamic Reachability Algorithms
The goal of this project is to implement a collection of dynamic reachability algorithms covered in "Improved Dynamic Reachability Algorithms for Directed Graphs" by Liam Roditty and Uri Zwick.
Usage/Examples
#include "roditty_zwick.h"
int main() {
// Initialize a graph G
graph::Digraph<int> G(
{1, {2}},
{2, {3, 4}},
{3, {1, 5, 9}},
{4, {5, 6}},
{5, {6, 7}},
{6, {8}},
{7, {8, 9}},
{8, {9}},
{9, {5}}
);
// Initialize dynamic reachability algorithm for general graphs
algo::HenzingerKing<int> hk(G);
hk.init();
// Query
std::cout << "Path from 4 to 8 exists: " << dr.query(4, 8);
std::vector<std::pair<int, int>> edges(
{4, 6}, {5, 6}, {3, 1}
);
// Remove edges
for (const auto& [u, v] : edges)
dk.remove(u, v);
std::cout << "Path from 4 to 8 exists: " << dr.query(4, 8);
// Insert edges
for (const auto& [u, v] : edges)
dk.insert(u, v);
std::cout << "Path from 4 to 8 exists: " << dr.query(4, 8);
return 0;
}
Run Locally
Clone the repository with submodules (doctest/nanobench):
git clone --recurse-submodules https://github.com/stefiosif/dynamic-reachability-algorithms
Run with CMake:
> mkdir build && cd build
> cmake ..
> make
> ./main
References
Languages
C++
94.9%
CMake
3.7%
Shell
1.4%