P10723 [GESP202406 七级] 黑白翻转
题目背景
对应的选择、判断题:https://ti.luogu.com.cn/problemset/1155
题目描述
小杨有一棵包含 n n n 个节点的树,这棵树上的任意一个节点要么是白色,要么是黑色。小杨认为一棵树是美丽树当且仅当在删除所有白色节点之后,剩余节点仍然组成一棵树。
小杨每次操作可以选择一个白色节点将它的颜色变为黑色,他想知道自己最少要执行多少次操作可以使得这棵树变为美丽树。
输入格式
第一行包含一个正整数 n n n,代表树的节点数。
第二行包含 n n n 个非负整数 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,…,an,其中如果 a i = 0 a_i=0 ai=0,则节点 i i i 的颜色为白色,否则为黑色。
之后 n − 1 n-1 n−1 行,每行包含两个正整数 x i , y i x_i,y_i xi,yi,代表存在一条连接节点 x i x_i xi 和 y i y_i yi 的边。
输出格式
输出一个整数,代表最少执行的操作次数。
输入输出样例 #1
输入 #1
5
0 1 0 1 0
1 2
1 3
3 4
3 5
输出 #1
2
说明/提示
样例解释
将节点 1 1 1 和 3 3 3 变为黑色即可使这棵树变为美丽树,此时删除白色节点 5 5 5,剩余黑色节点仍然组成一棵树。
数据范围
| 子任务编号 | 数据点占比 | n n n | a i a_i ai | 特殊条件 |
|---|---|---|---|---|
| 1 1 1 | 30 % 30\% 30% | ≤ 10 5 \leq 10^5 ≤105 | 0 ≤ a i ≤ 1 0\leq a_i\leq 1 0≤ai≤1 | 树的形态为一条链 |
| 2 2 2 | 30 % 30\% 30% | ≤ 10 5 \leq 10^5 ≤105 | 0 ≤ a i ≤ 1 0\leq a_i\leq 1 0≤ai≤1 | 只有两个节点颜色为黑色 |
| 3 3 3 | 40 % 40\% 40% | ≤ 10 5 \leq 10^5 ≤105 | 0 ≤ a i ≤ 1 0\leq a_i\leq 1 0≤ai≤1 |
对于全部数据,保证有 1 ≤ n ≤ 10 5 1\leq n\leq 10^5 1≤n≤105, 0 ≤ a i ≤ 1 0\leq a_i\leq 1 0≤ai≤1。
C++实现
#include <bits/stdc++.h>
using namespace std;
bool color[100005];
int ans, n;
vector <int> e[100005];
bool dfs(int x, int fa) {
bool t = 0;
for (int i = 0; i < e[x].size(); i++) {
int to = e[x][i];
if (to != fa && dfs(to, x)) t = 1;
}
if (!color[x] && t) ans++;
return (color[x] || t);
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> color[i];
for (int i = 1; i < n; i++) {
int x, y;
cin >> x >> y;
e[x].push_back(y); e[y].push_back(x);
}
int x = -1;
for (int i = 1; i <= n; i++)
if (color[i]) { // 找到黑色点
x = i; break;
}
dfs(x, 0);
cout << ans;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥题 P10723 GESP202406 七级 黑白翻转&spm=1001.2101.3001.5002&articleId=163407784&d=1&t=3&u=3dbfd6c2378c4512b47b69a0ed6483e4)
1181

被折叠的 条评论
为什么被折叠?



