# 834 Sum of Distances in Tree
###### tags: `leetcode`
## Problem Statement
There is an undirected connected tree with n nodes labeled from $0$ to $n - 1$ and $n - 1$ edges.
You are given the integer n and the array edges where $edges[i] = [a_i, b_i]$ indicates that there is an edge between nodes $a_i$ and $b_i$ in the tree.
Return an array answer of length $n$ where $answer[i]$ is the sum of the distances between the ith node in the tree and all other nodes.
- Example 1:

> Input: n = 6, edges = [[0,1],[0,2],[2,3],[2,4],[2,5]]
Output: [8,12,6,10,10,10]
Explanation: The tree is shown above.
We can see that ```dist(0,1) + dist(0,2) + dist(0,3) + dist(0,4) + dist(0,5)```
equals ```1 + 1 + 2 + 2 + 2 = 8.```
Hence, answer[0] = 8, and so on.
- Example 2:

> Input: n = 1, edges = []
Output: [0]
- Example 3:

> Input: n = 2, edges = [[1,0]]
Output: [1,1]
- Constraints:
> $1 \leq n \leq 3 \times 10^4\\
edges.length = n - 1\\
edges[i].length = 2\\
0 <= a_i,\ b_i < n\\
a_i\ \not= b_i$
The given input represents a valid tree.
## Solution
- Since the tree is bi-directional, put the connection into vector for storage the connected status.
```cpp=
for(auto i: edges) {
tree[i[0]].push_back(i[1]);
tree[i[1]].push_back(i[0]);
}
```
- There are 2 numbers to remember for each connection:
- m: the current sum of the whole related values
- under: the distance itself
- Therefore, to remember the whole anwser, in each connection, update the current anwser and the cumulative anwser.
```cpp=
for(int j: tree[i]) {
if(j==p) continue;
if(m.find({i,j})==m.end()) {
auto p= getDfs(j,i);
m[{i,j}]=p.first;
under[{i,j}]=p.second;
}
ans+= m[{i,j}]+under[{i,j}];
c+=under[{i,j}];
}
```