树的三度化
三度化
简介
使用效果
将带权树,在不改变任意两点间距离的情况下,转化成带权二叉树
实现方式
考虑在每条边 \((u,v,w)\) 中插入一个点 \(x\),连接\((u,x,0),(x,v,w)\)然后x继承u剩余的边处理
代码:
int num=0, id[_];
#define fi first
#define se second
#define mp make_pair
vector<pair<int,int> >vc[_];
in void build(int x)
{
id[x]=++num;
int now=id[x];
for(auto v:vc[x])
{
if(id[v.fi]) continue;
++num;
add(now,num,0); now=num;
add(now,num+1,v.se);
build(v.fi);
}
}
int main()
{
n=read();
for(re int i=1;i<n;++i)
{
int x=read(), y=read(), w=read();
vc[y].pb(mp(x,w)), vc[x].pb(mp(y,w));
}
build(1);
}
用途
常见使用思路
优化复杂度与度数相关的算法
套路:
- 换根时的树上背包合并
- 边分治
嗯,就这样了...