1 class Solution {
2 public:
3 vector<int> sumOfDistancesInTree(int n, vectorint>>& 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 };