AC 了,但是有疑惑
查看原帖
AC 了,但是有疑惑
1636464
my_dream666楼主2025/7/22 19:29

我在统计答案的时候是这样写的:

void dfs(int x,int before)
{
	size[x]=(x<=n?1:0);
	for(int i=he[x];i;i=ee[i].nex)
	{
		if(ee[i].data==before) continue;
		dfs(ee[i].data,x);
		ans[x]+=1ll*size[x]*size[ee[i].data]*w[x];
		size[x]+=size[ee[i].data];
	}
	ans[x]+=1ll*(num-size[x])*size[x]*w[x];
	ans[x]*=2;
}

但是我不明白为什么不减去1,,题目不是说 s,f,c 互不相等吗,如果减一的话会变成这样:

void dfs(int x,int before)
{
	size[x]=(x<=n?1:0);
	for(int i=he[x];i;i=ee[i].nex)
	{
		if(ee[i].data==before) continue;
		dfs(ee[i].data,x);
		ans[x]+=1ll*(size[x]-1)*size[ee[i].data]*w[x]; //
		size[x]+=size[ee[i].data];
	}
	ans[x]+=1ll*(num-size[x])*(size[x]-1)*w[x];//
	ans[x]*=2;
}

还有一点,就是给圆点赋值为 -1 是因为两个点 (s,f) 之间的路径点权和就是原图中 s,f,c 的个数, 但是像我的代码这样统计的话,是枚举 c ,将子树的大小相乘,与路径点权和无关,为什么给圆点赋值为 -1 并乘上 w[x] 是对的。 知道的话,请 @ 我。

2025/7/22 19:29
加载中...