summaryrefslogtreecommitdiff
path: root/graph/test/binary_lifting.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'graph/test/binary_lifting.cpp')
-rw-r--r--graph/test/binary_lifting.cpp54
1 files changed, 14 insertions, 40 deletions
diff --git a/graph/test/binary_lifting.cpp b/graph/test/binary_lifting.cpp
index e1cf7d2..05b903a 100644
--- a/graph/test/binary_lifting.cpp
+++ b/graph/test/binary_lifting.cpp
@@ -1,22 +1,8 @@
-#include <bits/stdc++.h>
-using namespace std;
-
+#include "util.cpp"
#include "../binary_lifting.cpp"
-mt19937 rd(0);
-
-void test(const vector<vector<int>> &old_adj, int root) {
- int n = old_adj.size();
- vector<int> perm(n);
- iota(perm.begin(), perm.end(), 0);
- ranges::shuffle(perm, rd);
- vector<vector<int>> adj(n);
- for (int i = 0; i < n; i++) {
- auto &a = adj[perm[i]] = old_adj[i];
- for (int &v: a) v = perm[v];
- ranges::shuffle(a, rd);
- }
- root = perm[root];
+void test(vector<vector<int>> &adj, int root) {
+ int n = adj.size();
vector<int> parent(n);
function<void(int,int)> dfs = [&](int u, int p) {
@@ -37,18 +23,17 @@ void test(const vector<vector<int>> &old_adj, int root) {
Lift lift(adj, root);
for (int i = 0; i < n; i++) assert(lift.depth(i) == depth(i));
- uniform_int_distribution<int> distrib(0, n-1);
for (int i = 0; i < 1000; i++) {
- int v = distrib(rd);
- int d = distrib(rd);
+ int v = util::randint(n);
+ int d = util::randint(n);
int u = lift.lift(v, d);
assert(is_ancestor(u, v));
if (d <= depth(v)) assert(depth(u) == d);
else assert(u == v);
}
for (int i = 0; i < 1000; i++) {
- int u = distrib(rd);
- int v = distrib(rd);
+ int u = util::randint(n);
+ int v = util::randint(n);
int lca = lift.lca(u, v);
assert(is_ancestor(lca, u));
assert(is_ancestor(lca, v));
@@ -67,27 +52,16 @@ int main() {
}
{
// Path
- vector<vector<int>> adj(100);
- for (int i = 1; i < 100; i++) {
- adj[i-1].push_back(i);
- adj[i].push_back(i-1);
- }
- test(adj, 0);
- test(adj, 99);
- test(adj, 40);
+ vector<vector<int>> adj = util::path(100);
+ int left = 0, mid = 40, right = 99;
+ util::shuffle_graph(adj, left, mid, right);
+ test(adj, left);
+ test(adj, mid);
+ test(adj, right);
}
{
// Random
- vector<vector<int>> adj(1000);
- for (int i = 1; i < 1000; i++) {
- uniform_int_distribution<int> distrib(0, i-1);
- int p = distrib(rd);
- adj[p].push_back(i);
- adj[i].push_back(p);
- }
+ vector<vector<int>> adj = util::random_tree(1000);
test(adj, 0);
- test(adj, 300);
- test(adj, 600);
- test(adj, 900);
}
}