Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Solution {
- public:
- vector <int> g[300010];
- int node[300010], dpchild[300010];
- bool vs[300010];
- void dfs(int u, int p){
- if(vs[u]) return;
- vs[u] = true;
- node[u] = 1;
- dpchild[u] = 0;
- for(auto v: g[u]){
- if(p != v){
- dfs(v, u);
- node[u] += node[v];
- dpchild[u] += dpchild[v] + node[v];
- }
- }
- }
- void DP(int u, int p, vector <int> &dp, int n){
- if(vs[u]) return;
- vs[u] = true;
- int dppar = (dp[p] - dpchild[u] - node[u]) + (n - node[u]); /// dpchild + node
- dp[u] = dpchild[u] + (u == 0 ? 0 : dppar);
- for(auto v: g[u]){
- if(v != p) DP(v, u, dp, n);
- }
- }
- vector<int> sumOfDistancesInTree(int n, vector<vector<int>>& edges) {
- int sz = edges.size();
- for(int i=0;i<=sz-1;i++){
- int u = edges[i][0];
- int v = edges[i][1];
- g[u].push_back(v);
- g[v].push_back(u);
- }
- for(int u=0;u<=n-1;u++) vs[u] = false;
- dfs(0, 0);
- vector <int> dp(n, 0);
- for(int u=0;u<=n-1;u++) vs[u] = false;
- DP(0, 0, dp, n);
- return dp;
- }
- };
Add Comment
Please, Sign In to add comment