|
| 1 | +int ans=0; |
| 2 | +class Solution { |
| 3 | +public: |
| 4 | + void dfs2(int i,vector<int> adj[],int parent[],int nodes[],int ans2,vector<int>& temp){ |
| 5 | + int k = parent[i]; |
| 6 | + if(k==-1){ |
| 7 | + temp[i] = ans2; |
| 8 | + for(auto x:adj[i]){ |
| 9 | + if(x!=parent[i]) dfs2(x,adj,parent,nodes,ans2,temp); |
| 10 | + } |
| 11 | + } |
| 12 | + else{ |
| 13 | + int nodes_left = nodes[parent[i]]-nodes[i]; |
| 14 | + ans2-=nodes[i]; |
| 15 | + ans2+=nodes_left; |
| 16 | + temp[i] = ans2; |
| 17 | + nodes[i] = nodes[parent[i]]; |
| 18 | + for(auto x:adj[i]){ |
| 19 | + if(x!=parent[i]) dfs2(x,adj,parent,nodes,ans2,temp); |
| 20 | + } |
| 21 | + } |
| 22 | + } |
| 23 | + int dfs(int i,vector<int> adj[],int parent[],int nodes[],int level){ |
| 24 | + ans+=level;nodes[i]=1; |
| 25 | + if(adj[i].size()==1 && parent[i]==adj[i][0]) return nodes[i]; |
| 26 | + for(auto x:adj[i]){ |
| 27 | + if(x!=parent[i]){ |
| 28 | + parent[x]=i; |
| 29 | + nodes[i] += dfs(x,adj,parent,nodes,level+1); |
| 30 | + } |
| 31 | + } |
| 32 | + return nodes[i]; |
| 33 | + } |
| 34 | + vector<int> sumOfDistancesInTree(int n, vector<vector<int>>& edges) { |
| 35 | + int i,j,k,m,ct=0;ans=0; |
| 36 | + m=edges.size();vector<int> temp(n,0); |
| 37 | + vector<int> adj[n]; |
| 38 | + int parent[n], nodes[n]; |
| 39 | + memset(nodes,0,sizeof(nodes)); |
| 40 | + memset(nodes,-1,sizeof(parent)); |
| 41 | + parent[0]=-1; |
| 42 | + for(i=0;i<m;i++){ |
| 43 | + j = edges[i][0]; |
| 44 | + k = edges[i][1]; |
| 45 | + adj[j].push_back(k); |
| 46 | + adj[k].push_back(j); |
| 47 | + } |
| 48 | + int k1 = dfs(0,adj,parent,nodes,0); |
| 49 | + // cout<<ans<<endl; |
| 50 | + //for(i=0;i<n;i++) cout<<nodes[i]<<endl; |
| 51 | + dfs2(0,adj,parent,nodes,ans,temp); |
| 52 | + return temp; |
| 53 | + } |
| 54 | +}; |
0 commit comments