1 条题解

  • 0
    @ 2026-5-4 10:27:08

    让我们从树根开始往下看,支持附加参数 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
    上传者