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

Description
Collection of decremental and dynamic reachability algorithms.
Readme GPL-3.0 341 KiB
Languages
C++ 94.9%
CMake 3.7%
Shell 1.4%