树的dp,
讲解:https://www.youtube.com/watch?v=gi2maECPOB0&ab_channel=M.C%E7%B1%B3%E5%BC%80%E6%9C%97%E5%9F%BA%E7%BD%97
建树:
0:1,2
1:0
2:0,3,4,5
3:2
4:2
5:2
/*树的dp,
讲解:https://www.youtube.com/watch?v=gi2maECPOB0&ab_channel=M.C%E7%B1%B3%E5%BC%80%E6%9C%97%E5%9F%BA%E7%BD%97
建树:
0:1,2
1:0
2:0,3,4,5
3:2
4:2
5:2
*/
class Solution {
public:
vector<set<int> > tree;
int N;
// ans是保存子节点的距离之和,count计算有多少个子节点(包括自己)
void dfs(int cur, int par, vector<int>& ans, int* count)
{
for(auto child : tree[cur])
{
if(child != par)
{
dfs(child, cur, ans, count);
count[cur] += count[child];
ans[cur] += (ans[child] + count[child]);//先求出0到其他所有点的距离之和
//cout << cur << ":" << ans[cur] << " " << count[cur] << endl;
}
}
}
void dfs2(int cur,int par, vector<int>& ans, int* count)
{
for(auto child : tree[cur])
{
if(child != par)
{
ans[child] = ans[cur] + (N - count[child]) - count[child];
dfs2(child, cur, ans, count);
}
}
}
vector<int> sumOfDistancesInTree(int N, vector<vector<int>>& edges) {
this->N = N;
int len = edges.size();
//计算每个节点有多少个子节点 count(包括自身)
int* count = new int[N];
for(int i = 0;i < N; i++) count[i] = 1;
//计算当前节点到其他节点的距离之和
vector<int> ans(N, 0);
if(len < 1) return ans;
for(int i = 0;i < N;i++)
{
set<int> s;//存放树节点的边
tree.push_back(s);
}
//建树
for(int i = 0;i < len;i++)
{
tree[edges[i][0]].insert(edges[i][1]);
tree[edges[i][1]].insert(edges[i][0]);
}
dfs(0, -1, ans, count);
dfs2(0, -1, ans, count);
return ans;
}
};