news 2026/9/3 0:54:17

CCF-GESP计算机学会等级考试2025年12月六级C++T1 路径覆盖

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CCF-GESP计算机学会等级考试2025年12月六级C++T1 路径覆盖

P14919 [GESP202512 六级] 路径覆盖

题目描述

给定一棵有nnn结点的有根树TTT,结点依次以1,2,…,n1,2,\ldots,n1,2,,n编号,根结点编号为111。方便起见,编号为iii的结点称为结点iii

初始时TTT中的结点均为白色。你需要将TTT中的若干个结点染为黑色,使得所有叶子到根的路径上至少有一个黑色结点。将结点iii染为黑色需要代价cic_ici,你需要在满足以上条件的情况下,最小化染色代价之和。

叶子是指TTT中没有子结点的结点。

输入格式

第一行,一个正整数nnn,表示结点数量。

第二行,n−1n-1n1个正整数f2,f3,…,fnf_2,f_3,\ldots,f_nf2,f3,,fn,其中fif_ifi表示结点iii的父结点的编号,保证fi<if_i<ifi<i

第三行,nnn个正整数c1,c2,…,cnc_1,c_2,\ldots,c_nc1,c2,,cn,其中cic_ici表示将结点iii染为黑色所需的代价。

输出格式

一行,一个整数,表示在满足所有叶子到根的路径上至少有一个黑色结点的前提下,染色代价之和的最小值。

输入输出样例 #1

输入 #1

4 1 2 3 5 6 2 3

输出 #1

2

输入输出样例 #2

输入 #2

7 1 1 2 2 3 3 64 16 15 4 3 2 1

输出 #2

10

说明/提示

对于40%40\%40%的测试点,保证2≤n≤162\le n\le 162n16

对于另外20%20\%20%的测试点,保证fi=i−1f_i=i-1fi=i1

对于所有测试点,保证2≤n≤1052\le n\le 10^52n1051≤ci≤1091\le c_i\le 10^91ci109

题解:路径覆盖(GESP202512 六级)

题目分析

你需要解决的问题是:给定一棵以1为根的树,将若干节点染黑,使得所有叶子到根的路径上至少有一个黑点,且染色总代价最小。这是典型的树形动态规划(树形DP)问题,核心是通过后序遍历树,从叶子节点向上推导每个子树的最小覆盖代价。

解题思路
  1. DP状态定义dp[i]表示以节点i为根的子树,满足“所有叶子到i的路径至少有一个黑点”的最小染色代价。
  2. 遍历方式:由于题目中父节点编号一定小于子节点(f_i < i),因此从n1逆序遍历,等价于从叶子节点到根节点的后序遍历,能保证处理父节点时所有子节点已处理完毕。
  3. 状态转移
    • i是叶子节点(无任何子节点):必须将i染黑,因此dp[i] = c[i]
    • i是非叶子节点:有两种选择——
      ✅ 选择自己染黑:代价为c[i]
      ✅ 选择子节点的覆盖代价之和:代价为所有子节点dp值的总和;
      取两种选择的最小值作为dp[i]
  4. 最终答案:根节点1dp[1]即为整棵树的最小覆盖代价。
#include<bits/stdc++.h>usingnamespacestd;intn;// 树的节点总数intf[100005];// f[i] 存储节点i的父节点编号(i≥2)intc[100005];// c[i] 存储将节点i染黑的代价longlongdp[100005];// dp[i]:以i为根的子树的最小覆盖代价(用long long避免溢出,c[i]可达1e9,n可达1e5)intmain(){// 输入节点总数cin>>n;// 输入2~n号节点的父节点(题目保证f[i]<i)for(inti=2;i<=n;i++){cin>>f[i];}// 输入每个节点的染色代价for(inti=1;i<=n;i++){cin>>c[i];}// 逆序遍历(从n到1):等价于从叶子到根的后序遍历for(inti=n;i>=1;i--){// 状态转移核心:// 1. 叶子节点:dp[i]初始为0,会被赋值为c[i](必须自己染黑)// 2. 非叶子节点:比较「子节点代价和」与「自己染黑代价」,取更小值if(dp[i]==0||dp[i]>c[i]){dp[i]=c[i];}// 将当前节点的最小代价累加到父节点的dp中(父节点的初始代价是所有子节点代价的和)// 注意:根节点1没有父节点,f[1]无意义,但i=1时执行此语句不影响(数组越界?不,f数组仅2~n有值,f[1]未初始化,但i=1时dp[f[1]]不会被后续使用)dp[f[i]]+=dp[i];}// 根节点1的dp值即为整棵树的最小覆盖代价cout<<dp[1];return0;}
复杂度分析
  • 时间复杂度O(n),仅需遍历节点1~n各一次,所有操作均为常数级。
  • 空间复杂度O(n),主要消耗在存储父节点、代价、DP数组的数组空间,能满足n≤1e5的数据规模。

