Leetcode 2440 -- dfs&&枚举
题目描述
思路
代码
class Solution {
public:
int componentValue(vector<int>& nums, vector<vector<int>>& edges) {
// get max_val and sum_val
int n = nums.size();
int max_val = -1, sum_val = 0;
for(auto &x : nums) max_val = max(max_val, x), sum_val += x;
cout << "max_value: " << max_val << endl;
cout << "sum_value: " << sum_val << endl;
// initialization e
vector<int> e[n];
for(auto &x : edges)
{
int a = x[0], b = x[1];
e[a].push_back(b);
e[b].push_back(a);
}
// 需要设置一个 fa 避免重复搜索
function<bool(int, int)>dfs = [&](int val, int fa) -> int {
return true;
};
// 删的边越多,连通块的个数越多, i 等于连通块个数
// 删去的边数等于连通块个数 - 1
// 优化:sum_val / block_cnt >= max_val
// block_cnt <= sum_val / max_val
for(int i = sum_val / max_val; i >= 1; i -- )
{
if(sum_val % i == 0 && dfs(sum_val / i, -1)) return i - 1;
}
// never go here, because i == 1 will always success
return -1;
}
};
拓展:统计子树的大小
当图是一棵树(无环)的时候,如果树有向,什么都不用设置,否则,额外传入一个 fa
如果有环,设置一个 st 数组。