leetcode 834. 树中距离之和(树形DP换根)
1 class Solution { 2 public: 3 vector<int> sumOfDistancesInTree(int n, vector<vector<int>>& edges) { 4 vector<int>G[n],sz(n),sum(n); 5 for(auto &p:edges) 6 { 7 G[p[0]].push_back(p[1]); 8 G[p[1]].push_back(p[0]); 9 } 10 function<void(int ,int )>dfs1=[&](int u,int fa) 11 { 12 sz[u]=1; 13 sum[u]=0; 14 for(auto &v:G[u]) 15 { 16 if(v!=fa) 17 { 18 dfs1(v,u); 19 sz[u]+=sz[v]; 20 sum[u]+=sum[v]+sz[v]; 21 } 22 } 23 }; 24 function<void(int,int)>dfs2=[&](int u,int fa) 25 { 26 27 for(auto &v:G[u]) 28 { 29 if(v!=fa) 30 { 31 sum[v]=sum[u]+sz[0]-2*sz[v]; 32 dfs2(v,u); 33 } 34 } 35 }; 36 dfs1(0,-1); 37 dfs2(0,-1); 38 return sum; 39 } 40 };