37# include <gtest/gtest.h>
53 const Array<std::pair<size_t, size_t>> & edges)
57 for (
size_t i = 0; i < n; ++i)
60 for (
size_t i = 0; i < edges.size(); ++i)
62 const size_t u = edges[i].first;
63 const size_t v = edges[i].second;
69 for (
size_t src = 0; src < n; ++src)
72 for (
size_t i = 0; i < n; ++i)
73 dist(i) = std::numeric_limits<size_t>::max();
79 for (
size_t head = 0; head < q.
size(); ++head)
81 const size_t u = q[head];
82 for (
size_t j = 0; j < adj[u].
size(); ++j)
84 const size_t v = adj[u][j];
85 if (dist[v] != std::numeric_limits<size_t>::max())
87 dist(v) = dist[u] + 1;
93 for (
size_t i = 0; i < n; ++i)
107 for (
size_t i = 0; i < n; ++i)
109 for (
size_t i = 0; i + 1 < n; ++i)
119 for (
size_t i = 0; i < n; ++i)
121 for (
size_t i = 1; i < n; ++i)
140 [](
auto *) ->
size_t {
return 1; },
141 [](
auto *,
const size_t & a,
auto *,
const size_t & c) ->
size_t {
145 for (
size_t i = 0; i < 5; ++i)
147 <<
"Subtree of node " << i;
156 [](
auto *) ->
size_t {
return 1; },
157 [](
auto *,
const size_t & a,
auto *,
const size_t & c) ->
size_t {
162 for (
size_t i = 1; i < 5; ++i)
192 [](
auto *) ->
size_t {
return 0; },
193 [](
const size_t & a,
const size_t & b) ->
size_t {
194 return std::max(a, b);
196 [](
auto *,
auto *,
const size_t & v) ->
size_t {
return v + 1; });
212 [](
auto *) ->
size_t {
return 0; },
213 [](
const size_t & a,
const size_t & b) ->
size_t {
214 return std::max(a, b);
216 [](
auto *,
auto *,
const size_t & v) ->
size_t {
return v + 1; });
219 for (
size_t i = 1; i < 5; ++i)
237 using P = std::pair<size_t, size_t>;
240 [](
auto *) ->
P {
return {1, 0}; },
241 [](
const P & a,
const P & b) ->
P {
242 return {a.first + b.first, a.second + b.second};
244 [](
auto *,
auto *,
const P & v) ->
P {
245 return {v.first, v.second + v.first};
305 [](
auto *) ->
size_t {
return 1; },
306 [](
auto *,
const size_t & a,
auto *,
const size_t & c) ->
size_t {
334 [](
auto *) ->
size_t {
return 1; },
335 [](
auto *,
const size_t & a,
auto *,
const size_t & c) ->
size_t {
348 std::mt19937
rng(20260226);
352 const size_t n = 2 +
rng() % 40;
355 for (
size_t i = 0; i < n; ++i)
360 for (
size_t i = 1; i < n; ++i)
362 const size_t p =
static_cast<size_t>(
rng() % i);
364 edges.
append(std::make_pair(p, i));
371 [](
auto *) ->
size_t {
return 1; },
372 [](
auto *,
const size_t & a,
auto *,
const size_t & c) ->
size_t {
376 for (
size_t i = 0; i < n; ++i)
380 <<
"trial=" <<
trial <<
" node=" << i;
Generic tree DP and rerooting DP on Aleph graph trees.
Simple dynamic array with automatic resizing and functional operations.
static Array create(size_t n)
Create an array with n logical elements.
constexpr size_t size() const noexcept
Return the number of elements stored in the stack.
T & append(const T &data)
Append a copy of data
void reserve(size_t cap)
Reserves cap cells into the array.
Rerooting DP: O(n) computation of DP answer for all roots.
Generic bottom-up tree DP.
size_t id_of(Node *node) const
Returns the internal ID for a given node pointer.
Graph implemented with double-linked adjacency lists.
virtual Node * insert_node(Node *node) noexcept
Insertion of a node already allocated.
Arc * insert_arc(Node *src_node, Node *tgt_node, void *a)
DynArray< Graph::Node * > nodes
Main namespace for Aleph-w library functions.
Array< size_t > tree_subtree_sizes(const GT &g, typename GT::Node *root, SA sa=SA())
Compute subtree sizes for every node.
Divide_Conquer_DP_Result< Cost > divide_and_conquer_partition_dp(const size_t groups, const size_t n, Transition_Cost_Fn transition_cost, const Cost inf=dp_optimization_detail::default_inf< Cost >())
Optimize partition DP using divide-and-conquer optimization.
Array< size_t > tree_max_distance(const GT &g, typename GT::Node *root, SA sa=SA())
Compute the maximum distance from each node to any leaf.
Array< size_t > tree_sum_of_distances(const GT &g, typename GT::Node *root, SA sa=SA())
Compute sum of distances from each node to all others.
T sum(const Container &container, const T &init=T{})
Compute sum of all elements.
Arc of graph implemented with double-linked adjacency lists.
static G build_star(size_t n, Array< G::Node * > &nodes)
static G build_path(size_t n, Array< G::Node * > &nodes)