【深度优先搜索 图论 树】2872. 可以被 K 整除连通块的最大数目

本文涉及知识点

深度优先搜索 图论 树
图论知识汇总

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

给你一棵 n 个节点的无向树,节点编号为 0 到 n - 1 。给你整数 n 和一个长度为 n - 1 的二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 有一条边。
同时给你一个下标从 0 开始长度为 n 的整数数组 values ,其中 values[i] 是第 i 个节点的 值 。再给你一个整数 k 。
你可以从树中删除一些边,也可以一条边也不删,得到若干连通块。一个 连通块的值 定义为连通块中所有节点值之和。如果所有连通块的值都可以被 k 整除,那么我们说这是一个 合法分割 。
请你返回所有合法分割中,连通块数目的最大值 。
示例 1:

输入:n = 5, edges = [[0,2],[1,2],[1,3],[2,4]], values = [1,8,1,4,4], k = 6
输出:2
解释:我们删除节点 1 和 2 之间的边。这是一个合法分割,因为:

  • 节点 1 和 3 所在连通块的值为 values[1] + values[3] = 12 。
  • 节点 0 ,2 和 4 所在连通块的值为 values[0] + values[2] + values[4] = 6 。
    最多可以得到 2 个连通块的合法分割。
    示例 2:

输入:n = 7, edges = [[0,1],[0,2],[1,3],[1,4],[2,5],[2,6]], values = [3,0,6,1,5,2,1], k = 3
输出:3
解释:我们删除节点 0 和 2 ,以及节点 0 和 1 之间的边。这是一个合法分割,因为:

  • 节点 0 的连通块的值为 values[0] = 3 。
  • 节点 2 ,5 和 6 所在连通块的值为 values[2] + values[5] + values[6] = 9 。
  • 节点 1 ,3 和 4 的连通块的值为 values[1] + values[3] + values[4] = 6 。
    最多可以得到 3 个连通块的合法分割。

提示:

1 <= n <= 3 * 104
edges.length == n - 1
edges[i].length == 2
0 <= ai, bi < n
values.length == n
0 <= values[i] <= 109
1 <= k <= 109
values 之和可以被 k 整除。
输入保证 edges 是一棵无向树。

深度优先搜索

共n-1条边,对应除根节点外,所有节点和其父节点。
除根节点外,子树所有节点之和如果是k的倍数,则断开。因为后代断开,不影响祖先节点断开。
连通块数 = 断开数 +1。

代码

