我在统计答案的时候是这样写的:
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] 是对的。
知道的话,请 @ 我。