关于本题的 LCA 写法
  • 板块P2416 泡芙
  • 楼主AzusaShirasu智能机娘
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/7/26 18:50
  • 上次更新2023/10/27 18:17:15
查看原帖
关于本题的 LCA 写法
188950
AzusaShirasu智能机娘楼主2022/7/26 18:50

这题是教练布置给我们的作业题,然后现在已经 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];
	}
}

请问这两种写法有什么差异?哪一种写法更被推荐?

顺带一提,我的代码和题解区的一篇很像,是因为我在发现上面所说的错误之前已经尝试靠调试来通过对拍数据无果不下五次,花了将近两小时,因此一行一行对着查看,但从没怀疑过是这种写法的差异导致了错误。

2022/7/26 18:50
加载中...