模板树链剖分

Posted akakw1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板树链剖分相关的知识,希望对你有一定的参考价值。

 

使用方法:

  • sz(size)储存子树大小
  • dp(deep)储存节点深度
  • fa(father)储存节点父亲
  • hs(heavy son)储存节点重儿子
  • hf储存当前节点所在链的顶端节点
  • id储存节点编号
  • nd(node)储存当前编号对应的节点
namespace tree {
#define MAXN 100001
	int sz[MAXN], dp[MAXN], fa[MAXN];
	int hs[MAXN] = {0};
	void dfs1(int x, int f, int dep) {
		dp[x] = dep, fa[x] = f, sz[x] = 1;
		int hsz = 0;
		for(int i = head[x]; i; i = nxt[i]) {
			if(ver[i] == f)continue;
			dfs1(ver[i], x, dep + 1);
			sz[x] += sz[ver[i]];
			if(sz[ver[i]] > hsz) {
				hsz = sz[ver[i]];
				hs[x] = ver[i];
			}
		}
	}
	int hf[MAXN], id[MAXN], nd[MAXN];
	int cnt = 0;
	void dfs2(int x, int hfa) {
		hf[x] = hfa, id[x] = ++ cnt, nd[cnt] = x;
		if(hs[x])dfs2(hs[x], hfa);
		for(int i = head[x]; i; i = nxt[i])
			if(ver[i] != hs[x] && ver[i] != fa[x])
				dfs2(ver[i], ver[i]);
	}
#undef MAXN
}

  

储存方法:链式前向星

int head[100001] = {0}, nxt[200001], ver[200001], tot = 0;
void add(int x, int y) {
    ver[++ tot] = y, nxt[tot] = head[x], head[x] = tot;
    ver[++ tot] = x, nxt[tot] = head[y], head[y] = tot;
}

  

 

以上是关于模板树链剖分的主要内容,如果未能解决你的问题,请参考以下文章

模板时间◆模板·II◆ 树链剖分

树链剖分模板题(luogu3384 模板树链剖分)

树链剖分模板

BZOJ 2243--染色(树链剖分)

模板树链剖分

luoguP3384 模板树链剖分