这是蒟蒻构建点分树的代码,但是WA了,求调
#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
void read(int &x){
x=0;
int f=1;
char c=getchar();
while(!('0'<=c && c<='9')){
if(c=='-'){
f=-1;
}
c=getchar();
}
while('0'<=c && c<='9'){
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
x*=f;
}
struct Edge{
int to,nxt;
Edge(){}
Edge(int t,int nx){
to=t;
nxt=nx;
}
} e[200010];
int hs[100010],tot=-1,n,m,res=0,rt=-1,cursiz,rtsiz=-2e9,dfn=0;
int siz[100010],fa[100010];
bool isdiv[100010]={0};
void add(int u,int v){
e[++tot]=Edge(v,hs[u]);
hs[u]=tot;
}
int getrt(int k,int f){
siz[k]=1;
int mxn=-2e9;
for(int i=hs[k];~i;i=e[i].nxt){
if(!isdiv[e[i].to] && e[i].to!=f){
mxn=max(mxn,getrt(e[i].to,k));
siz[k]+=siz[e[i].to];
}
}
mxn=max(mxn,cursiz-siz[k]);
if(!~rt || mxn<rtsiz){
rtsiz=mxn;
rt=k;
}
return siz[k];
}
void divide(int k){
//printf("%lld\n",k);
isdiv[k]=true;
for(int i=hs[k];~i;i=e[i].nxt){
if(!isdiv[e[i].to]){
cursiz=siz[e[i].to];
rt=-1;
rtsiz=-2e9;
getrt(e[i].to,0);
fa[rt]=k;
divide(rt);
}
}
}
signed main(){
int u,v;
memset(hs,-1,sizeof(hs));
read(n);
for(int i=1;i<n;i++){
read(u);
read(v);
add(u,v);
add(v,u);
}
cursiz=n;
getrt(1,0);
fa[rt]=-1;
divide(rt);
for(int i=1;i<=n;i++){
printf("%lld ",fa[i]);
}
return 0;
}