原题地址(困难)

    这题实在太难了!根本不会,直接看的官方题解。

    1. class Solution {
    2. public:
    3. vector<int> ans, sz, dp;
    4. vector<vector<int>> graph;
    5. void dfs(int u, int f) {
    6. sz[u] = 1;
    7. dp[u] = 0;
    8. for (auto& v: graph[u]) {
    9. if (v == f) {
    10. continue;
    11. }
    12. dfs(v, u);
    13. dp[u] += dp[v] + sz[v];
    14. sz[u] += sz[v];
    15. }
    16. }
    17. void dfs2(int u, int f) {
    18. ans[u] = dp[u];
    19. for (auto& v: graph[u]) {
    20. if (v == f) {
    21. continue;
    22. }
    23. int pu = dp[u], pv = dp[v];
    24. int su = sz[u], sv = sz[v];
    25. dp[u] -= dp[v] + sz[v];
    26. sz[u] -= sz[v];
    27. dp[v] += dp[u] + sz[u];
    28. sz[v] += sz[u];
    29. dfs2(v, u);
    30. dp[u] = pu, dp[v] = pv;
    31. sz[u] = su, sz[v] = sv;
    32. }
    33. }
    34. vector<int> sumOfDistancesInTree(int N, vector<vector<int>>& edges) {
    35. ans.resize(N, 0);
    36. sz.resize(N, 0);
    37. dp.resize(N, 0);
    38. graph.resize(N, {});
    39. for (auto& edge: edges) {
    40. int u = edge[0], v = edge[1];
    41. graph[u].emplace_back(v);
    42. graph[v].emplace_back(u);
    43. }
    44. dfs(0, -1);
    45. dfs2(0, -1);
    46. return ans;
    47. }
    48. };