VeloGraphX
High-performance dynamic graph analytics in C++20
Loading...
Searching...
No Matches
dijkstra.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <functional>
5#include <limits>
6#include <queue>
7#include <utility>
8#include <vector>
9
10#include "velographx/types.hpp"
11
13
14inline constexpr std::uint64_t kDijkstraInf = std::numeric_limits<std::uint64_t>::max() / 4;
15
16template <class NeighborEnumerator>
17void propagate_dijkstra(std::vector<std::uint64_t>& dist,
18 std::priority_queue<std::pair<std::uint64_t, VertexId>,
19 std::vector<std::pair<std::uint64_t, VertexId>>,
20 std::greater<std::pair<std::uint64_t, VertexId>>>& queue,
21 NeighborEnumerator&& enumerate) {
22 while (!queue.empty()) {
23 const auto [distance, u] = queue.top();
24 queue.pop();
25 if (u >= dist.size() || distance != dist[u]) continue;
26 enumerate(u, [&](VertexId v, std::uint64_t weight) {
27 if (v >= dist.size() || weight > kDijkstraInf - distance) return;
28 const auto candidate = distance + weight;
29 if (candidate < dist[v]) {
30 dist[v] = candidate;
31 queue.push({candidate, v});
32 }
33 });
34 }
35}
36
37template <class NeighborEnumerator>
39 VertexId source,
40 std::vector<std::uint64_t>& dist,
41 NeighborEnumerator&& enumerate) {
42 dist.assign(vertex_count, kDijkstraInf);
43 if (source >= vertex_count) return;
44 using Item = std::pair<std::uint64_t, VertexId>;
45 std::priority_queue<Item, std::vector<Item>, std::greater<Item>> queue;
46 dist[source] = 0;
47 queue.push({0, source});
48 propagate_dijkstra(dist, queue, std::forward<NeighborEnumerator>(enumerate));
49}
50
51} // namespace velographx::incremental_detail
void propagate_dijkstra(std::vector< std::uint64_t > &dist, std::priority_queue< std::pair< std::uint64_t, VertexId >, std::vector< std::pair< std::uint64_t, VertexId > >, std::greater< std::pair< std::uint64_t, VertexId > > > &queue, NeighborEnumerator &&enumerate)
Definition dijkstra.hpp:17
constexpr std::uint64_t kDijkstraInf
Definition dijkstra.hpp:14
void recompute_dijkstra(std::size_t vertex_count, VertexId source, std::vector< std::uint64_t > &dist, NeighborEnumerator &&enumerate)
Definition dijkstra.hpp:38
std::uint32_t VertexId
Definition frontier.hpp:6
constexpr std::size_t vertex_count(const Graph &graph)