您的位置:首页 > 其它

Codeforces 580C Kefa and Park 题解

2017-05-08 19:47 417 查看

题意

给定一颗以1为根的树,每个节点有一个权值(0或1),从根分别走向每个叶子节点(一直往下)且每一次至多连续经过m个权值为1的节点,问能成功到达多少叶子节点

思路

dfs时记录一下连续经过权值为1的数量,如果超过就return,否则继续往下,到叶节点计数

代码

#include <cstdio>
#include <vector>
using namespace std;
vector<int> mp[100001];
int a[100001];
int ans;
int n,m;
void dfs(int x,int cnt,int from)
{
if(a[x]==0)
cnt=0;
else cnt++;
if(cnt>m)
return;
if(mp[x].size()==1&&mp[x][0]==from)
{
ans++;
return;
}
for(int i=0;i<mp[x].size();i++)
if(mp[x][i]!=from)
dfs(mp[x][i],cnt,x);
return;
}
int main()
{
int x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n-1;i++)
{
scanf("%d%d",&x,&y);
mp[x].push_back(y);
mp[y].push_back(x);
}
dfs(1,0,0);
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: