树的三度化

三度化

简介

使用效果

将带权树,在不改变任意两点间距离的情况下,转化成带权二叉树

实现方式

考虑在每条边 \((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);
}

用途

常见使用思路

优化复杂度与度数相关的算法
套路:

  1. 换根时的树上背包合并
  2. 边分治
posted @ 2022-03-13 11:30  yzhx  阅读(34)  评论(1编辑  收藏  举报