60分求条
查看原帖
60分求条
652856
MaxPAN楼主2024/8/26 18:03
#include <iostream>
#include <queue>
using namespace std;
const int maxn = 2e5;

long long n,k,du[maxn + 5];
vector<int> G[maxn + 5];
bool vis[maxn + 5],vis2[maxn + 5];
queue<int> q;

void tuobu(){
	for(int i = 1;i <= n; i++) if(du[i] == 1 && !vis[i]) q.push(i),vis2[i] = true;
	while(!q.empty()){
		int x = q.front();
		q.pop();
		for(auto v : G[x]){
//			cout << x << ":" << v << endl;
			du[v]--;
			if(du[v] == 1 && !vis[v]) q.push(v),vis2[v] = true;
		}
	}
}

int main(){
	cin >> n;
	for(int i = 1;i <= n; i++){
		int s;
		cin >> s;
		vis[i] = s;
	}
	for(int i = 1;i < n; i++){
		int u,v;
		cin >> u >> v;
		du[u]++,du[v]++;
		G[u].push_back(v),G[v].push_back(u);
	}
//	memset(vis,false,sizeof(vis));
	tuobu();
	int cnt = n;
	for(int i = 1;i <= n; i++){
		cnt -= (int)(vis2[i] || vis[i]);
//		cout << vis2[i] << " " << vis[i] << endl;
	}
	cout << cnt << endl;
	
	return 0;
}
/*
10
1 1 0 0 1 1 0 0 0 1
1 2
1 3
1 4
1 5
2 6
2 7
3 8
6 9
6 10
*/

# 42 混凝土 没过求条

2024/8/26 18:03
加载中...