跳转至

长链剖分

#include<bits/stdc++.h>
#define Maxn 1000000
#define Maxm 2000000
using namespace std;
int head[Maxn+5],to[Maxm+5],nex[Maxm+5],tot;
int len[Maxn+5],son[Maxn+5];
int buf[2*Maxn+5],*dp[Maxn+5],*p;
int ans[Maxn+5];
void init()
{
    memset(head,-1,sizeof(head));
    tot=0;
}
void add(int x,int y)
{
    to[++tot]=y;
    nex[tot]=head[x];
    head[x]=tot;
}
void dfs1(int x,int f)
{
    len[x]=1;
    for(int i=head[x];i!=-1;i=nex[i])
    {
        if(to[i]==f) continue;
        dfs1(to[i],x);
        if(len[to[i]]>len[son[x]]) son[x]=to[i];
    }
    len[x]=len[son[x]]+1;
}
void dfs2(int x,int f)
{
    dp[x][0]=1;
    if(son[x])
    {
        dp[son[x]]=dp[x]+1;
        dfs2(son[x],x);
        ans[x]=ans[son[x]]+1;
    }
    for(int i=head[x];i!=-1;i=nex[i])
    {
        if(to[i]==f||to[i]==son[x]) continue;
        dp[to[i]]=p;
        p+=len[to[i]];
        dfs2(to[i],x);
        for(int j=0;j<len[to[i]];j++)
        {
            dp[x][j+1]+=dp[to[i]][j];
            if(dp[x][j+1]>dp[x][ans[x]]||(dp[x][j+1]==dp[x][ans[x]]&&j+1<ans[x])) ans[x]=j+1;
        }
    }
    if(dp[x][ans[x]]==1) ans[x]=0;
}
int main()
{
    init();
    int n;
    scanf("%d",&n);
    for(int i=1;i<n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        add(x,y);
        add(y,x);
    }
    dfs1(1,0);
    p=buf;
    dp[1]=p;
    p+=len[1];
    dfs2(1,0);
    for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
    return 0;
}