41 using type = boost::adjacency_list<A, B, boost::undirectedS, D, E, F>;
59 using UG = detail::Undirect<Graph>;
60 using vertex_t =
typename UG::vertex_descriptor;
63 static_assert(std::is_same_v<vertex_t, size_t>);
64 static_assert(std::is_same_v<typename UG::vertex_descriptor, typename Graph::vertex_descriptor>);
68 generate_random_graph(ug, n_vertices, n_edges, rng);
69 vertex_t
const root = random_vertex(ug, rng);
73 std::map<vertex_t, int> components;
74 auto from = [&](
int component) {
75 for (
auto &[v, c] : components)
78 throw std::range_error(
"component");
82 auto cmap = boost::make_assoc_property_map(components);
84 if (
int n = connected_components(ug, cmap); n > 1)
86 for (
int c = 1; c < n; ++c)
87 add_edge(from(c - 1), from(c), ug);
91 std::map<vertex_t, vertex_t> predecessors;
92 random_spanning_tree(ug, rng,
93 boost::root_vertex(root)
94 .predecessor_map(boost::make_assoc_property_map(predecessors)));
96 Graph tree(num_vertices(ug));
97 for (
auto v : boost::make_iterator_range(vertices(ug)))
98 if (predecessors.contains(v))
99 if (
auto pred = predecessors.at(v); ug.null_vertex() != pred)
100 add_edge(predecessors.at(v), v, tree);
102 return std::tuple(std::move(tree), root);
auto get_random_spanning_tree(int n_vertices, int n_edges, Generator &rng)
Generates a random directed tree.
Definition random_tree.hpp:57