题意:一棵以1为根的树,树上有些点是红的。一个叶子是合法的当且仅当从根到它的路径上出现的连续红点个数不超过m。求有多少个叶子是合法的。
题解:很单纯的dfs,注意判断叶子结点的条件是,这点的父节点已被访问(这个必须要有,不判断一下父节点是否访问过的话,在只有两个节点的情况下会把根节点错误地当作叶子结点),且这个结点只有一个连向父节点的边。
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
int ans=0,n,m,red[maxn],mp[maxn],vis[maxn];
vector<int>g[maxn];
void dfs(int u,int isRed,int cnt,int fa,int cntt) {
vis[u]=1;
if(g[u].size()==1&&vis[g[u][0]]&&cntt<=m) {//判断叶子节点的条件是这个点只有一个连接点,且那个连接点已被访问过
ans++;
return;
}
for(int i=0; i<g[u].size(); i++) {
int v=g[u][i];
if(v==fa)continue;
if(red[v]==1) dfs(v,red[v],cnt+1,u,max(cntt,cnt+1));
else dfs(v,red[v],0,u,cntt);
}
return;
}
int main() {
cin>>n>>m;
for(int i=1; i<=n; i++)cin>>red[i];
for(int i=1; i<=n-1; i++) {
int x,y;
cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
}
if(red[1]==1)dfs(1,red[1],1,-1,1);
else dfs(1,red[1],0,-1,0);
cout<<ans<<endl;
}