Kefa and Park - 洛谷
Problem - 580C - Codeforces

Examples
input
4 1
1 1 0 0
1 2
1 3
1 4 
output
2 
input
7 1
1 0 1 1 0 0 0
1 2
1 3
2 4
2 5
3 6
3 7 
output
2 

解析:
dfs遍历,记录前一个结点权值是否为1,并且累计路径1的个数。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int n,m,a[N],res;
vector<int>e[N];
void dfs(int u,int cnt,int f,int fa){
	if(f) cnt+=a[u];
	else cnt=a[u];
	if(cnt>m) return;
	if(e[u].size()==1&&e[u][0]==fa) res++;
	for(int i=0;i<e[u].size();i++){
		if(e[u][i]!=fa) dfs(e[u][i],cnt,a[u],u);
	}
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	for(int i=1;i<n;i++){
		int x,y;
		scanf("%lld%lld",&x,&y);
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs(1,0,0,-1);
	printf("%lld",res);
	return 0;
} 
                

![[Linux调查局] 编译过程](https://img-blog.csdnimg.cn/1242d345e70e4d28a6af29a1e18759d0.png)
















