首页 > 其他分享 >树链剖分

树链剖分

时间:2022-10-28 11:45:35浏览次数:41  
标签:剖分 dep siz top 树链 int dfn son

剖分过程

void dfs1(int u)
{
	son[u] = -1;
	siz[u] = 1;
	for (int i = hd[u]; i; i = g[i].nxt)
	{
		int v = g[i].to;
		if (!dep[v])
		{
			dep[v] = dep[u] + 1;
			fa[v] = u;
			dfs1(v);
			siz[u] += siz[v];
			if (son[u] == -1 || siz[v] > siz[son[u]])
				son[u] = v;
		}
	}
	return;
}
void dfs2(int u, int t)
{
	top[u] = t;
	dfcnt++;
	dfn[u] = dfcnt;
	rdfn[dfcnt] = u;
	if (son[u] == -1)
		return;
	dfs2(son[u], t);
	for (int i = hd[u]; i; i = g[i].nxt)
	{
		int v = g[i].to;
		if (v != son[u] && v != fa[u])
			dfs2(v, v);
	}
	return;
}

跳链过程

更新

{
    while (top[x] != top[y])
	{
		if (dep[top[x]] < dep[top[y]])
			swap(x, y);
		update(1, 1, n, dfn[top[x]], dfn[x], z);
		x = fa[top[x]];
	}
	if (dep[x] > dep[y])
		swap(x, y);
	update(1, 1, n, dfn[x], dfn[y], z);
}

 求和

{
    ll ans = 0;
	while (top[x] != top[y])
	{
		if (dep[top[x]] < dep[top[y]])
			swap(x, y);
		ans += query(1, 1, n, dfn[top[x]], dfn[x]);
		x = fa[top[x]];
	}
	if (dep[x] > dep[y])
		swap(x, y);
	ans += query(1, 1, n, dfn[x], dfn[y]);
}

 

标签:剖分,dep,siz,top,树链,int,dfn,son
From: https://www.cnblogs.com/xqk0225/p/16835285.html

相关文章

  • 【图论】长链剖分学习笔记
    参考文章1参考文章20x01:引入与重链剖分不同,长链剖分以子树深度最大的儿子作为重儿子,这里所述之深度是指子树内离它最远的叶子到它的距离。如图绿色部分就是长链。......
  • 【转载】毛毛虫剖分
    转载声明转载自关于毛毛虫剖分-一粒夸克定义一种由重链剖分推广而成的树上结点重标号方法,支持修改/查询一只毛毛虫的信息,并且可以对毛毛虫的身体和足分别修改/查询......
  • AcCoders 10477:【省选基础数据结构 树链剖分】【GDOI2016】疯狂动物城 题解
    算法:树链剖分,可持久化线段树。题目大意给定\(n\)个结点的一棵树,\(m\)次操作,操作有三种:将\(x\)至\(y\)最短路径上的所有点的权值加上\(delta\)。对于\(x\)至......
  • 长链剖分入门
    模拟赛考到了,但是完全不会。填个坑。P5903【模板】树上\(k\)级祖先#include<bits/stdc++.h>#defineempemplace_backusingnamespacestd;constintN=5e5+......
  • 长链剖分
    1:长链剖分的构造推荐先行学习重链剖分与重链剖分类似,我们设一个节点中深度最深的子节点为长节点,设该节点到长节点的边为重边,其他边为轻边然后我们把首尾相连的重边组成......
  • Luogu P6157 有趣的游戏(平衡树 + 树链剖分)
    有趣的游戏题目描述游戏在一棵大小为\(n\)的树上进行。其中每个点都有点权,第\(i\)个点的点权为\(w_i\)。每一次系统会给出一条链,小A可以从这条链上找出两个点权......
  • 浅谈树链剖分
    树链剖分是把一棵树分割成若干条链,以便于维护信息的一种方法,其中最常用的是重链剖分(HeavyPathDecomposition,重路径分解),所以一般提到树链剖分或树剖都是指重链剖分。除此......
  • 树链剖分学习笔记(未完)
    思想树链剖分用于将树分割成若干条链的形式,以维护树上路径的信息。具体来说,将整棵树剖分为若干条链,使它组合成线性结构,然后用其他的数据结构维护信息。重链剖分原理首......
  • P3384 【模板】轻重链剖分/树链剖分
    【模板】轻重链剖分/树链剖分题目描述如题,已知一棵包含\(N\)个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作:1xyz,表示将树从\(x\)到\(y\)结点......
  • 【luogu P6779】rla1rmdq(分块)(树链剖分)
    rla1rmdq题目链接:luoguP6779题目大意给你一个n个点的有根树,根给出,和一个值域在1~n的数组。然后m次操作,每次对于一个数组的区间l~r,把它们的值都变成格子树上父......