86(
const tree_t& t,
const node X)
90 const auto n = t.get_num_nodes();
94 if (t.get_num_nodes_component(X) == 1) {
100 if (t.get_num_nodes_component(X) == 2) {
106 if constexpr (std::is_base_of_v<graphs::free_tree, tree_t>) {
107 v2 = t.get_neighbors(X)[0];
110 v2 = (t.get_out_degree(X) == 0 ?
111 t.get_in_neighbors(X)[0] : t.get_out_neighbors(X)[0]
114 return (v1 < v2 ? std::make_pair(v1, v2) : std::make_pair(v2, v1));
120 std::vector<node> tree_leaves;
121 tree_leaves.reserve(t.get_num_nodes_component(X) - 1);
125 uint64_t size_trimmed = t.get_num_nodes_component(X);
128 uint64_t __size_trimmed = 0;
142 bfs.set_process_current(
143 [&](
const auto&,
node u) ->
void {
150 trimmed_degree[u] = t.get_degree(u);
152 if (trimmed_degree[u] == 1) {
153 tree_leaves.push_back(u);
159 if constexpr (std::is_base_of_v<graphs::free_tree, tree_t>) {
160 bfs.set_use_rev_edges(
false);
163 bfs.set_use_rev_edges(
true);
170 assert(__size_trimmed == size_trimmed);
182 [&](
const auto&,
node) ->
bool {
194 return (l0 == 1 or l0 == 2) and l1 == 0 and size_trimmed <= 2;
199 bool has_single_center =
false;
200 node single_center = n + 1;
202 bfs.set_process_visited_neighbors(
true);
203 bfs.set_process_neighbour(
204 [&](
const auto&,
node u,
node v,
bool) ->
void
207 if (trimmed_degree[u] == 0) {
return; }
208 if (trimmed_degree[v] == 0) {
return; }
214 trimmed_degree[u] = 0;
218 if (trimmed_degree[v] == 0) {
219 has_single_center =
true;
226 if (trimmed_degree[v] == 1) {
240 [&](
const auto&,
node,
node v,
bool) ->
bool {
return trimmed_degree[v] == 1; }
244 bfs.set_use_rev_edges(t.is_directed());
245 bfs.start_at(tree_leaves);
247 if (has_single_center) {
249 assert(size_trimmed == 1);
251 return {single_center, n + 1};
257 assert(size_trimmed == 2);
265 bfs.set_use_rev_edges(t.is_directed());
274 bfs.set_process_current(
275 [&](
const auto&,
node u) ->
void {
276 if (trimmed_degree[u] == 1) {
277 if (v1 == n) { v1 = u; }
285 return (v1 < v2 ? std::make_pair(v1, v2) : std::make_pair(v2, v1));
std::pair< node, node > retrieve_centre(const tree_t &t, const node X) noexcept
Calculate the centre of the connected component that has node x.
Definition tree_centre.hpp:86