题目链接:Codeforces - Kefa and Park
显然,1到叶子节点路径都是固定的,存一下到每个点的连续1的个数即可。
然后BFS
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e5+10;
int n,m,a[N],res,dp[N];
vector<int> g[N];
inline void add(int a,int b){g[a].push_back(b),g[b].push_back(a);}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1,a,b;i<n;i++) scanf("%d %d",&a,&b),add(a,b);
queue<int> q; q.push(1); memset(dp,-1,sizeof dp); dp[1]=a[1];
while(q.size()){
int u=q.front(); q.pop();
if(g[u].size()==1&&u!=1) res++;
for(auto to:g[u]) if(dp[to]==-1&&dp[u]+a[to]<=m){
if(a[to]) dp[to]=a[to]+dp[u];
else dp[to]=0;
q.push(to);
}
}
cout<<res;
return 0;
}