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