51#include <lal/graphs/rooted_tree.hpp>
52#include <lal/internal/graphs/traversal.hpp>
53#include <lal/internal/data_array.hpp>
73template<
bool get_subsizes>
74std::pair<std::vector<edge>, uint32_t *>
76(
const graphs::rooted_tree& T,
node u,
bool relabel)
79 assert(T.is_rooted_tree());
80 assert(T.has_node(u));
81 if constexpr (get_subsizes) {
87 uint32_t *sizes =
nullptr;
89 const uint32_t n = T.get_num_nodes();
90 if (n <= 1) {
return {es, sizes}; }
94 bool update_sizes =
false;
95 if (T.are_size_subtrees_valid()) {
96 es.reserve(T.get_num_nodes_subtree(u));
97 if constexpr (get_subsizes) {
102 sizes =
new uint32_t[T.get_num_nodes_subtree(u)]{0};
112 data_array<node> relabelling(n, n + 1);
118 sizes[relabelling[u]] = T.get_num_nodes_subtree(u);
121 BFS<graphs::rooted_tree> bfs(T);
122 bfs.set_use_rev_edges(
false);
125 bfs.set_process_neighbour(
126 [&](
const auto&,
node s,
node t,
bool left_to_right) ->
void {
130 if (not left_to_right) { std::swap(s,t); }
134 if (relabelling[s] >= n) {
135 relabelling[s] = next_label;
138 sizes[relabelling[s]] = T.get_num_nodes_subtree(s);
141 e.first = relabelling[s];
144 if (relabelling[t] >= n) {
145 relabelling[t] = next_label;
148 sizes[relabelling[t]] = T.get_num_nodes_subtree(t);
151 e.second = relabelling[t];
158 bfs.set_process_neighbour(
159 [&](
const auto&,
node s,
node t,
bool left_to_right) ->
void {
163 if (not left_to_right) { std::swap(s,t); }
165 sizes[s] = T.get_num_nodes_subtree(s);
166 sizes[t] = T.get_num_nodes_subtree(t);
168 es.push_back(
edge(s,t));
Main namespace of the library.
Definition definitions.hpp:48
std::pair< node, node > edge
Edge type.
Definition definitions.hpp:75
uint32_t node
Node type.
Definition definitions.hpp:51