总结

  1. 本题核心是树形DP,利用“父节点编号小于子节点”的特性,通过逆序遍历实现从叶子到根的后序遍历。
  2. dp[i]的状态转移逻辑是:取“自己染黑的代价”和“所有子节点覆盖代价之和”的最小值。
  3. 最终根节点的dp[1]即为满足条件的最小总代价,算法时间/空间效率均能适配题目数据范围。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 0:22:25

EEGLAB脑电分析实战指南:解锁大脑电活动密码的完整路径

EEGLAB脑电分析实战指南&#xff1a;解锁大脑电活动密码的完整路径 【免费下载链接】eeglab EEGLAB is an open source signal processing environment for electrophysiological signals running on Matlab and developed at the SCCN/UCSD 项目地址: https://gitcode.com/g…

作者头像 李华
网站建设 2026/9/2 22:43:37

AI重构企业增长:创客匠人如何以场景化应用驱动价值落地

在数字化转型浪潮中&#xff0c;越来越多的企业意识到&#xff0c;AI带来的不仅是效率提升&#xff0c;更是组织逻辑与增长路径的深层重构。创客匠人作为专注于教育培训行业的技术服务商&#xff0c;也经历了从“探索技术”到“深耕场景”的思维转变。我们发现&#xff0c;AI最…

作者头像 李华
网站建设 2026/9/2 11:31:29

深度解析:如何用mimalloc让C++应用性能飙升

深度解析&#xff1a;如何用mimalloc让C应用性能飙升 【免费下载链接】mimalloc mimalloc is a compact general purpose allocator with excellent performance. 项目地址: https://gitcode.com/GitHub_Trending/mi/mimalloc mimalloc内存分配器是微软研究院开发的紧凑…

作者头像 李华
网站建设 2026/9/3 0:22:40

MyBatisPlus在GLM相关后台管理系统中的数据库操作应用

MyBatisPlus在GLM相关后台管理系统中的数据库操作应用 在当今AI驱动的系统中&#xff0c;大模型服务正快速融入各类业务场景。以智谱AI推出的 GLM-4.6V-Flash-WEB 为例&#xff0c;这款专为高并发、低延迟设计的多模态视觉理解模型&#xff0c;已在图像问答、内容审核和智能辅助…

作者头像 李华
网站建设 2026/9/2 23:30:37

附件上传总失败?你必须知道的Dify ID存在性检查5大坑

第一章&#xff1a;Dify 附件 ID 存在性在 Dify 平台中&#xff0c;附件的唯一标识&#xff08;Attachment ID&#xff09;是管理与调用文件资源的核心参数。每个上传至系统的文件都会被分配一个全局唯一的 ID&#xff0c;该 ID 在后续的访问、更新或删除操作中起到关键作用。确…

作者头像 李华
网站建设 2026/9/3 1:20:20

Zotero PDF2zh插件使用指南:3分钟掌握英文文献翻译技巧

Zotero PDF2zh插件使用指南&#xff1a;3分钟掌握英文文献翻译技巧 【免费下载链接】zotero-pdf2zh PDF2zh for Zotero | Zotero PDF中文翻译插件 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-pdf2zh 还在为阅读英文文献头疼吗&#xff1f;Zotero PDF2zh插件让…

作者头像 李华