leetcode 834. 树中距离之和(树形DP换根)


 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 };

相关