题解
2026-06-10 20:14:51
发布于:浙江
7阅读
0回复
0点赞
大家好,我是энтджей,今天是我2026年第十九次正式发题解!
能不能点个赞
首先简化题意:
- 嗯对就是没什么好简化的
然后就是写代码:
-
处理输入(read):
- 正常输入
-
核心部分(process):
- 处理每个结点,如果他的子树中和以前有黑色结点,即在两个及以上个黑色结点中间的点,要将他变成黑色,但是这样处理,会出现本来就是黑色的结点,所以我新建了一个数组,来存储染色后是否为黑色
最后输出(write):
- 输出结果
完整代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int n;
int a[N];
vector<int> ve[N];
int need[N];
bool vis[N];
void init() {
memset(vis, false, sizeof vis);
memset(need, 0, sizeof need);
}
void read() {
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> a[i];
}
for(int i = 1; i < n; i++) {
int x, y;
cin >> x >> y;
ve[x].push_back(y);
ve[y].push_back(x);
}
}
int dfs(int id) {
vis[id] = true;
int HaveBlack = a[id];
for( auto x : ve[id]) {
if(!vis[x]) {
int check = dfs(x);
if(check == 1) {
HaveBlack = 1;
need[x] = 1;
}
}
}
return HaveBlack;
}
void process() {
for(int i = 1; i <= n; i++) {
if(a[i] == 1) {
dfs(i);
break;
}
}
}
void write() {
int ans = 0;
for(int i = 1; i <= n; i++) {
if(need[i] == 1 && a[i] == 0) {
ans++;
}
}
cout << ans;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
init();
read();
process();
write();
return 0;
}
🎉完结撒花🎉
想通了就会发现绿高了
这里空空如也






有帮助,赞一个