题目描述:
在一棵树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,一个节点及其直接相连的子节点被定义为一个小家庭。现给你一棵树,请计算出最富裕的小家庭的财富和。
输入描述:
第一行为一个数N,表示成员总数,成员编号1~N,1<=N<=1000;
第二行为N个空格分隔的数,表示编号1~N的成员的财富值,0<=财富值<=1000000;接下来N-1行,每行两个空格分隔的整数(N1 N2),表示N1是N2的父节点。
输出描述:
最富裕的小家庭的财富和
示例:
输入
4
100 200 300 500
1 2
1 3
2 4
输出
700
说明:
成员1,2,3组成的小家庭财富值为600
成员2,4组成的小家庭财富值为700
C++源码:
#include <iostream>
#include <string>
#include <ctime>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <map>
#include <sstream>
using namespace std;
const int MAXN = 1005;
int N, maxWealth = 0;
vector<int> children[MAXN]; // 存储每个节点的直接子节点
int wealth[MAXN]; // 存储各个节点的财富值
void calculateFamilyWealth(int node, int parentWealth) {
int familyWealth = parentWealth; // 起始节点自己的财富
for (int child : children[node]) {
calculateFamilyWealth(child, wealth[child]); // 递归计算子节点的小家庭财富
familyWealth += wealth[child]; // 累加子节点的财富到当前小家庭
}
maxWealth = max(maxWealth, familyWealth); // 更新最大小家庭财富
}
int main() {
cin >> N;
for (int i = 1; i <= N; ++i) {
cin >> wealth[i];
}
for (int i = 1; i < N; ++i) {
int parent, child;
cin >> parent >> child;
children[parent].push_back(child); // 构建孩子列表,注意这里只存储直接孩子,不考虑反向链接
}
// 从根节点开始计算
calculateFamilyWealth(1, wealth[1]);
cout << maxWealth << endl;
system("pause");
return 0;
}