1 条题解
-
0
让我们从树根开始往下看,支持附加参数 k --一行中遇到猫的顶点数。如果 k 超过了 m ,那么就离开。那么答案就是我们能够到达的叶子数量。
#include <bits/stdc++.h> using namespace std; const int N = 100005; vector<int> g[N]; int cat[N]; int n, m, ans = 0; void dfs(int u, int fa, int cnt) { // 如果当前连续有猫的数量已经超过 m,则剪枝 if (cnt > m) return; bool isLeaf = true; for (int v : g[u]) { if (v == fa) continue; isLeaf = false; if (cat[v] == 1) { dfs(v, u, cnt + 1); } else { dfs(v, u, 0); } } // 如果是叶子节点,并且路径上的连续猫数不超过 m,则计数 if (isLeaf) { ans++; } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; for (int i = 1; i <= n; ++i) { cin >> cat[i]; } for (int i = 0; i < n - 1; ++i) { int u, v; cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } // 从根节点 1 开始 DFS dfs(1, -1, cat[1]); cout << ans << '\n'; return 0; }
- 1
信息
- ID
- 6776
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者