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 数组。

posted @ 2022-10-21 19:54  光風霽月  阅读(15)  评论(0编辑  收藏  举报