CF580C Kefa and Park

本来以为是一个很简单的剪枝,谁知道一直过不去。

本来想通过判断入度等于一的点来判断是否为叶子节点,但这样是不正确的,因为可以构造出两点一边的数据,使得根节点的入度也为1,于是终于过了。

#include<iostream>
#include<vector>
using namespace std;
int n, m, a[500000], vis[500000], ans = 0,rd[500000];
vector<int>q[500000];
void dfs(int at, int now) {
    if (now == m + 1)return;
    if (rd[at] == 1 && at != 1) {
        ans++;
        return;
    }
    for (auto i = q[at].begin(); i != q[at].end(); i++) {
        if (!vis[*i]) {
            vis[*i] = 1;
            if (a[*i]) {
                dfs(*i, now + 1);
            }
            else dfs(*i,0);
            vis[*i] = 0;
        }
    }
}
int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 1; i < n; i++) {
        int at, to;
        cin >> at >> to;
        q[at].push_back(to);
        q[to].push_back(at);
        rd[at]++; rd[to]++;
    }
    vis[1] = 1;
    dfs(1,a[1]);
    cout << ans;
    return 0;
}

 

上一篇:使用ZIP进行多文件保存和读取


下一篇:微软毒瘤 Windows defender 彻底删除工具