nxpp
Header-only graph utilities on top of Boost Graph Library
Loading...
Searching...
No Matches
spanning_tree.hpp
Go to the documentation of this file.
1#pragma once
2
11#include <boost/graph/kruskal_min_spanning_tree.hpp>
12#include <boost/graph/prim_minimum_spanning_tree.hpp>
13
14#include "graph.hpp"
15
16namespace nxpp {
17
18template <typename GraphWrapper>
19requires(GraphWrapper::has_builtin_edge_weight)
27[[deprecated("Use G.kruskal_minimum_spanning_tree() instead.")]]
28auto kruskal_minimum_spanning_tree(const GraphWrapper& G) {
29 return G.kruskal_minimum_spanning_tree();
30}
31
32template <typename GraphWrapper>
33requires(GraphWrapper::has_builtin_edge_weight)
42[[deprecated("Use G.prim_minimum_spanning_tree(root) instead.")]]
43auto prim_minimum_spanning_tree(const GraphWrapper& G, const typename GraphWrapper::NodeType& root_id) {
44 return G.prim_minimum_spanning_tree(root_id);
45}
46
47template <typename GraphWrapper>
48requires(GraphWrapper::has_builtin_edge_weight)
55[[deprecated("Use G.minimum_spanning_tree() instead.")]]
56auto minimum_spanning_tree(const GraphWrapper& G) {
57 return G.minimum_spanning_tree();
58}
59
60template <typename GraphWrapper>
61requires(GraphWrapper::has_builtin_edge_weight)
70[[deprecated("Use G.minimum_spanning_tree(root) instead.")]]
71auto minimum_spanning_tree(const GraphWrapper& G, const typename GraphWrapper::NodeType& root_id) {
72 return G.minimum_spanning_tree(root_id);
73}
74
75template <typename NodeID, typename EdgeWeight, bool Directed, bool Multi, bool Weighted, typename OutEdgeSelector, typename VertexSelector>
76template <bool W>
77requires(W)
79 std::vector<EdgeDesc> mst_edges;
80 boost::kruskal_minimum_spanning_tree(g, std::back_inserter(mst_edges));
81 std::vector<std::pair<NodeID, NodeID>> result;
82 result.reserve(mst_edges.size());
83 for (const auto& e : mst_edges) result.emplace_back(get_node_id(boost::source(e, g)), get_node_id(boost::target(e, g)));
84 return result;
85}
86
87template <typename NodeID, typename EdgeWeight, bool Directed, bool Multi, bool Weighted, typename OutEdgeSelector, typename VertexSelector>
88template <bool W>
89requires(W)
91 if (id_to_bgl.find(root_id) == id_to_bgl.end()) throw std::runtime_error("Minimum spanning tree failed: root node not found.");
92 std::vector<VertexDesc> parent(boost::num_vertices(g));
93 std::vector<boost::default_color_type> color(boost::num_vertices(g));
94 boost::prim_minimum_spanning_tree(
95 g,
96 boost::make_iterator_property_map(parent.begin(), vertex_index_map),
97 boost::root_vertex(id_to_bgl.at(root_id))
98 .vertex_index_map(vertex_index_map)
99 .color_map(boost::make_iterator_property_map(color.begin(), vertex_index_map))
100 );
101 std::map<NodeID, NodeID> result;
102 for (auto [v, vend] = boost::vertices(g); v != vend; ++v) {
103 const auto index = get_vertex_index(*v);
104 result[get_node_id(*v)] = get_node_id(parent[index]);
105 }
106 return result;
107}
108
109template <typename NodeID, typename EdgeWeight, bool Directed, bool Multi, bool Weighted, typename OutEdgeSelector, typename VertexSelector>
110template <bool W>
111requires(W)
113
114template <typename NodeID, typename EdgeWeight, bool Directed, bool Multi, bool Weighted, typename OutEdgeSelector, typename VertexSelector>
115template <bool W>
116requires(W)
117auto Graph<NodeID, EdgeWeight, Directed, Multi, Weighted, OutEdgeSelector, VertexSelector>::minimum_spanning_tree(const NodeID& root_id) const { return prim_minimum_spanning_tree(root_id); }
118
119} // namespace nxpp
Graph wrapper around Boost Graph Library with Python-inspired helpers.
Definition graph.hpp:272
Core graph wrapper, proxy surface, and public alias presets.