11#include <boost/graph/kruskal_min_spanning_tree.hpp>
12#include <boost/graph/prim_minimum_spanning_tree.hpp>
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();
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);
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();
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);
75template <
typename NodeID,
typename EdgeWeight,
bool Directed,
bool Multi,
bool Weighted,
typename OutEdgeSelector,
typename VertexSelector>
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)));
87template <
typename NodeID,
typename EdgeWeight,
bool Directed,
bool Multi,
bool Weighted,
typename OutEdgeSelector,
typename VertexSelector>
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(
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))
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]);
109template <
typename NodeID,
typename EdgeWeight,
bool Directed,
bool Multi,
bool Weighted,
typename OutEdgeSelector,
typename VertexSelector>
114template <
typename NodeID,
typename EdgeWeight,
bool Directed,
bool Multi,
bool Weighted,
typename OutEdgeSelector,
typename VertexSelector>
Graph wrapper around Boost Graph Library with Python-inspired helpers.
Definition graph.hpp:272
Core graph wrapper, proxy surface, and public alias presets.