当前位置: 首页 > news >正文

Top Tree大学习

前言

\(Top Tree\) 用来解决 路径查询,动态 \(dp\) 等问题。
信息储存在 中。

簇(\(Cluster\)

树上一个边联通块,可以收缩成一条边,我们成这样的联通子图为
簇上的某些点与其它簇相接,我们称其为簇的 端点
被完全包含在簇中的点,我们称之为 内点
边联通块的边称为 内边

  1. 簇只维护内点和内边的信息。
  2. 簇只有两个端点,两个端点间路径称为 簇路径

对于一棵树,每条边都独立为一个簇,我们称之为 基簇

树收缩

树收缩是 \(Top Tree\) 的核心操作。

\(compress(v)\) 是选择一个度数为 \(2\) 的点 \(v\),将 \(v\)的两条边合并。
\(rake(v)\) 是选择一个度数为 \(1\) 的点 \(v\),将 \(v\) 的边与另一条邻边合并。

最终我们将整棵树收缩为一个簇,我们称之为 根簇

\(Top Tree\)

我们用 \(compress,rake\) 两种操作形成根簇的过程建成一棵 \(Leafy Tree\)
并标记是由哪种操作合并的,以便于对应上传信息。
现在问题在如何高效维护信息,即保证树的高度。

重量平衡静态 \(Top Tree\)

对原树进行重链剖分,将轻儿子 \(rake\) 到重链上,对于剩下的重链 \(compress\) 起来。
我们采用分治 \(rake\)\(compress\) 来平衡深度。
类似全局平衡二叉树的,每次选择带权重心当根递归建树。

\(rake,compress\) 操作至少会有 \(O(\log n)\) 的深度,而非必须的上传会使大小翻倍同样为 \(O(\log n)\),故最多应为 \(3 \log n\),但实际应为 \(2 \log n\),但我不会分析。

参考实现:

IL void pu(int p){cl[p]=(ty[p]?rake:compress)(cl[ls[p]],cl[rs[p]]);}
IL int Link(int x,int y,int k){int p=++cntn;fa[ls[p]=x]=fa[rs[p]=y]=p,ty[p]=k;return pu(p),p;}
int Dac(vector<int> &a,int l,int r,int op){if(l==r)return a[l];int mid=r-1,now=0,sum=0;rpt(i,l,r)sum+=cl[a[i]].siz;rpt(i,l,r-1){now+=cl[a[i]].siz;if(now*2>sum){mid=i;break;}}return Link(Dac(a,l,mid,op),Dac(a,mid+1,r,op),op);
}
void dfs(int u,int pre){siz[u]=1,son[u]=0;for(auto v:e[u])if(v!=pre){dfs(v,u),siz[u]+=siz[v],id[v]=nlf(a[v]);if(siz[v]>siz[son[u]])son[u]=v;}
}
int build(int u,int pre){vector<int> H;if(id[u])H.pb(id[u]);for(;son[u];pre=u,u=son[u]){vector<int> L;for(auto v:e[u])if(v!=pre&&v!=son[u])L.pb(build(v,u));if(L.empty())H.pb(id[son[u]]);else H.pb(Link(id[son[u]],Dac(L,0,L.size()-1,1),1));}return Dac(H,0,H.size()-1,0);
}

例题:

最大带权独立集
对于信息的维护,我们需要考虑两种合并的转移方式。
如维护两个端点的距离,我们有 \(dis{rake(u,v)}=dis_u,dis_{empress(u,v)}=dis_u + dis_v\)

参考实现:

struct info{int f[2][2];info(){rpt(x,0,1)rpt(y,0,1)f[x][y]=-inf;}info(const int &w){f[0][0]=0,f[0][1]=w,f[1][0]=0,f[1][1]=-inf;}IL int gmx()const{int mx=0;rpt(x,0,1)rpt(y,0,1)mx=max(mx,f[x][y]);return mx;}
};
struct clst{info v;int siz;clst():v(info()),siz(0){}clst(const int &w):v(info(w)),siz(1){}
};
IL clst rake(const clst &f,const clst &g){clst h; h.siz=f.siz+g.siz;rpt(x,0,1)rpt(y,0,1)rpt(z,0,1)if(f.v.f[x][y]!=-inf&&g.v.f[x][z]!=-inf)mxup(h.v.f[x][y],f.v.f[x][y]+g.v.f[x][z]);return h;
}
IL clst compress(const clst &f,const clst &g){clst h; h.siz=f.siz+g.siz;rpt(x,0,1)rpt(y,0,1)rpt(z,0,1)if(f.v.f[x][z]!=-inf&&g.v.f[z][y]!=-inf)mxup(h.v.f[x][y],f.v.f[x][z]+g.v.f[z][y]);return h;
}
http://www.gsyq.cn/news/33189.html

相关文章:

  • EVE-NG导入华为等镜像的方法
  • 2025 云斗
  • c++ ranges随笔
  • P10259 [COCI 2023/2024 #5] Piratski kod
  • 软考复习总结
  • ? #6
  • 集训做题杂记1 - -MornStar
  • 2019 福建省队集训录
  • 实验二 现代C++编程初体验
  • ZKY精选冲刺省选国赛仿真训练题
  • MySQL 查询与更新语句执行过程深度解析:从原理到实践​ - 指南
  • ZKY精选冲刺省选国赛技巧训练题
  • 价值流智能时代:DevOps平台如何成为企业高效交付的核心引擎? - 教程
  • 2025年压力容器品牌综合实力排行榜
  • AI Agent 从零到百万价值迭代之路 - 智慧园区
  • 科幻——面包
  • 10.28代码大全2
  • 别再空谈企业架构!TOGAF的4A模型让你的技术投入至少省50%!
  • 1662
  • 基于PSO粒子群优化算法的64QAM星座图的最优概率整形matlab仿真,对比PSO优化前后整形星座图和误码率
  • C++primer 类的静态成员
  • 2025 年最佳AI智能企业知识管理工具推荐
  • 移动端性能监控探索:可观测 Android 采集探针架构与实现
  • 2025年建站AI工具TOP10盘点:从ChatGPT到Lynx的智能革命
  • CompleteMaintenance点检提交反复超时,日志显示执行中断
  • 为何AI反诈骗防护比以往任何时候都更重要
  • MySQL 数据加密整改文档(TDE + 字段加密 + 密码哈希)
  • KeyShot许可分析软件推荐
  • 2025年U型科氏质量流量计最新推荐榜:微弯型科氏质量流量计/直管型科氏质量流量计/科氏质量流量计助力产业智能化升级
  • 收藏版:Phinx 数据库迁移完全指南