力扣每日一题 2025.11.28

2872.可以被K整除连通块的最大数目

"困难",依旧大佬题解:

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;
    }
};
相关推荐
hcnaisd21 分钟前
深入理解C++内存模型
开发语言·c++·算法
李老师讲编程8 分钟前
C++信息学奥赛练习题-杨辉三角
数据结构·c++·算法·青少年编程·信息学奥赛
zxsz_com_cn18 分钟前
设备预测性维护算法核心功能有哪些?六大模块拆解智能运维的“技术骨架”
运维·算法
期末考复习中,蓝桥杯都没时间学了20 分钟前
力扣刷题13
数据结构·算法·leetcode
2201_7569890930 分钟前
C++中的事件驱动编程
开发语言·c++·算法
会飞的战斗鸡36 分钟前
JS中的链表(含leetcode例题)
javascript·leetcode·链表
多米Domi01141 分钟前
0x3f 第48天 面向实习的八股背诵第五天 + 堆一题 背了JUC的题,java.util.Concurrency
开发语言·数据结构·python·算法·leetcode·面试
2301_8223776542 分钟前
模板元编程调试方法
开发语言·c++·算法
故以往之不谏1 小时前
函数--值传递
开发语言·数据结构·c++·算法·学习方法
渐暖°1 小时前
【leetcode算法从入门到精通】5. 最长回文子串
vscode·算法·leetcode