http://codeforces.com/problemset/problem/580/C
主人公要到公园去玩,这个公园是一个有根树,主人公起点在点1处,其叶子节点是餐厅所在地,其中红色标记的点都是a【i】==1的点,同时表示这个点有猫.主人公害怕猫,不希望经过连续m个点都有猫的路径,问主人公可以到达哪几个餐厅。
注意几个小点:
①树的dfs判断叶子节点时可以+一个flag来判断。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn=100005;
const int INF=1<<30;
int n,m;
int cat[maxn];
vector <int> G[maxn];
bool vis[maxn];
int ans=0;
void dfs(int x,int cnt){
if (cnt>m){
return;
}
vis[x]=1;
bool flag=0; //若没有下一个节点,则本节点是叶节点
for (int i=0;i<G[x].size();i++){
int v=G[x][i];
if (!vis[v]){
flag=1;
if (cat[v]){
dfs(v,cnt+1);
}
else{
dfs(v,0);
}
}
}
if (!flag){
ans++;
}
}
int main(){
cin >> n >> m;
for (int i=1;i<=n;i++){
cin >> cat[i];
}
for (int i=0;i<n-1;i++){
int x,y;
cin >> x >> y;
G[x].push_back(y);
G[y].push_back(x);
}
dfs(1,cat[1]);
cout << ans << endl;
}