news 2026/8/9 18:46:11

2024年6月GESP真题及题解(C++七级): 黑白翻转

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2024年6月GESP真题及题解(C++七级): 黑白翻转

2024年6月GESP真题及题解(C++七级): 黑白翻转

题目描述

小杨有一棵包含n nn个节点的树,这棵树上的任意一个节点要么是白色,要么是黑色。小杨认为一棵树是美丽树当且仅当在删除所有白色节点之后,剩余节点仍然组成一棵树。

小杨每次操作可以选择一个白色节点将它的颜色变为黑色,他想知道自己最少要执行多少次操作可以使得这棵树变为美丽树。

输入格式

第一行包含一个正整数n nn,代表树的节点数。

第二行包含n nn个非负整数a 1 , a 2 , … , a n a_1,a_2,\ldots,a_na1,a2,,an,其中如果a i = 0 a_i=0ai=0,则节点i ii的颜色为白色,否则为黑色。

之后n − 1 n-1n1行,每行包含两个正整数x i , y i x_i,y_ixi,yi,代表存在一条连接节点x i x_ixiy i y_iyi的边。

输出格式

输出一个整数,代表最少执行的操作次数。

输入输出样例 1
输入 1
5 0 1 0 1 0 1 2 1 3 3 4 3 5
输出 1
2
说明/提示
样例解释

将节点1 113 33变为黑色即可使这棵树变为美丽树,此时删除白色节点5 55,剩余黑色节点仍然组成一棵树。

数据范围
子任务编号数据点占比n nna i a_iai特殊条件
1 1130 % 30\%30%≤ 10 5 \leq 10^51050 ≤ a i ≤ 1 0\leq a_i\leq 10ai1树的形态为一条链
2 2230 % 30\%30%≤ 10 5 \leq 10^51050 ≤ a i ≤ 1 0\leq a_i\leq 10ai1只有两个节点颜色为黑色
3 3340 % 40\%40%≤ 10 5 \leq 10^51050 ≤ a i ≤ 1 0\leq a_i\leq 10ai1

对于全部数据,保证有1 ≤ n ≤ 10 5 1\leq n\leq 10^51n1050 ≤ a i ≤ 1 0\leq a_i\leq 10ai1

思路分析

算法思路
  1. 问题转化:美丽树要求删除所有白色节点后,剩余黑色节点仍构成一棵树,即所有黑色节点必须连通。通过将白色节点变为黑色来连接黑色节点,需要找到最少的白色节点数,使得所有黑色节点连通。
  2. 核心观察:从任意一个黑色节点(如第一个黑色节点)作为根进行DFS,计算每个节点的子树中黑色节点的数量。若一个节点的子树中包含黑色节点,则该节点必须保留(如果是白色则需要变为黑色),否则删除该节点不会影响黑色节点的连通性。
  3. 计算最少操作:统计所有子树中包含黑色节点的节点数,减去初始黑色节点数,即为需要将白色变为黑色的节点数(最少操作次数)。
代码流程
  • 初始化:读入节点颜色,记录黑色节点数并选择第一个黑色节点作为根。
  • 建图:读入边,构建无向树。
  • DFS计算:从根节点开始DFS,后序遍历累加子树中黑色节点数到父节点,使vis[i]最终表示以i为根的子树中黑色节点的总数。
  • 统计结果:遍历所有节点,若vis[i] > 0则说明该节点的子树中有黑色节点,计数一次。最终ans为所有此类节点数,减去初始黑色节点数num1,得到需要操作的白色节点数。
时间复杂度
  • DFS遍历所有节点和边,时间复杂度为O(n)。
  • 空间复杂度为O(n),用于存储树和图。

代码实现

