Codeforces Round #321 (Div. 2) 580C Kefa and Park(dfs)
2015-09-24 19:44
615 查看
题目链接:点击打开链接
第一行给你n、m,接下来的一行有n个数,如果为1则代表这个点有cat,接下来的n-1行每行给出x、y,表示x、y相连。问你从1出发
能到达的叶子结点有几个,要求到达叶子结点的路上连续有cat的点不超过m。
a数组保存结点是否含有cat,从1这个点开始dfs,每次dfs对cat数组操作,记录连续的含有cat的点数,回溯时再判断当前结点是否满足
条件,要求结点为叶子结点且连续cat数不超过m且不是根结点。
AC代码:
第一行给你n、m,接下来的一行有n个数,如果为1则代表这个点有cat,接下来的n-1行每行给出x、y,表示x、y相连。问你从1出发
能到达的叶子结点有几个,要求到达叶子结点的路上连续有cat的点不超过m。
a数组保存结点是否含有cat,从1这个点开始dfs,每次dfs对cat数组操作,记录连续的含有cat的点数,回溯时再判断当前结点是否满足
条件,要求结点为叶子结点且连续cat数不超过m且不是根结点。
AC代码:
#include "iostream" #include "cstdio" #include "cstring" #include "algorithm" #include "vector" using namespace std; const int MAXN = 1e5 + 5; int n, m, ans, a[MAXN], cat[MAXN]; bool vis[MAXN]; vector<int> v[MAXN]; void dfs(int x) { for(int i = 0; i < v[x].size(); ++i) if(!vis[v[x][i]]) { vis[v[x][i]] = true; cat[v[x][i]] = (cat[x] + 1) * a[v[x][i]]; if(cat[v[x][i]] > m) continue; dfs(v[x][i]); } if(v[x].size() == 1 && x != 1 && cat[x] <= m) ans++; } int main(int argc, char const *argv[]) { cin >> n >> m; for(int i = 1; i <= n; ++i) cin >> a[i]; for(int i = 0; i < n - 1; ++i) { int x, y; cin >> x >> y; v[x].push_back(y); v[y].push_back(x); } vis[1] = true; cat[1] = a[1]; dfs(1); cout << ans << endl; return 0; }
相关文章推荐
- 线程池ThreadPoolExecutor使用简介
- 查看oracle当前连接数(转)
- 任务管理器的实现及源码
- mysql 获取自增id的值的方法
- Java集合框架中List接口的简单使用
- 第二章 证券投资基金概述
- Httpsqs类。
- PAT(甲级)1025
- linux mysql 命令
- android四大组件详解
- Android UI 设计之TitleBar
- 分享DCT,DST,Walsh,Hadamard,Haar和Slant图像处理程序
- spring管理属性配置文件properties——使用PropertiesFactoryBean
- 预置Chrome浏览器默认主页和书签
- A. Kefa and First Steps
- HTML5 history新特性pushState、replaceState
- 设计模式—构建器模式(Builder Pattern)
- 白话经典算法系列之八 七大排序总结篇
- POJ-3537(Crosses and Crosses)——博弈论,SG函数
- 使用Lambda与不使用Lambda表达式