传送门:https://vjudge.net/problem/246619/origin
- 题意: 主人公要到公园去玩,这个公园是一个有根树,主人公起点在点1处,其叶子节点是餐厅所在地,其中红色标记的点都是a【i】==1的点,同时表示这个点有猫.主人公害怕猫,不希望经过连续m个点都有猫的路径,问主人公可以到达哪几个餐厅。
- 题解: dfs,注意标记以及邻接表的使用
代码:
#include <iostream>
#include<cstdlib>
#include<stdio.h>
#include<algorithm>
#include<set>
#include<vector>
#include<assert.h>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
const ll mod = 1000000007;
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }
const int maxn = 1e5+5;
vector<int>G[maxn];
int a[maxn];
bool vis[maxn];
int out,m,n;
void init(){
rep(i,1,n) G[i].clear();
memset(vis,0,sizeof(vis));
out = 0;
}
void dfs(int u,int cat){
vis[u] = 1;
if(cat>m)return ;
int flag = 0;
rep(i,0,G[u].size()-1){
int v = G[u][i];
if(!vis[v]){
flag = 1;
if(a[v]) dfs(v,cat+1);
else dfs(v,0);
}
}
if(flag==0) out++;
}
int main(){
while(~scanf("%d%d",&n,&m)){
init();
rep(i,1,n) scanf("%d", &a[i]);
rep(i,1,n-1){
int u,v;
scanf("%d%d", &u,&v);
G[u].pb(v);
G[v].pb(u);
}
dfs(1,a[1]);
printf("%d",out);
}
return 0;
}