这题是教练布置给我们的作业题,然后现在已经 AC 了。
这是我最开始的写法,在 dfs 的时候同时倍增处理,只能拿到 85 分:
void dfs2(int u,int fa){
p[u][0]=fa,d[u]=d[fa]+1;
for(int i=dcchead[u];i;i=dccnxt[i]){
int to=dccver[i];
if(to==fa)continue;
sum[to]+=sum[u],val[to]=val[u]+dcclen[i];
dfs2(to,u);
}
for(int i=1;i<=20;i++)p[u][i]=p[p[u][i-1]][i-1];
}
把倍增处理的部分移到了一个额外的 init 函数中,就能够通过这题。写法是这样的:
void dfs2(int u,int fa){
p[u][0]=fa,d[u]=d[fa]+1;
for(int i=dcchead[u];i;i=dccnxt[i]){
int to=dccver[i];
if(to==fa)continue;
sum[to]+=sum[u],val[to]=val[u]+dcclen[i];
dfs2(to,u);
}
}
void init(){
for(int i=1;i<=20;i++){
for(int u=1;u<=dcc_cnt;u++)p[u][i]=p[p[u][i-1]][i-1];
}
}
请问这两种写法有什么差异?哪一种写法更被推荐?
顺带一提,我的代码和题解区的一篇很像,是因为我在发现上面所说的错误之前已经尝试靠调试来通过对拍数据无果不下五次,花了将近两小时,因此一行一行对着查看,但从没怀疑过是这种写法的差异导致了错误。