class CNeiBo
{
public:	static vector<vector<int>> Two(int n, vector<vector<int>>& edges, bool bDirect, int iBase = 0) {vector<vector<int>>  vNeiBo(n);for (const auto& v : edges){vNeiBo[v[0] - iBase].emplace_back(v[1] - iBase);if (!bDirect){vNeiBo[v[1] - iBase].emplace_back(v[0] - iBase);}}return vNeiBo;}	static vector<vector<std::pair<int, int>>> Three(int n, vector<vector<int>>& edges, bool bDirect, int iBase = 0){vector<vector<std::pair<int, int>>> vNeiBo(n);for (const auto& v : edges){vNeiBo[v[0] - iBase].emplace_back(v[1] - iBase, v[2]);if (!bDirect){vNeiBo[v[1] - iBase].emplace_back(v[0] - iBase, v[2]);}}return vNeiBo;}static vector<vector<int>> Grid(int rCount, int cCount, std::function<bool(int, int)> funVilidCur, std::function<bool(int, int)> funVilidNext){vector<vector<int>> vNeiBo(rCount * cCount);auto Move = [&](int preR, int preC, int r, int c){if ((r < 0) || (r >= rCount)){return;}if ((c < 0) || (c >= cCount)){return;}if (funVilidCur(preR, preC) && funVilidNext(r, c)){vNeiBo[cCount * preR + preC].emplace_back(r * cCount + c);}};for (int r = 0; r < rCount; r++){for (int c = 0; c < cCount; c++){Move(r, c, r + 1, c);Move(r, c, r - 1, c);Move(r, c, r, c + 1);Move(r, c, r, c - 1);}}return vNeiBo;}static vector<vector<int>> Mat(vector<vector<int>>& neiBoMat){vector<vector<int>> neiBo(neiBoMat.size());for (int i = 0; i < neiBoMat.size(); i++){for (int j = i + 1; j < neiBoMat.size(); j++){if (neiBoMat[i][j]){neiBo[i].emplace_back(j);neiBo[j].emplace_back(i);}}}return neiBo;}
};class Solution {
public:int maxKDivisibleComponents(int n, vector<vector<int>>& edges, vector<int>& values, int k) {m_values = values;m_iK = k;auto neiBo = CNeiBo::Two(n, edges, false);DFS(neiBo, 0, -1);return m_iRet+1;}long long DFS(vector<vector<int>>& neiBo, int cur, int par){long long llSum = m_values[cur];for (const auto& next : neiBo[cur]){if (next == par){continue;}llSum += DFS(neiBo, next, cur);}if ((0 == llSum % m_iK)&&( 0 != cur)) { m_iRet++; }return llSum;}vector<int> m_values;int m_iK;int m_iRet = 0;
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/6876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware 虚拟机打开一段时间后卡死,VNX进程CPU占比高

一、问题描述 打开虚拟机后可以正常运行 运行几分钟后突然卡死 然后通过任务管理器可以观察到VMware Workstation VMX应用进程的CPU占比高&#xff0c;CPU也出现异常 关闭虚拟机重新开启&#xff0c;还是一样卡死 二、系统环境 系统: Windows10 VMware: Workstation 17 Pro …

奇门辅助软件v2024.5

废话不说&#xff0c;先上链接 链接&#xff1a;https://pan.baidu.com/s/1_i11lMx4P_vrTs-6lpWoHA?pwd8v1m 提取码&#xff1a;8v1m 功能介绍 【宫内信息】是点击宫内某属性时显示的宫内基本信息。 【古籍宝鉴】是《御定奇门宝鉴》里的对应时局内容&#xff0c;但差补法置…

[Flutter]单元测试和组件测试

1.单元测试 在Flutter开发中&#xff0c;进行单元测试是确保你的代码质量以及未来更改不会破坏现有功能的关键步骤。当你开发私有包时&#xff0c;单元测试尤其重要&#xff0c;因为这有助于保持包的稳定性和可维护性。以下是如何在Flutter中进行单元测试的详细指南&#xff1…

GPT:利用LLM Studio在本地运行语言模型

请关注微信公众号&#xff1a;拾荒的小海螺 博客地址&#xff1a;http://lsk-ww.cn/ 1、简述 随着人工智能和自然语言处理技术的发展&#xff0c;语言模型技术正逐渐成为博客和内容创作领域的重要工具。LLM Studio是一种允许用户在本地环境中运行语言模型的工具&#xff0c;它…

备考2024年小学生古诗文大会:吃透10道历年真题和知识点(持续)

对上海小学生的小升初和各种评优争章来说&#xff0c;语文、数学、英语的含金量较高的证书还是很有价值和帮助的。对于语文类的竞赛&#xff0c;小学生古诗文大会和汉字小达人通常是必不可少的&#xff0c;因为这两个针对性强&#xff0c;而且具有很强的上海本地特色。 今天我…

C语言 | Leetcode C语言题解之第69题x的平方根

题目&#xff1a; 题解&#xff1a; int mySqrt(int x) {long int i 0;for(i0;;i){long int a i*i;long int b (i1)*(i1);if(a < x&&b > x){break;}}return i; }

Redis 整合

1、pom 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>2、yml 配置 spring:redis:host: 192.168.56.10port: 63793、直接注入 StringRedisT…

【第三版 系统集成项目管理工程师】第2章 信息技术发展(知识总结)

持续更新。。。。。。。。。。。。。。。 【第2章】 信息技术发展 考情分析2. 1信息技术及其发展2.1.1 计算机软硬件-P501.计算机硬件2.计算机软件-P51 2.1.2计算机网络1.通信基础-P522.网络基础-P534.网络标准协议-P543.网络设备-P535.软件定义网络-P576.第五代移动通信技术-P…

input,el-input输入框正则验证输入的非数字转为空

<input οninput"this.valuethis.value.replace(/\D/g,)" maxlength"4" v-model"code" placeholder"请输入验证码" /> <el-input v-model"unboundTel" placeholder"请输入解绑手机号" clearable blur&q…

选择CDN加速器节点网络的因素有哪些?

CDN加速能够将网站的静态资源缓存分布在全球的各地的服务器节点上&#xff0c;当用户进行访问网站时&#xff0c;能够提供一定的资源&#xff0c;以此来减少网络延迟和加载时间&#xff0c;提高网站整体的访问速度。 那么我们在选择CDN 加速器节点网络时应该考虑哪些因素呢&…

霍尼韦尔HONEYWELL 17HM5 微型密封基本开关

微动开关与普通开关的主要区别在于它们的设计和操作特性。以下是微动开关的特点&#xff1a; 微小接点间隔&#xff1a;微动开关的触点间距较小&#xff0c;这使得它们能够提供的开关动作。 快动机构&#xff1a;它们具有快速动作的特性&#xff0c;能够在短的行程内完成接通…

【C++题解】1434. 数池塘(四方向)

问题&#xff1a;1434. 数池塘&#xff08;四方向&#xff09; 类型&#xff1a;深搜 题目描述&#xff1a; 农夫约翰的农场可以表示成 NM个方格组成的矩形。由于近日的降雨&#xff0c;在约翰农场上的不同地方形成了池塘。每一个方格或者有积水&#xff08;W&#xff09;或者…

项目管理-项目沟通管理

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 1.项目沟通管理-主要内容 项目沟通管理过程--重点&#xff1a; ①ITTO 输入&#xff0c;输出工具和技术。 ②问题和解决方案。 ③论文…

手机异地组网方案?

现代社会&#xff0c;随着信息技术的快速发展&#xff0c;人们之间的通信需求也日益增加。尤其是在异地工作、异地学习、异地旅游等情况下&#xff0c;我们需要实现不同地区间的快速组建局域网&#xff0c;以解决电脑与电脑、设备与设备、电脑与设备之间的信息远程通信问题。本…

java后端自学错误总结spring持续更新中

java后端自学错误总结 一.SpringBoot--正在总结中1.循环嵌套异常2.项目起来卡住了怎么办 二.SpringCloud--正在总结中 一.SpringBoot–正在总结中 1.循环嵌套异常 今天再写SpringCloud项目的时候书写测试类运行结果报错了报错的最后的信息是 The dependencies of some of th…

【Linux】基于 Jenkins+shell 实现更新服务所需文件 -->两种方式:ssh/Ansible

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

Kotlin注解简介

Kotlin注解 注解&#xff08;Annotations&#xff09;在 Kotlin 中和在 Java 中有类似的地位&#xff0c;它们都是元数据的形式&#xff0c;为代码提供了额外的信息。注解不会直接影响代码的操作&#xff0c;但可以被编译器或者运行时环境用来生成额外的代码、进行类型检查、处…

每天一个数据分析题(三百零四)

小平台为获取用户往往需在用户量大且活跃的大平台投放广告&#xff0c;广告投放的计费模式有多种&#xff0c;请问CPC广告计费模式按照什么作为计费参照标准&#xff1f; A. 触达人群数量 B. 付费金额占比 C. 点击次数 D. 以上都不对 cda数据分析考试&#xff1a;点击进入…

什么是全角数字

全角数字是指在中文中表示数字的字符&#xff0c;与阿拉伯数字相对应&#xff0c;占用双字节的存储空间&#xff0c;通常与其他中文字符一起使用。 具体来说&#xff0c;全角数字是指中文字符中的数字部分&#xff0c;即"0"到"9"这几个字符。在文本中&…

MySQL——Windows平台下MySQL安装与配置(一)MySQL安装

Windows平台下安装和配置 基于Windows平台的MySQL安装文件有两个版本&#xff0c;一种是以.msi作为后缀名的二进制分发版&#xff0c;一种是以.zip作为后缀的压缩文件。其中.msi的安装文件提供了图形化的安装向导&#xff0c;按照向导提示进行操作即可安装完成&#xff0c;.zip…