"困难",依旧大佬题解:
cpp
class Solution {
public:
int maxKDivisibleComponents(int n, vector<vector<int>>& edges, vector<int>& values, int k) {
// 1. 构建邻接表
vector<vector<int>> g(n);
for (auto& e : edges) {
int x = e[0], y = e[1];
g[x].push_back(y);
g[y].push_back(x);
}
// 2. 初始化结果计数器
int ans = 0;
// 3. 定义并实现 DFS lambda 函数
// this auto&& dfs 是 C++14 的语法,用于在 lambda 内部递归调用自身
// x: 当前遍历的节点
// fa: x 的父节点,用于防止在邻接表中回头遍历
// 返回值: 以 x 为根的子树的权值和
auto dfs = [&](this auto&& dfs, int x, int fa) -> long long {
// 4. 初始化当前子树的权值和为当前节点的值
long long sum = values[x];
// 5. 遍历当前节点的所有邻居
for (int y : g[x]) {
// 6. 如果邻居不是父节点,就递归遍历这个邻居
if (y != fa) {
// 7. 将子节点 y 的子树权值和加到当前子树的权值和上
sum += dfs(y, x);
}
}
// 8. 关键判断:如果当前子树的权值和能被 k 整除
if (sum % k == 0) {
ans++; // 结果加一
}
// 9. 返回当前子树的权值和给父节点
return sum;
};
// 10. 从根节点 0 开始进行 DFS,其父节点设为 -1(表示无父节点)
dfs(0, -1);
// 11. 返回最终结果
return ans;
}
};