传送门: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; }