fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 2e5 + 5;
  5. int deg[N];
  6. int A[N];
  7. vector<int> adj[N];
  8. int n, m;
  9.  
  10. int dfs(int u, int k, int p = -1) {
  11. // leaf node
  12. if (deg[u] == 1 && p != -1 && k <= m) {
  13. return 1;
  14. }
  15.  
  16. // more than m consecutive cats on current path
  17. if (k > m) {
  18. return 0;
  19. }
  20.  
  21. int ret = 0;
  22. for (auto& v : adj[u]) {
  23. if (v == p) continue;
  24. if (A[v]) {
  25. ret += dfs(v, k + 1, u);
  26. } else {
  27. ret += dfs(v, 0, u);
  28. }
  29. }
  30. return ret;
  31. }
  32.  
  33. int main() {
  34. cin >> n >> m;
  35. for (int i = 1; i <= n; i++) {
  36. cin >> A[i];
  37. }
  38. for (int i = 0; i < n - 1; i++) {
  39. int u, v;
  40. cin >> u >> v;
  41. deg[u]++;
  42. deg[v]++;
  43. adj[u].push_back(v);
  44. adj[v].push_back(u);
  45. }
  46. cout << dfs(1, A[1]) << endl;
  47. }
Success #stdin #stdout 0.01s 8540KB
stdin
4 1
1 1 0 0
1 2
1 3
1 4
stdout
2