news 2026/5/21 19:00:29

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/5/21 18:48:59

GLM-4.6V-Flash-WEB与办公自动化软件的插件开发设想

GLM-4.6V-Flash-WEB与办公自动化软件的插件开发设想 在企业数字化转型不断深入的今天&#xff0c;一个看似不起眼却长期困扰办公效率的问题正浮出水面&#xff1a;我们每天处理大量扫描件、截图和图文混排文档&#xff0c;但计算机“看”不懂它们。发票上的金额、合同里的签字位…

作者头像 李华
网站建设 2026/5/20 20:49:44

AI Agent设计模式全攻略:从零开始掌握9种核心模式,建议收藏

文章介绍了AI Agent的定义、决策流程和四个核心模块&#xff0c;详细解析了9种设计模式&#xff1a;ReAct、Plan and Solve等&#xff0c;每种模式各有适用场景。文章还提及智泊AI提供AI大模型课程&#xff0c;帮助不同背景人群成为AI人才&#xff0c;结合理论学习和实战项目&a…

作者头像 李华
网站建设 2026/5/20 11:24:26

如何快速掌握虚幻引擎存档编辑:uesave完整使用指南

如何快速掌握虚幻引擎存档编辑&#xff1a;uesave完整使用指南 【免费下载链接】uesave-rs 项目地址: https://gitcode.com/gh_mirrors/ue/uesave-rs 想要完全控制《Deep Rock Galactic》等虚幻引擎游戏的存档数据吗&#xff1f;uesave工具让这一切变得简单直观。这款基…

作者头像 李华
网站建设 2026/5/20 11:24:19

Buzz完全指南:打造个人专属的离线语音识别工作站

Buzz完全指南&#xff1a;打造个人专属的离线语音识别工作站 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz 引言&#xff1a…

作者头像 李华
网站建设 2026/5/20 23:45:40

USBIPD-WIN兼容性实战指南:从问题排查到完美共享

USBIPD-WIN兼容性实战指南&#xff1a;从问题排查到完美共享 【免费下载链接】usbipd-win Windows software for sharing locally connected USB devices to other machines, including Hyper-V guests and WSL 2. 项目地址: https://gitcode.com/gh_mirrors/us/usbipd-win …

作者头像 李华
网站建设 2026/5/14 6:21:11

VutronMusic:重新定义你的音乐生活

VutronMusic&#xff1a;重新定义你的音乐生活 【免费下载链接】VutronMusic 高颜值的第三方网易云播放器&#xff0c;支持本地音乐播放、离线歌单、桌面歌词、Touch Bar歌词、Mac状态栏歌词显示、Linux-gnome桌面状态栏歌词显示。支持 Windows / macOS / Linux :electron: …

作者头像 李华