[GESP202406 七级] 黑白翻转
输入样例
5
0 1 0 1 0
1 2
1 3
3 4
3 5
输出样例
2
#include <iostream>
#include <vector>
using namespace std;const int N = 1e5 + 5;
vector<int> t[N];
int n, a[N], ans;// 深度优先搜索函数
void dfs(int fa, int x) {bool has_black_child = false;for (int i = 0; i < t[x].size(); i++) {if (t[x][i] != fa) {dfs(x, t[x][i]);if (a[t[x][i]] == 1) {has_black_child = true;}}}// 如果当前节点是白色且有黑色子节点,则将其变黑if (a[x] == 0 && has_black_child) {ans++;a[x] = 1;}
}int main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];}// 读取边信息for (int i = 1; i < n; i++) {int u, v;cin >> u >> v;t[u].push_back(v);t[v].push_back(u);}// 找到第一个黑色节点开始深度优先搜索for (int i = 1; i <= n; i++) {if (a[i] == 1) {dfs(0, i);break;}}// 输出最少操作次数cout << ans << endl;return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int ans;
int n;
int a[N];
vector<int> vis[N];//存储关系
void dfs(int x,int f){for(int i=0;i<vis[x].size();i++){int y=vis[x][i];if(y==f)continue;dfs(y,x);if(a[y]==1&&a[x]==0){a[x]=1;ans++;}}
}
int main(){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;vis[x].push_back(y);vis[y].push_back(x);//构建父子关系 }int k=0;for(int i=1;i<=n;i++){if(a[i]==1){k=i;break;}}dfs(k,0);//开始遍历 cout<<ans;//输出个数 return 0;
}