码迷,mamicode.com
首页 > 其他好文 > 详细

【模板】树链剖分

时间:2018-10-10 17:52:35      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:==   模板   span   efi   strong   nbsp   dfs   family   深度   

 

使用方法:

  • 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;
}

  

 

【模板】树链剖分

标签:==   模板   span   efi   strong   nbsp   dfs   family   深度   

原文地址:https://www.cnblogs.com/akakw1/p/9767893.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!