您的位置:首页 > 其它

Codeforces 580C Kefa and Park

2016-07-16 20:33 295 查看
题意:

给你一张n个点n-1条边的无向图,1号节点为起点,其它度为1的节点为终点,并给出那几个点有猫,问能到达多少个终点,且路上不能连续经过m只猫。

思路:

先把无向图建成一颗树,然后从1号节点开始往下深搜,看最后能搜到几个叶子节点就是答案了。

#include<cstdio>
#include<vector>
using namespace std;

const int MAX=100005;
int n,m,fa[MAX],a[MAX],ans;
vector<int> gr[MAX];

void DFS1(int u,int f){
fa[u]=f;
int nc=gr[u].size();
for(int i=0;i<nc;i++){
int v=gr[u][i];
if(v!=f) DFS1(v,u);
}
}

void DFS2(int u,int f,int num){
if(num>m) return;
int nc=gr[u].size();
if(nc==1&&gr[u][0]==f){
ans++;
return;
}
for(int i=0;i<nc;i++){
int v=gr[u][i];
if(v!=f){
if(a[v]) DFS2(v,u,num+a[v]);
else DFS2(v,u,a[v]);
}
}
}

void solve(){
ans=0;
DFS2(1,-1,a[1]);
}

int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
gr[i].clear();
}
for(int i=1;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
gr[u].push_back(v);
gr[v].push_back(u);
}
DFS1(1,-1);
solve();
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: