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

发表评论

邮箱地址不会被公开。 必填项已用*标注