题目链接:点击打开链接
第一行给你n、m,接下来的一行有n个数,如果为1则代表这个点有cat,接下来的n-1行每行给出x、y,表示x、y相连。问你从1出发
能到达的叶子结点有几个,要求到达叶子结点的路上连续有cat的点不超过m。
a数组保存结点是否含有cat,从1这个点开始dfs,每次dfs对cat数组操作,记录连续的含有cat的点数,回溯时再判断当前结点是否满足
条件,要求结点为叶子结点且连续cat数不超过m且不是根结点。
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "vector"
using namespace std;
const int MAXN = 1e5 + 5;
int n, m, ans, a[MAXN], cat[MAXN];
bool vis[MAXN];
vector<int> v[MAXN];
void dfs(int x)
{
for(int i = 0; i < v[x].size(); ++i)
if(!vis[v[x][i]]) {
vis[v[x][i]] = true;
cat[v[x][i]] = (cat[x] + 1) * a[v[x][i]];
if(cat[v[x][i]] > m) continue;
dfs(v[x][i]);
}
if(v[x].size() == 1 && x != 1 && cat[x] <= m) ans++;
}
int main(int argc, char const *argv[])
{
cin >> n >> m;
for(int i = 1; i <= n; ++i)
cin >> a[i];
for(int i = 0; i < n - 1; ++i) {
int x, y;
cin >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
}
vis[1] = true;
cat[1] = a[1];
dfs(1);
cout << ans << endl;
return 0;
}