F - Distance Sums 2
题意:
求树上每个点到树上n个点的距离之和,边权值为1
题解:
ans为点i到所有节点距离之和,node为以i为根的子树的节点数量
选择节点1为根节点,跑一遍dfs求出1到所有点的距离之和
void dfs1(int u,int fa,int depth) {
ans[u]=depth;
node[u]=1;
for(auto v:g[u]) {
if(v==fa) continue;
dfs1(v,u,depth+1);
ans[u]+=ans[v];
node[u]+=node[v];
}
}
可以发现走到u的子节点v时,除了以v为根节点的子树上的节点外的所有点到v的距离比到u的距离多1,途径u走到v
v这颗子树到v的距离减1
ans[v]=ans[u]+n-2*node[v]