#include<bits/stdc++.h>usingnamespacestd;constintN=200010;// 定义最大节点数,开两倍以防无向边存储intn,a,b,ans,num,root;// n:节点数,a,b:临时边变量,ans:统计结果,num1:黑色节点数量,root:选定的根节点(第一个黑色节点)intvis[N];// vis[i]:初始表示节点i的颜色(黑色为1,白色为0),DFS后表示以i为根的子树中黑色节点的总数vector<int>e[N];// 邻接表存储树的边// 深度优先搜索,计算每个节点的子树中黑色节点数量// u: 当前节点,f: 父节点voiddfs(intu,intf){// 遍历当前节点的所有邻居for(intv:e[u]){if(v==f)continue;// 跳过父节点,避免回环dfs(v,u);// 递归处理子节点vis[u]+=vis[v];// 将子节点的黑色节点数累加到当前节点}return;}intmain(){// 读入节点数scanf("%d",&n);intc;// 读入每个节点的颜色,并初始化vis数组for(inti=1;i<=n;i++){scanf("%d",&c);if(c==1){// 如果节点是黑色vis[i]=1;// 标记该节点为黑色(计数1)num++;// 黑色节点计数加一if(num==1)root=i;// 记录第一个黑色节点作为根节点}// 白色节点vis[i]保持为0}// 读入n-1条边,构建树的无向图for(inti=1;i<n;i++){scanf("%d%d",&a,&b);e[a].push_back(b);e[b].push_back(a);}// 从根节点(第一个黑色节点)开始DFS,计算每个节点的子树中黑色节点数量dfs(root,0);// 统计所有子树中包含黑色节点的节点数(即vis[i] > 0的节点)for(inti=1;i<=n;i++)ans+=bool(vis[i]);// 如果vis[i] > 0则加1,否则加0// 输出最少操作次数:需要变黑的白色节点数 = 包含黑色节点的节点数 - 初始黑色节点数printf("%d\n",ans-num);return0;}

各种学习资料,助力大家一站式学习和提升!!!

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}

1、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html

2、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

3、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转


GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html

4、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

· 文末祝福 ·

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/31 7:50:57

Qwen-Image-2512-ComfyUI功能测评:复杂指令也能精准执行

Qwen-Image-2512-ComfyUI功能测评&#xff1a;复杂指令也能精准执行 1. 引言&#xff1a;图像编辑的“自然语言革命” 在内容创作日益高频的今天&#xff0c;图像修改已成为电商、广告、社交媒体等领域的日常刚需。传统图像处理依赖Photoshop等专业工具&#xff0c;操作门槛高…

作者头像 李华
网站建设 2026/7/20 21:50:50

Z-Image-Turbo快捷启动脚本:一键完成服务启动与日志输出

Z-Image-Turbo快捷启动脚本&#xff1a;一键完成服务启动与日志输出 1. Z-Image-Turbo_UI界面概述 Z-Image-Turbo 是一款基于深度学习的图像生成工具&#xff0c;集成了高效的模型推理与直观的图形化操作界面&#xff08;Gradio UI&#xff09;&#xff0c;旨在为用户提供低门…

作者头像 李华
网站建设 2026/8/7 5:13:28

3步搞定cv_unet_image-matting部署:镜像开箱即用实战教程

3步搞定cv_unet_image-matting部署&#xff1a;镜像开箱即用实战教程 1. 引言 随着AI图像处理技术的快速发展&#xff0c;智能抠图已成为内容创作、电商设计、证件照制作等场景中的刚需功能。传统手动抠图效率低、成本高&#xff0c;而基于深度学习的自动抠图方案正逐步成为主…

作者头像 李华
网站建设 2026/8/7 5:13:33

cv_unet_image-matting怎么用剪贴板粘贴?快捷操作实战教程

cv_unet_image-matting怎么用剪贴板粘贴&#xff1f;快捷操作实战教程 1. 引言 随着AI图像处理技术的快速发展&#xff0c;基于U-Net架构的智能抠图工具已成为设计师、电商运营和内容创作者的必备利器。cv_unet_image-matting 是一款由开发者“科哥”基于深度学习模型二次开发…

作者头像 李华
网站建设 2026/8/8 8:58:44

Qwen2.5支持泰语输入输出?东南亚语言实测与调优建议

Qwen2.5支持泰语输入输出&#xff1f;东南亚语言实测与调优建议 1. 背景与测试目标 随着大语言模型在全球范围内的广泛应用&#xff0c;多语言支持能力已成为衡量其国际化水平的重要指标。特别是在东南亚市场&#xff0c;泰语作为使用人口超过7000万的官方语言&#xff0c;在…

作者头像 李华
网站建设 2026/8/7 5:11:49

opencode离线运行教程:完全断网环境部署实战案例

opencode离线运行教程&#xff1a;完全断网环境部署实战案例 1. 引言 随着AI编程助手在开发流程中的广泛应用&#xff0c;开发者对隐私保护、模型可控性以及本地化部署的需求日益增长。OpenCode作为2024年开源的终端优先AI编码框架&#xff0c;凭借其“任意模型支持、零代码存…

作者头像 李华