Codeforces 580C Kefa and Park
2016-07-16 20:33
295 查看
题意:
给你一张n个点n-1条边的无向图,1号节点为起点,其它度为1的节点为终点,并给出那几个点有猫,问能到达多少个终点,且路上不能连续经过m只猫。
思路:
先把无向图建成一颗树,然后从1号节点开始往下深搜,看最后能搜到几个叶子节点就是答案了。
给你一张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; }
相关文章推荐
- 23 从上往下打印二叉树
- iOS - 类扩展与分类的区别
- python 在不同层级目录import 模块的方法
- 【Android】另一种Tab的实现--TabLayout
- 探秘Tomcat——连接器和容器的优雅启动
- 2016.7.16逻辑运算符以及指针
- linux 下安装jdk
- 链表头结点存在的意义
- Android之生产者与消费者
- Codeforces 580B Kefa and Company
- 求a,b两数的最大公约数的两种方法
- si4438 与 si4432通讯
- Java 8中一些常用的全新的函数式接口
- 九度OJ 1051 数字阶梯求和
- for for-in foreach 循环
- Android之SurfaceView学习(一)
- swift中解决循环引用的方法
- Visual Studio中NativeViewer and Image Watch插件的使用
- vs2010 solidworks2015 c# add-in模板 二次开发
- Centos6.5+Python2.7 +ffmpeg+opencv2自动安装脚本