在第一遍初始化最近叶子的距离时,可能会写下这样的代码:
void dfs1(int x,int fa){
if(deg[x]==1)g[x]=0;
else{
g[x]=1e9;
for(auto y:G[x]){
if(y==fa)continue;
dfs1(y,x);
g[x]=min(g[x],g[y]+1);
}
}
val[x]=2-deg[x];
return;
}
这样写是错误的,可能会有 1 号节点度数为 1 的可能,这样所有的节点都不会初始化。所以要写成这样:
void dfs1(int x,int fa){
if(deg[x]==1)g[x]=0;
else g[x]=1e9;
for(auto y:G[x]){
if(y==fa)continue;
dfs1(y,x);
g[x]=min(g[x],g[y]+1);
}
val[x]=2-deg[x];
return;
}
树状数组空间也要记得开大。所有的 dfs 函数都要判断下一个点是否是曾经的分治点