树链剖分学习笔记

来源:互联网 发布:粤语翻译普通话软件 编辑:程序博客网 时间:2024/06/05 16:25

时常有一些在树上的问题,朴素的想法时间复杂度很大,于是我们常常会想能不能用什么数据结构把复杂度降下来,但是树的结构又很特殊,所以没有什么好的想法,而树链剖分就是一种很好的手段。

总的来讲树链剖分就是将一棵树剖成许多条链,然后连起来,用数据结构处理的过程,其中要记一些对应关系,方便处理。

首先要处理出重边,所谓重边就是一个节点所有子节点中子树的点数最大的哪个节点与本节点的边。而不是这样的边,就称为轻边。

这样就可以得到两个很重要的性质。
1、轻边(u,v)中,size(v)<=size(u/2)
2、从根到某一点的路径上,不超过logn条轻边和不超过logn条重路径。(这个是计算树链剖分复杂度的核心)

然后剖分的时候就是将树剖成许多重链连接起来,再用数据结构去维护。

剖分的代码主要有两部分

1、找重边

int top[N],dep[N],Rank[N],id[N],son[N],f[N],sz[N];//分别记录这条重链的顶点,每个点的深度,线段树上的这个点对应树上哪个点,树上的点对应线段树上哪个点,重儿子,父亲,子树大小int tot;//最后形成的链长度vector<int> G[N];//邻接表void init(int n){//初始化    tot = 0;    memset(son,-1,sizeof(son));    for(int i = 0;i <= n;i++) G[i].clear();}void dfs1(int u,int fa,int d){//求重边    dep[u] = d;//记录深度,父亲    f[u] = fa;    sz[u] = 1;    for(int i = 0;i < G[u].size();i++){        int v = G[u][i];        if(v == fa) continue;        dfs1(v,u,d + 1);//递归子树        sz[u] += sz[v];        if(son[u] == -1 || sz[son[u]] < sz[v]){            son[u] = v;//记录重边        }    }}

2、把重边练成链

void dfs2(int u,int tp){//剖分    top[u] = tp;//记录重链顶端的点    id[u] = ++tot;//u在线段树上的地方    Rank[id[u]] = u;//线段树上的地方对应的树上的地方    if(son[u] == -1) return;//没有重儿子,那么肯定是叶子节点    dfs2(son[u],tp);//对重儿子递归    for(int i = 0;i < G[u].size();i++){        int v = G[u][i];        if(v != son[u] && v != f[u])//不是重儿子的重开一条重链            dfs2(v,v);    }}

然后之后实现修改的时候(以hdu3966为例)

void change(int x,int y,int val){//将x到y的路径上的值改val    while(top[x] != top[y]){//如果不在同一条重链上,就按深度update,然后往同一条重链上靠        if(dep[top[x]] < dep[top[y]]) swap(x,y);        update(1,1,n,id[top[x]],id[x],val);        x = f[top[x]];    }    if(dep[x] > dep[y]) swap(x,y);    update(1, 1, n, id[x], id[y],val);}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 酷翼x9忘了密码怎么办 楼上的路由器楼下不好使怎么办 电信4g网络不好怎么办 农村只有2g网怎么办 电信卡4g网速慢怎么办 小米手机触屏失灵怎么办 荣耀v10电信网速很慢怎么办 华为路由器掉线了怎么办 三星s6只识别一张卡怎么办 华为手机卡不显示了怎么办 华为账号手机卡丢了怎么办 荣耀8耗电量太快怎么办 vivo卡2不显示怎么办 电信宽带玩王者荣耀卡怎么办 联通4g玩游戏卡怎么办 华为悦盒遥控器丢了怎么办 6s不能用电信卡怎么办 iphone6电信卡无服务怎么办 魅族手机电信卡怎么办 小米手机读不出sim卡怎么办 魅蓝note6耗电快怎么办 oppo手机下载密码忘了怎么办 华为v9玩飞车卡怎么办 苹果7耳机转换器不支持怎么办 华为mate10耳机声音小怎么办 200打一年到期了怎么办 手机欠费变成2g怎么办 手机4g网用不了怎么办 手机玩王者荣耀卡怎么办 华为隐私空间密码忘记了怎么办 华为手机王者太卡怎么办 华为手机太卡怎么办呢 华为手机5x太卡!怎么办 华为手机玩游戏时太卡了怎么办? 买到华为翻新机怎么办 华为畅享8声音小怎么办 华为5a安全模式怎么办 手机跳屏怎么办金立 苹果手机触控不灵敏怎么办 华为mate8手机声音小怎么办 华为mate9相机无法对焦怎么办