本来以为是一个很简单的剪枝,谁知道一直过不去。
本来想通过判断入度等于一的点来判断是否为叶子节点,但这样是不正确的,因为可以构造出两点一边的数据,使得根节点的入度也为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; }