Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 11 additions & 12 deletions D3128_Algorithms/src/bellman_shortest_dists.hpp
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
template <adjacency_list G,
class Distances,
class WF = function<vertex_property_map_value_t<Distances>(const remove_reference_t<G>&,
const edge_t<G>&)>,
class DistanceFn,
class WF = function<distance_fn_value_t<DistanceFn, G>(const remove_reference_t<G>&,
const edge_t<G>&)>,
class Visitor = empty_visitor,
class Compare = less<vertex_property_map_value_t<Distances>>,
class Combine = plus<vertex_property_map_value_t<Distances>>>
requires vertex_property_map_for<Distances, G> &&
is_arithmetic_v<vertex_property_map_value_t<Distances>> &&
basic_edge_weight_function<G, WF, vertex_property_map_value_t<Distances>, Compare, Combine>
class Compare = less<distance_fn_value_t<DistanceFn, G>>,
class Combine = plus<distance_fn_value_t<DistanceFn, G>>>
requires distance_fn_for<DistanceFn, G> &&
basic_edge_weight_function<G, WF, distance_fn_value_t<DistanceFn, G>, Compare, Combine>
[[nodiscard]] constexpr optional<vertex_id_t<G>> bellman_ford_shortest_distances(
G&& g,
const vertex_id_t<G>& source,
Distances& distances,
DistanceFn&& distance,
WF&& weight = [](const auto&,
const edge_t<G>& uv) { return vertex_property_map_value_t<Distances>(1); },
const edge_t<G>& uv) { return distance_fn_value_t<DistanceFn, G>(1); },
Visitor&& visitor = empty_visitor(),
Compare&& compare = less<vertex_property_map_value_t<Distances>>(),
Combine&& combine = plus<vertex_property_map_value_t<Distances>>());
Compare&& compare = less<distance_fn_value_t<DistanceFn, G>>(),
Combine&& combine = plus<distance_fn_value_t<DistanceFn, G>>());
23 changes: 11 additions & 12 deletions D3128_Algorithms/src/bellman_shortest_dists_multi.hpp
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
template <adjacency_list G,
input_range Sources,
class Distances,
class WF = function<vertex_property_map_value_t<Distances>(const remove_reference_t<G>&,
const edge_t<G>&)>,
class DistanceFn,
class WF = function<distance_fn_value_t<DistanceFn, G>(const remove_reference_t<G>&,
const edge_t<G>&)>,
class Visitor = empty_visitor,
class Compare = less<vertex_property_map_value_t<Distances>>,
class Combine = plus<vertex_property_map_value_t<Distances>>>
requires vertex_property_map_for<Distances, G> &&
class Compare = less<distance_fn_value_t<DistanceFn, G>>,
class Combine = plus<distance_fn_value_t<DistanceFn, G>>>
requires distance_fn_for<DistanceFn, G> &&
convertible_to<range_value_t<Sources>, vertex_id_t<G>> &&
is_arithmetic_v<vertex_property_map_value_t<Distances>> &&
basic_edge_weight_function<G, WF, vertex_property_map_value_t<Distances>, Compare, Combine>
basic_edge_weight_function<G, WF, distance_fn_value_t<DistanceFn, G>, Compare, Combine>
[[nodiscard]] constexpr optional<vertex_id_t<G>> bellman_ford_shortest_distances(
G&& g,
const Sources& sources,
Distances& distances,
DistanceFn&& distance,
WF&& weight = [](const auto&,
const edge_t<G>& uv) { return vertex_property_map_value_t<Distances>(1); },
const edge_t<G>& uv) { return distance_fn_value_t<DistanceFn, G>(1); },
Visitor&& visitor = empty_visitor(),
Compare&& compare = less<vertex_property_map_value_t<Distances>>(),
Combine&& combine = plus<vertex_property_map_value_t<Distances>>());
Compare&& compare = less<distance_fn_value_t<DistanceFn, G>>(),
Combine&& combine = plus<distance_fn_value_t<DistanceFn, G>>());
30 changes: 14 additions & 16 deletions D3128_Algorithms/src/bellman_shortest_paths.hpp
Original file line number Diff line number Diff line change
@@ -1,23 +1,21 @@
template <adjacency_list G,
class Distances,
class Predecessors,
class WF = function<vertex_property_map_value_t<Distances>(const remove_reference_t<G>&,
const edge_t<G>&)>,
class DistanceFn,
class PredecessorFn,
class WF = function<distance_fn_value_t<DistanceFn, G>(const remove_reference_t<G>&,
const edge_t<G>&)>,
class Visitor = empty_visitor,
class Compare = less<vertex_property_map_value_t<Distances>>,
class Combine = plus<vertex_property_map_value_t<Distances>>>
requires vertex_property_map_for<Distances, G> &&
vertex_property_map_for<Predecessors, G> &&
is_arithmetic_v<vertex_property_map_value_t<Distances>> &&
convertible_to<vertex_id_t<G>, vertex_property_map_value_t<Predecessors>> &&
basic_edge_weight_function<G, WF, vertex_property_map_value_t<Distances>, Compare, Combine>
class Compare = less<distance_fn_value_t<DistanceFn, G>>,
class Combine = plus<distance_fn_value_t<DistanceFn, G>>>
requires distance_fn_for<DistanceFn, G> &&
predecessor_fn_for<PredecessorFn, G> &&
basic_edge_weight_function<G, WF, distance_fn_value_t<DistanceFn, G>, Compare, Combine>
[[nodiscard]] constexpr optional<vertex_id_t<G>> bellman_ford_shortest_paths(
G&& g,
const vertex_id_t<G>& source,
Distances& distances,
Predecessors& predecessor,
DistanceFn&& distance,
PredecessorFn&& predecessor,
WF&& weight = [](const auto&,
const edge_t<G>& uv) { return vertex_property_map_value_t<Distances>(1); },
const edge_t<G>& uv) { return distance_fn_value_t<DistanceFn, G>(1); },
Visitor&& visitor = empty_visitor(),
Compare&& compare = less<vertex_property_map_value_t<Distances>>(),
Combine&& combine = plus<vertex_property_map_value_t<Distances>>());
Compare&& compare = less<distance_fn_value_t<DistanceFn, G>>(),
Combine&& combine = plus<distance_fn_value_t<DistanceFn, G>>());
38 changes: 18 additions & 20 deletions D3128_Algorithms/src/bellman_shortest_paths_multi.hpp
Original file line number Diff line number Diff line change
@@ -1,25 +1,23 @@
template <adjacency_list G,
input_range Sources,
class Distances,
class Predecessors,
class WF = function<vertex_property_map_value_t<Distances>(const remove_reference_t<G>&,
const edge_t<G>&)>,
class DistanceFn,
class PredecessorFn,
class WF = function<distance_fn_value_t<DistanceFn, G>(const remove_reference_t<G>&,
const edge_t<G>&)>,
class Visitor = empty_visitor,
class Compare = less<vertex_property_map_value_t<Distances>>,
class Combine = plus<vertex_property_map_value_t<Distances>>>
requires vertex_property_map_for<Distances, G> &&
vertex_property_map_for<Predecessors, G> &&
class Compare = less<distance_fn_value_t<DistanceFn, G>>,
class Combine = plus<distance_fn_value_t<DistanceFn, G>>>
requires distance_fn_for<DistanceFn, G> &&
predecessor_fn_for<PredecessorFn, G> &&
convertible_to<range_value_t<Sources>, vertex_id_t<G>> &&
is_arithmetic_v<vertex_property_map_value_t<Distances>> &&
convertible_to<vertex_id_t<G>, vertex_property_map_value_t<Predecessors>> &&
basic_edge_weight_function<G, WF, vertex_property_map_value_t<Distances>, Compare, Combine>
basic_edge_weight_function<G, WF, distance_fn_value_t<DistanceFn, G>, Compare, Combine>
[[nodiscard]] constexpr optional<vertex_id_t<G>> bellman_ford_shortest_paths(
G&& g,
const Sources& sources,
Distances& distances,
Predecessors& predecessor,
WF&& weight = [](const auto&,
const edge_t<G>& uv) { return vertex_property_map_value_t<Distances>(1); },
Visitor&& visitor = empty_visitor(),
Compare&& compare = less<vertex_property_map_value_t<Distances>>(),
Combine&& combine = plus<vertex_property_map_value_t<Distances>>());
G&& g,
const Sources& sources,
DistanceFn&& distance,
PredecessorFn&& predecessor,
WF&& weight = [](const auto&,
const edge_t<G>& uv) { return distance_fn_value_t<DistanceFn, G>(1); },
Visitor&& visitor = empty_visitor(),
Compare&& compare = less<distance_fn_value_t<DistanceFn, G>>(),
Combine&& combine = plus<distance_fn_value_t<DistanceFn, G>>());
18 changes: 9 additions & 9 deletions D3128_Algorithms/src/connected_components.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ void biconnected_components(G&& g, OuterContainer& components);
/*
* Connected Components
*/
template <adjacency_list G, class Component>
requires vertex_property_map_for<Component, G>
size_t connected_components(G&& g, Component& component);
template <adjacency_list G, class ComponentFn>
requires vertex_property_fn_for<ComponentFn, G>
size_t connected_components(G&& g, ComponentFn&& component);

