78 assert(T.is_rooted_tree());
79 assert(T.has_node(u));
80 if constexpr (get_subsizes) {
86 uint64_t *sizes =
nullptr;
88 const uint64_t n = T.get_num_nodes();
89 if (n <= 1) {
return {std::move(es), sizes}; }
93 bool update_sizes =
false;
94 if (T.are_size_subtrees_valid()) {
95 es.reserve(T.get_num_nodes_subtree(u));
96 if constexpr (get_subsizes) {
101 sizes =
new uint64_t[T.get_num_nodes_subtree(u)]{0};
117 sizes[relabelling[u]] = T.get_num_nodes_subtree(u);
121 bfs.set_use_rev_edges(
false);
124 bfs.set_process_neighbour(
125 [&](
const auto&,
node s,
node t,
bool left_to_right) ->
void {
129 if (not left_to_right) { std::swap(s,t); }
133 if (relabelling[s] >= n) {
134 relabelling[s] = next_label;
137 sizes[relabelling[s]] = T.get_num_nodes_subtree(s);
140 e.
first = relabelling[s];
143 if (relabelling[t] >= n) {
144 relabelling[t] = next_label;
147 sizes[relabelling[t]] = T.get_num_nodes_subtree(t);
150 e.second = relabelling[t];
157 bfs.set_process_neighbour(
158 [&](
const auto&,
node s,
node t,
bool left_to_right) ->
void {
162 if (not left_to_right) { std::swap(s,t); }
164 sizes[s] = T.get_num_nodes_subtree(s);
165 sizes[t] = T.get_num_nodes_subtree(t);
167 es.emplace_back(s,t);
173 return {std::move(es), sizes};
std::pair< std::vector< edge >, uint64_t * > get_edges_subtree(const graphs::rooted_tree &T, const node u, const bool relabel) noexcept
Retrieves the edges of a subtree.
Definition retrieve_subtrees.hpp:74
std::pair< node, node > edge
See Edge page for further details.
Definition basic_types.hpp:56