# include <iostream>
# include <iomanip>
# include <array>
{
std::cout << "\n=== Tree DP / Rerooting DP ===\n\n";
auto n0 = g.insert_node(0);
auto n1 = g.insert_node(1);
auto n2 = g.insert_node(2);
auto n3 = g.insert_node(3);
auto n4 = g.insert_node(4);
auto n5 = g.insert_node(5);
g.insert_arc(n0, n1, 1);
g.insert_arc(n0, n2, 1);
g.insert_arc(n1, n3, 1);
g.insert_arc(n1, n4, 1);
g.insert_arc(n2, n5, 1);
std::array<G::Node *, 6>
nodes = {n0, n1, n2, n3, n4, n5};
std::cout << "Tree (root=0):\n";
std::cout << " 0\n";
std::cout << " / \\\n";
std::cout << " 1 2\n";
std::cout << " / \\ \\\n";
std::cout << " 3 4 5\n\n";
const auto max_dist = tree_max_distance(g, n0);
const auto sum_dist = tree_sum_of_distances(g, n0);
const auto subtree_sizes = tree_subtree_sizes(g, n0);
[](auto *) -> size_t { return 1; },
[](auto *, const size_t & a, auto *, const size_t & c) -> size_t {
return a + c;
});
[](auto * p) -> int { return p->get_info(); },
[](auto *, const int & acc, auto *, const int & child) -> int {
return acc + child;
});
std::cout << "Per-node metrics:\n";
print_rule();
std::cout << std::left
<< std::setw(8) << "Node"
<< std::setw(16) << "Subtree size"
<< std::setw(16) << "Max distance"
<< std::setw(18) << "Sum distances"
<< std::setw(18) << "Subtree value sum"
<< "\n";
print_rule();
for (
size_t i = 0; i <
nodes.size(); ++i)
{
const size_t id = id_map.id_of(
nodes[i]);
std::cout << std::left
<< std::setw(8) << i
<< std::setw(16) << subtree_sizes[id]
<< std::setw(16) << max_dist[id]
<< std::setw(18) << sum_dist[id]
<< "\n";
}
print_rule();
std::cout << "\nDone.\n";
return 0;
}
Generic tree DP and rerooting DP on Aleph graph trees.
Generic bottom-up tree DP.
const T & value(Node *node) const
Returns the DP value for a given node.
Graph implemented with double-linked adjacency lists.
List_Graph< Graph_Node< string >, Graph_Arc< Empty_Class > > G
DynArray< Graph::Node * > nodes
Main namespace for Aleph-w library functions.
Arc of graph implemented with double-linked adjacency lists.