3#include <pixie/louds_tree.h>
11std::vector<std::vector<size_t>> generate_random_tree(
size_t tree_size,
12 std::mt19937_64& rng) {
16 std::vector<std::vector<size_t>> adj(tree_size);
18 for (
size_t i = 1; i < tree_size; i++) {
19 size_t parent = rng() % i;
20 adj[i].push_back(parent);
21 adj[parent].push_back(i);
26std::vector<std::vector<size_t>> bfs_order(
28 const std::vector<std::vector<size_t>>& adj) {
29 std::vector<std::vector<size_t>> bfs_adj(tree_size);
30 std::queue<std::pair<size_t, size_t>> q;
31 bfs_adj[0].push_back(0);
35 size_t old_v = q.front().first;
36 size_t cur_v = q.front().second;
38 for (
size_t i = 1; i < adj[old_v].size(); i++) {
39 size_t old_u = adj[old_v][i];
41 q.push({old_u, cur_u});
42 bfs_adj[cur_u].push_back(cur_v);
43 bfs_adj[cur_v].push_back(cur_u);
49std::vector<uint64_t> adj_to_louds(
51 const std::vector<std::vector<size_t>>& adj) {
52 size_t louds_size = tree_size * 2 - 1;
53 std::vector<uint64_t> louds((louds_size + 63) / 64, 0);
55 for (
size_t i = 0; i < tree_size; i++) {
56 louds[pos >> 6] = louds[pos >> 6] | (1ULL << (pos & 63));
67 return a.number == b.number;
71 return a.number == b.number;
76 std::vector<std::vector<size_t>> adj;
82 explicit AdjListTree(
const std::vector<std::vector<size_t>>& adjacency_list)
83 : adj(adjacency_list) {}
94 return adj[node.number].size() <= 1;
106 return adj[node.number].size() - 1;
136 size_t p =
parent(node).number;
137 return adj[p].back() == node.number;
size_t degree(const AdjListNode &node) const
Returns the number of children of node.
Definition utils.h:105
AdjListTree(const std::vector< std::vector< size_t > > &adjacency_list)
Constructor from adjacency list (root is 0)
Definition utils.h:82
AdjListNode next_sibling(const AdjListNode &node) const
Returns next sibling of a node.
Definition utils.h:143
AdjListNode first_child(const AdjListNode &node) const
Returns the first child of node.
Definition utils.h:120
AdjListNode parent(const AdjListNode &node) const
Returns the parent of a node if node is not root, else returns root.
Definition utils.h:128
AdjListNode root() const
Returns the root node.
Definition utils.h:88
AdjListNode child(const AdjListNode &node, size_t i) const
Returns the i-th child of node Indexing starts at 0.
Definition utils.h:113
bool is_root(const AdjListNode &node) const
Checks if node is a root.
Definition utils.h:100
bool is_leaf(const AdjListNode &node) const
Checks if node is a leaf.
Definition utils.h:93
bool is_last_child(const AdjListNode &node) const
Indicates if node is last child.
Definition utils.h:135
A node class of LOUDS tree.
Definition louds_tree.h:13