51#include <lal/definitions.hpp>
52#include <lal/graphs/rooted_tree.hpp>
53#include <lal/internal/graphs/size_subtrees.hpp>
54#include <lal/internal/sorting/counting_sort.hpp>
67 std::is_base_of_v<graphs::free_tree, tree_type> ||
68 std::is_base_of_v<graphs::rooted_tree, tree_type>,
71std::pair<node, node> retrieve_centroid(
73 const uint32_t N,
const uint32_t n,
const node x,
74 std::vector<std::vector<std::pair<node,uint32_t>>>& L,
75 std::vector<std::pair<edge, uint32_t>>& sizes_edge
82 typedef std::pair<edge,uint32_t> edge_size;
83 typedef std::vector<edge_size>::iterator Iterator_Type;
87 sizes_edge.resize(2*(n - 1));
88 auto it = sizes_edge.begin();
89 internal::calculate_bidirectional_sizes
93 internal::counting_sort<edge_size, Iterator_Type, countingsort::decreasing_t>
95 sizes_edge.begin(), sizes_edge.end(), n, sizes_edge.size(),
96 [](
const edge_size&
edge_pair) ->
size_t { return edge_pair.second; }
104 for (
const auto& [uv, suv] : sizes_edge) {
105 const auto [u, v] = uv;
106 L[u].push_back(std::make_pair(v,suv));
114 const auto& [v, suv] = L[u][0];
115 u = (suv > n/2 ? v : u);
127 for (
const auto& p : L[c1]) {
128 const node v = p.first;
129 if (L[v][0].second <= n/2) {
135 return (c1 < c2 ? std::make_pair(c1, c2) : std::make_pair(c2, c1));
173 std::is_base_of_v<graphs::free_tree, T> ||
174 std::is_base_of_v<graphs::rooted_tree, T>,
177std::pair<node, node> retrieve_centroid(
178 const T& t,
const node x,
179 std::vector<std::vector<std::pair<node,uint32_t>>>& L,
180 std::vector<std::pair<edge, uint32_t>>& sizes_edge
184 const uint32_t component_size = t.get_num_nodes();
186 const uint32_t n = t.get_num_nodes_component(x);
189 return std::make_pair(x, component_size+1);
192 return __lal::retrieve_centroid(t, component_size, n, x, L, sizes_edge);
204 std::is_base_of_v<graphs::free_tree, T> ||
205 std::is_base_of_v<graphs::rooted_tree, T>,
208std::pair<node, node> retrieve_centroid(
const T& t,
const node x) {
209 std::vector<std::vector<std::pair<node,uint32_t>>> M;
210 std::vector<std::pair<edge, uint32_t>> sizes_edge;
211 return retrieve_centroid(t, x, M, sizes_edge);
242 std::is_base_of_v<graphs::free_tree, T> ||
243 std::is_base_of_v<graphs::rooted_tree, T>,
246std::pair<node, node> retrieve_centroid(
248 std::vector<std::vector<std::pair<node,uint32_t>>>& L,
249 std::vector<std::pair<edge, uint32_t>>& sizes_edge
253 const uint32_t n = t.get_num_nodes();
256 return std::make_pair(0, n+1);
259 return __lal::retrieve_centroid(t, n, n, 0, L, sizes_edge);
271 std::is_base_of_v<graphs::free_tree, T> ||
272 std::is_base_of_v<graphs::rooted_tree, T>,
275std::pair<node, node> retrieve_centroid(
const T& t) {
276 std::vector<std::vector<std::pair<node,uint32_t>>> L;
277 std::vector<std::pair<edge, uint32_t>> sizes_edge;
278 return retrieve_centroid(t, L, sizes_edge);
tree_type
Enumeration of several types of trees.
Definition tree_type.hpp:55
Main namespace of the library.
Definition definitions.hpp:48
std::pair< edge, edge > edge_pair
Edge pair type.
Definition definitions.hpp:77
uint32_t node
Node type.
Definition definitions.hpp:51