/*
* Afforest Connected Components
Expand All @@ -32,10 +32,10 @@ void afforest(G&& g, GT&& g_t, Component& component, const size_t neighbor_round
/*
* Kosaraju Strongly Connected Components
*/
template <adjacency_list G, adjacency_list GT, class Component>
requires vertex_property_map_for<Component, G>
void kosaraju(G&& g, GT&& g_t, Component& component);
template <adjacency_list G, adjacency_list GT, class ComponentFn>
requires vertex_property_fn_for<ComponentFn, G>
void kosaraju(G&& g, GT&& g_t, ComponentFn&& component);

template <bidirectional_adjacency_list G, class Component>
requires vertex_property_map_for<Component, G>
void kosaraju(G&& g, Component& component);
template <bidirectional_adjacency_list G, class ComponentFn>
requires vertex_property_fn_for<ComponentFn, G>
void kosaraju(G&& g, ComponentFn&& component);
18 changes: 11 additions & 7 deletions D3128_Algorithms/src/dijkstra_example_mapped.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,18 @@ G g({{"a", "b", 4.0}, {"a", "c", 2.0},

constexpr double inf = std::numeric_limits<double>::max();

auto dist = make_vertex_property_map<G, double>(g, inf);
auto pred = make_vertex_property_map<G, vertex_id_t<G>>(g, vertex_id_t<G>{});
for (auto&& [uid, u] : views::vertexlist(g))
pred[uid] = uid;

dijkstra_shortest_paths(g, std::string{"a"}, dist, pred,
std::unordered_map<std::string, double> dist_map;
std::unordered_map<std::string, std::string> pred_map;
for (auto&& [uid, u] : views::vertexlist(g)) {
dist_map[uid] = inf;
pred_map[uid] = uid;
}

dijkstra_shortest_paths(g, std::string{"a"},
[&dist_map](const auto&, const auto& uid) -> double& { return dist_map[uid]; },
[&pred_map](const auto&, const auto& uid) -> std::string& { return pred_map[uid]; },
[](const auto& g, const edge_t<G>& e) { return edge_value(g, e); });

// Shortest a to d: a to c (2) to b (1) to d (5) = 8
// dist["d"] == 8
// dist\_map["d"] == 8

23 changes: 11 additions & 12 deletions D3128_Algorithms/src/dijkstra_shortest_dists.hpp
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
template <adjacency_list G,
class Distances,
class WF = function<vertex_property_map_value_t<Distances>(const remove_reference_t<G>&,
const edge_t<G>&)>,
class DistanceFn,
class WF = function<distance_fn_value_t<DistanceFn, G>(const remove_reference_t<G>&,
const edge_t<G>&)>,
class Visitor = empty_visitor,
class Compare = less<vertex_property_map_value_t<Distances>>,
class Combine = plus<vertex_property_map_value_t<Distances>>>
requires vertex_property_map_for<Distances, G> &&
is_arithmetic_v<vertex_property_map_value_t<Distances>> &&
basic_edge_weight_function<G, WF, vertex_property_map_value_t<Distances>, Compare, Combine>
class Compare = less<distance_fn_value_t<DistanceFn, G>>,
class Combine = plus<distance_fn_value_t<DistanceFn, G>>>
requires distance_fn_for<DistanceFn, G> &&
basic_edge_weight_function<G, WF, distance_fn_value_t<DistanceFn, G>, Compare, Combine>
constexpr void dijkstra_shortest_distances(
G&& g,
const vertex_id_t<G>& source,
Distances& distances,
DistanceFn&& distance,
WF&& weight = [](const auto&,
const edge_t<G>& uv) { return vertex_property_map_value_t<Distances>(1); },
const edge_t<G>& uv) { return distance_fn_value_t<DistanceFn, G>(1); },
Visitor&& visitor = empty_visitor(),
Compare&& compare = less<vertex_property_map_value_t<Distances>>(),
Combine&& combine = plus<vertex_property_map_value_t<Distances>>());
Compare&& compare = less<distance_fn_value_t<DistanceFn, G>>(),
Combine&& combine = plus<distance_fn_value_t<DistanceFn, G>>());
23 changes: 11 additions & 12 deletions D3128_Algorithms/src/dijkstra_shortest_dists_multi.hpp
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
template <adjacency_list G,
input_range Sources,
class Distances,
class WF = function<vertex_property_map_value_t<Distances>(const remove_reference_t<G>&,
const edge_t<G>&)>,
class DistanceFn,
class WF = function<distance_fn_value_t<DistanceFn, G>(const remove_reference_t<G>&,
const edge_t<G>&)>,
class Visitor = empty_visitor,
class Compare = less<vertex_property_map_value_t<Distances>>,
class Combine = plus<vertex_property_map_value_t<Distances>>>
requires vertex_property_map_for<Distances, G> &&
class Compare = less<distance_fn_value_t<DistanceFn, G>>,
class Combine = plus<distance_fn_value_t<DistanceFn, G>>>
requires distance_fn_for<DistanceFn, G> &&
convertible_to<range_value_t<Sources>, vertex_id_t<G>> &&
is_arithmetic_v<vertex_property_map_value_t<Distances>> &&
basic_edge_weight_function<G, WF, vertex_property_map_value_t<Distances>, Compare, Combine>
basic_edge_weight_function<G, WF, distance_fn_value_t<DistanceFn, G>, Compare, Combine>
constexpr void dijkstra_shortest_distances(
G&& g,
const Sources& sources,
Distances& distances,
DistanceFn&& distance,
WF&& weight = [](const auto&,
const edge_t<G>& uv) { return vertex_property_map_value_t<Distances>(1); },
const edge_t<G>& uv) { return distance_fn_value_t<DistanceFn, G>(1); },
Visitor&& visitor = empty_visitor(),
Compare&& compare = less<vertex_property_map_value_t<Distances>>(),
Combine&& combine = plus<vertex_property_map_value_t<Distances>>());
Compare&& compare = less<distance_fn_value_t<DistanceFn, G>>(),
Combine&& combine = plus<distance_fn_value_t<DistanceFn, G>>());
30 changes: 14 additions & 16 deletions D3128_Algorithms/src/dijkstra_shortest_paths.hpp
Original file line number Diff line number Diff line change
@@ -1,23 +1,21 @@
template <adjacency_list G,
class Distances,
class Predecessors,
class WF = function<vertex_property_map_value_t<Distances>(const remove_reference_t<G>&,
const edge_t<G>&)>,
class DistanceFn,
class PredecessorFn,
class WF = function<distance_fn_value_t<DistanceFn, G>(const remove_reference_t<G>&,
const edge_t<G>&)>,
class Visitor = empty_visitor,
class Compare = less<vertex_property_map_value_t<Distances>>,
class Combine = plus<vertex_property_map_value_t<Distances>>>
requires vertex_property_map_for<Distances, G> &&
vertex_property_map_for<Predecessors, G> &&
is_arithmetic_v<vertex_property_map_value_t<Distances>> &&
convertible_to<vertex_id_t<G>, vertex_property_map_value_t<Predecessors>> &&
basic_edge_weight_function<G, WF, vertex_property_map_value_t<Distances>, Compare, Combine>
class Compare = less<distance_fn_value_t<DistanceFn, G>>,
class Combine = plus<distance_fn_value_t<DistanceFn, G>>>
requires distance_fn_for<DistanceFn, G> &&
predecessor_fn_for<PredecessorFn, G> &&
basic_edge_weight_function<G, WF, distance_fn_value_t<DistanceFn, G>, Compare, Combine>
constexpr void dijkstra_shortest_paths(
G&& g,
const vertex_id_t<G>& source,
Distances& distances,
Predecessors& predecessor,
DistanceFn&& distance,
PredecessorFn&& predecessor,
WF&& weight = [](const auto&,
const edge_t<G>& uv) { return vertex_property_map_value_t<Distances>(1); },
const edge_t<G>& uv) { return distance_fn_value_t<DistanceFn, G>(1); },
Visitor&& visitor = empty_visitor(),
Compare&& compare = less<vertex_property_map_value_t<Distances>>(),
Combine&& combine = plus<vertex_property_map_value_t<Distances>>());
Compare&& compare = less<distance_fn_value_t<DistanceFn, G>>(),
Combine&& combine = plus<distance_fn_value_t<DistanceFn, G>>());
Loading
Loading