树上问题基础模板

时间:2021-08-21
本文章向大家介绍树上问题基础模板,主要包括树上问题基础模板使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

LCA板子:

void init()
{
    for(int i=1;i<=n;i++) ejz[i]=ejz[i-1]+(1<<ejz[i-1]==i);
}
void get_fa(int root,int fa)
{
    f[root][0]=fa;
    dep[root]=dep[fa]+1;
    for(int i=1;i<=ejz[dep[root]];i++)
    {
        f[root][i]=f[f[root][i-1]][i-1];
    }
    for(int i=head[root];~i;i=edge[i].next)
    {
        if(edge[i].to!=fa) get_fa(edge[i].to,root);
    }
}
int lca(int x,int y)
{
    if(dep[x]<dep[y]) swap(x,y);
    while(dep[x]>dep[y])
    {
        x=f[x][ejz[dep[x]-dep[y]]-1];
    }
    if(x==y) return x;
    for(int k=ejz[dep[x]]-1;k>=0;k--)
    {
        if(f[x][k]!=f[y][k])
        {
            x=f[x][k],y=f[y][k];
        }
    }
    return f[x][0];
}

树上以 \(root\) 为根的子树权值和

void dfs(int root,int fa)
{
    for(int i=head[root];~i;i=edge[i].next)
    {
        if(edge[i].to==fa) continue;
        dfs(edge[i].to,root);
        power[root]+=power[edge[i].to];
    }
}

树根到某点的权值和

ll vis[maxn],qzh[maxn];
void clear()
{
    vis[1]=1;
}
void dfs2(ll u)
{
    for(ll i=head[u];i!=0;i=edge[i].next)
    {
        if(vis[edge[i].to]==0)
        {
            vis[edge[i].to]=1;
            qzh[edge[i].to]=edge[i].dq+qzh[u];
            dfs2(edge[i].to);
        }
    }
}

原文地址:https://www.cnblogs.com/blogbyWHY/p/15170492.html