LeetCode 6211. 创建价值相同的连通块
枚举 + dfs求子树权值
class Solution {
public:
vector<vector<int>> g;
vector<int> x;
int dfs(int u, int fa, int target)
{
// cout << u << endl;
int res = x[u];
for(auto& i : g[u])
{
if(i == fa) continue;
int t = dfs(i, u, target);
if(t < 0)
return -1;
res += t;
}
if(res > target) return -1; //不合法
if(res == target) return 0; //该树对和贡献0等价于删除该子树
return res;
}
int componentValue(vector<int>& nums, vector<vector<int>>& edges) {
int n = nums.size();
x = nums;
g.resize(n + 1);
for(auto& e : edges)
{
int a = e[0], b = e[1];
g[a].push_back(b);
g[b].push_back(a);
}
long long sum = accumulate(nums.begin(), nums.end(), 0LL);
for(int i = n; i ; i --) //枚举联通块个数
{
if(sum % i == 0)
{
if(dfs(0, -1, sum / i) == 0)
return i - 1;
}
}
return n - 1;
}
};