Codeforces Round #321 (Div. 2) C. Kefa and Park time limit per test
2015-11-17 13:55
309 查看
题目大意:一棵树,有的节点上有猫,有的没有。求出从根节点出发,到达叶子节点的路径中连续出现猫的数量不能超过m的路径有几条。
解题思路:DFS。细节:vector构造树时因为不知道谁是父亲节点谁是子节点,因此两个点都当做父亲节点处理。判断叶子节点时,儿子个数为1的就是叶子节点。
解题思路:DFS。细节:vector构造树时因为不知道谁是父亲节点谁是子节点,因此两个点都当做父亲节点处理。判断叶子节点时,儿子个数为1的就是叶子节点。
#include<stdio.h> #include<string.h> #include<vector> #include<algorithm> using namespace std; const int maxm=1e5+10; int vis[maxm]; int a[maxm]; vector<int>v[maxm]; int sum; int n,m; void dfs(int x,int cnt) { if(cnt>m) { return; } int len=v[x].size(); if(len==1&&x!=1) { if(a[x]) { cnt++; } if(cnt>m) { return; } sum++; return; } for(int i=0;i<len;i++) { if(vis[v[x][i]]) { continue; } else { vis[v[x][i]]=1; } if(a[x]) { dfs(v[x][i],cnt+1); } else { dfs(v[x][i],0); } } return; } int main() { while(scanf("%d%d",&n,&m)!=EOF) { int x,y; memset(vis,0,sizeof(vis)); vis[1]=1; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } for(int i=0;i<n-1;i++) { scanf("%d%d",&x,&y); v[x].push_back(y); v[y].push_back(x); } sum=0; dfs(1,0); printf("%d\n",sum); } return 0; }
相关文章推荐
- 第二篇 顾问实施ERP与医生看病过程类比
- angular中的表单验证
- iOS开发系列--通知与消息机制
- How to read Userenv Log - Part 1 Machine Policy
- JS开发HTML5游戏《神奇的六边形》(四)
- 学习笔记:模式学习-生成器模式
- boost
- IOS中通知中心(NSNotificationCenter)
- [Leetcode]Search in Rotated Sorted Array
- 网络编程-TCP状态图详细说明 没有不懂的
- 用瓶子交换汽水问题
- 普法知识(4):法(Law)从何而来?
- easyui超链接中使用session值
- Dynamically changing the linearlayout width or height on Android
- 时间给你一个缝 你就想往里转-兄弟连IT教育
- linux下c/c++实例之十三C实现的简单的线程池
- android sdcard存储方案(基于wrapfs文件系统)
- 编程基础知识之更丰富的内置类型
- spring中bean的创建
- 记:一个循环依赖的坑爹rrdtool