src/watashi/chain-decomp.hpp
Code
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXM = 16;
const int MAXN = 1 << MAXM;
// Heavy-Light Decomposition
struct TreeDecomposition {
vector<int> e[MAXN], c[MAXN];
int s[MAXN]; // subtree size
int p[MAXN]; // parent id
int r[MAXN]; // chain root id
int t[MAXN]; // timestamp, index used in segtree
int ts;
void dfs_(int v, int f) {
p[v] = f;
s[v] = 1;
for (int i = 0; i < (int)e[v].size(); ++i) {
int w = e[v][i];
if (w != f) {
dfs_(w, v);
s[v] += s[w];
}
}
}
void decomp_(int v, int f, int k) {
t[v] = ts++;
c[k].push_back(v);
r[v] = k;
int x = 0, y = -1;
for (int i = 0; i < (int)e[v].size(); ++i) {
int w = e[v][i];
if (w != f) {
if (s[w] > x) {
x = s[w];
y = w;
}
}
}
if (y != -1) {
decomp_(y, v, k);
}
for (int i = 0; i < (int)e[v].size(); ++i) {
int w = e[v][i];
if (w != f && w != y) {
decomp_(w, v, w);
}
}
}
void init(int n) {
for (int i = 0; i < n; ++i) {
e[i].clear();
}
}
void add(int a, int b) {
e[a].push_back(b);
e[b].push_back(a);
}
void build() { // !!
ts = 0;
dfs_(0, 0);
decomp_(0, 0, 0);
}
} hld;
#line 1 "src/watashi/chain-decomp.hpp"
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXM = 16;
const int MAXN = 1 << MAXM;
// Heavy-Light Decomposition
struct TreeDecomposition {
vector<int> e[MAXN], c[MAXN];
int s[MAXN]; // subtree size
int p[MAXN]; // parent id
int r[MAXN]; // chain root id
int t[MAXN]; // timestamp, index used in segtree
int ts;
void dfs_(int v, int f) {
p[v] = f;
s[v] = 1;
for (int i = 0; i < (int)e[v].size(); ++i) {
int w = e[v][i];
if (w != f) {
dfs_(w, v);
s[v] += s[w];
}
}
}
void decomp_(int v, int f, int k) {
t[v] = ts++;
c[k].push_back(v);
r[v] = k;
int x = 0, y = -1;
for (int i = 0; i < (int)e[v].size(); ++i) {
int w = e[v][i];
if (w != f) {
if (s[w] > x) {
x = s[w];
y = w;
}
}
}
if (y != -1) {
decomp_(y, v, k);
}
for (int i = 0; i < (int)e[v].size(); ++i) {
int w = e[v][i];
if (w != f && w != y) {
decomp_(w, v, w);
}
}
}
void init(int n) {
for (int i = 0; i < n; ++i) {
e[i].clear();
}
}
void add(int a, int b) {
e[a].push_back(b);
e[b].push_back(a);
}
void build() { // !!
ts = 0;
dfs_(0, 0);
decomp_(0, 0, 0);
}
} hld;
Back to top page