51#include <lal/definitions.hpp>
52#include <lal/graphs/rooted_tree.hpp>
53#include <lal/graphs/free_tree.hpp>
54#include <lal/internal/graphs/traversal.hpp>
85 std::is_base_of_v<graphs::free_tree, T> ||
86 std::is_base_of_v<graphs::rooted_tree, T>,
89std::pair<node, node> retrieve_centre(
const T& t,
node X) {
91 const auto n = t.get_num_nodes();
95 if (t.get_num_nodes_component(X) == 1) {
96 return std::make_pair(X, n+1);
101 if (t.get_num_nodes_component(X) == 2) {
107 if constexpr (std::is_base_of_v<graphs::free_tree, T>) {
108 v2 = t.get_neighbours(X)[0];
111 v2 = (t.get_out_degree(X) == 0 ?
112 t.get_in_neighbours(X)[0] : t.get_out_neighbours(X)[0]
115 return (v1 < v2 ? std::make_pair(v1, v2) : std::make_pair(v2, v1));
121 std::vector<node> tree_leaves;
122 tree_leaves.reserve(t.get_num_nodes_component(X) - 1);
124 std::vector<uint32_t> trimmed_degree(n, 0);
126 uint32_t size_trimmed = t.get_num_nodes_component(X);
129 uint32_t __size_trimmed = 0;
143 bfs.set_process_current(
144 [&](
const auto&,
node u) ->
void {
151 trimmed_degree[u] = t.get_degree(u);
153 if (trimmed_degree[u] == 1) {
154 tree_leaves.push_back(u);
160 if constexpr (std::is_base_of_v<graphs::free_tree, T>)
161 { bfs.set_use_rev_edges(
false); }
163 { bfs.set_use_rev_edges(
true); }
169 assert(__size_trimmed == size_trimmed);
181 [&](
const auto&,
node) ->
bool {
193 return (l0 == 1 or l0 == 2) and l1 == 0 and size_trimmed <= 2;
198 bool has_single_center =
false;
199 node single_center = n + 1;
201 bfs.set_process_visited_neighbours(
true);
202 bfs.set_process_neighbour(
203 [&](
const auto&,
node u,
node v,
bool) ->
void
206 if (trimmed_degree[u] == 0) {
return; }
207 if (trimmed_degree[v] == 0) {
return; }
213 trimmed_degree[u] = 0;
217 if (trimmed_degree[v] == 0) {
218 has_single_center =
true;
225 if (trimmed_degree[v] == 1) {
239 [&](
const auto&,
node,
node v) ->
bool {
return (trimmed_degree[v] == 1); }
243 bfs.set_use_rev_edges(t.is_directed());
244 bfs.start_at(tree_leaves);
246 if (has_single_center) {
248 assert(size_trimmed == 1);
250 return std::make_pair(single_center, n+1);
256 assert(size_trimmed == 2);
264 bfs.set_use_rev_edges(t.is_directed());
273 bfs.set_process_current(
274 [&](
const auto&,
node u) ->
void {
275 if (trimmed_degree[u] == 1) {
276 if (v1 == n) { v1 = u; }
284 return (v1 < v2 ? std::make_pair(v1, v2) : std::make_pair(v2, v1));
Main namespace of the library.
Definition definitions.hpp:48
uint32_t node
Node type.
Definition definitions.hpp:51