Leetcode 834. 树中距离之和
可以发现,当当前节点由上一个节点转移过来的时候
当前节点以及它的子节点对当前节点的距离和的贡献
相对上一个节点都减小了1
其余节点对这个点的贡献相对上一个节点的距离增加了1
于是当前节点的距离和就是上一个节点的距离和加上 n-son[cur]-2
class Solution {
public:
vector<int> ans;
vector<int> son;
vector<vector<int> > G;
int n;
int dfs1(int cur, int fa, int dis){
ans[0] += dis;
for(auto e: G[cur]){
if(e==fa)
continue;
son[cur] += dfs1(e, cur, dis+1);
}
return son[cur]+1;
}
void dfs2(int cur, int fa){
if(fa!=-1){
ans[cur] = ans[fa]-2*son[cur]+n-2;
}
for(auto e:G[cur]){
if(e==fa)
continue;
dfs2(e, cur);
}
}
vector<int> sumOfDistancesInTree(int N, vector<vector<int>>& edges) {
G = vector<vector<int> >(N);
for(auto e:edges){
G[e[0]].push_back(e[1]);
G[e[1]].push_back(e[0]);
}
ans = vector<int> (N, 0);
son = vector<int> (N, 0);
n = N;
dfs1(0, -1, 0);
dfs2(0, -1);
return ans;
}
};
一条有梦想的咸鱼