51#include <lal/basic_types.hpp>
52#include <lal/graphs/rooted_tree.hpp>
53#include <lal/graphs/free_tree.hpp>
54#include <lal/detail/graphs/traversal.hpp>
83 std::enable_if_t< std::is_base_of_v<graphs::tree, tree_t>,
bool > =
true
88 const auto n = t.get_num_nodes();
92 if (t.get_num_nodes_component(X) == 1) {
98 if (t.get_num_nodes_component(X) == 2) {
104 if constexpr (std::is_base_of_v<graphs::free_tree, tree_t>) {
105 v2 = t.get_neighbours(X)[0];
108 v2 = (t.get_out_degree(X) == 0 ?
109 t.get_in_neighbours(X)[0] : t.get_out_neighbours(X)[0]
112 return (v1 < v2 ? std::make_pair(v1, v2) : std::make_pair(v2, v1));
118 std::vector<node> tree_leaves;
119 tree_leaves.reserve(t.get_num_nodes_component(X) - 1);
123 uint64_t size_trimmed = t.get_num_nodes_component(X);
126 uint64_t __size_trimmed = 0;
141 [&](
const auto&,
node u) ->
void {
148 trimmed_degree[u] = t.get_degree(u);
150 if (trimmed_degree[u] == 1) {
151 tree_leaves.push_back(u);
157 if constexpr (std::is_base_of_v<graphs::free_tree, tree_t>)
166 assert(__size_trimmed == size_trimmed);
178 [&](
const auto&,
node) ->
bool {
190 return (l0 == 1 or l0 == 2) and l1 == 0 and size_trimmed <= 2;
195 bool has_single_center =
false;
196 node single_center = n + 1;
200 [&](
const auto&,
node u,
node v,
bool) ->
void
203 if (trimmed_degree[u] == 0) {
return; }
204 if (trimmed_degree[v] == 0) {
return; }
210 trimmed_degree[u] = 0;
214 if (trimmed_degree[v] == 0) {
215 has_single_center =
true;
222 if (trimmed_degree[v] == 1) {
236 [&](
const auto&,
node,
node v) ->
bool {
return (trimmed_degree[v] == 1); }
243 if (has_single_center) {
245 assert(size_trimmed == 1);
247 return {single_center, n+1};
253 assert(size_trimmed == 2);
271 [&](
const auto&,
node u) ->
void {
272 if (trimmed_degree[u] == 1) {
273 if (v1 == n) { v1 = u; }
281 return (v1 < v2 ? std::make_pair(v1, v2) : std::make_pair(v2, v1));
Abstract graph Breadth-First Search traversal.
Definition: traversal.hpp:89
void reset() noexcept
Set the graph traversal to its default state.
Definition: traversal.hpp:135
void set_process_current(const BFS_process_one &f) noexcept
Set the function that controls the processing of the current node.
Definition: traversal.hpp:186
void set_terminate(const BFS_bool_one &f) noexcept
Set the function that controls the termination of the loop.
Definition: traversal.hpp:179
void start_at(node source) noexcept
Start traversal at a given node.
Definition: traversal.hpp:152
void set_node_add(const BFS_bool_two &f) noexcept
Set the function that controls when a node is to be added to the queue.
Definition: traversal.hpp:200
void set_process_neighbour(const BFS_process_two &f) noexcept
Set the function that controls the processing of the current neighbour.
Definition: traversal.hpp:193
void set_process_visited_neighbours(bool v) noexcept
Should the algorithm call the neighbour processing function for already visited neighbours?
Definition: traversal.hpp:208
void set_use_rev_edges(bool use) noexcept
Set whether the traversal can use reversed edges.
Definition: traversal.hpp:173
std::pair< node, node > retrieve_centre(const tree_t &t, node X) noexcept
Calculate the centre of the connected component that has node x.
Definition: tree_centre.hpp:85
Main namespace of the library.
Definition: basic_types.hpp:50
uint64_t node
Node type. See Node / Vertex page for further details.
Definition: basic_types.hpp:53
Wrapper of a C array for autmatic deallocation of memory.
Definition: data_array.hpp:59