codeforces 338b Book of Evil
2016-01-21 13:24
281 查看
题意:树上有一个点可以覆盖距离离他d的所有点,告诉你已有多少点被覆盖,问这个点可能有几种情况
思路:从根开始搜索 构造一个数组记录深度比他深的 且已被覆盖 距离他最远的节点的距离 然后再进入搜索对于每个节点 拿到父节点离他最远的被覆盖节点的距离(不在这个节点下面) 即可求出答案
思路:从根开始搜索 构造一个数组记录深度比他深的 且已被覆盖 距离他最远的节点的距离 然后再进入搜索对于每个节点 拿到父节点离他最远的被覆盖节点的距离(不在这个节点下面) 即可求出答案
#include<cstring> #include<cstdlib> #include<iostream> #include<stdio.h> #include<cmath> #include<algorithm> #include<vector> using namespace std; #define N 100010 #define MOD 1000000009 #define LL long long vector<int> e ; int dep ; int v ; int g ; int ans,n,m,k; void dfs(int x,int fa) { for(int i=0;i<e[x].size();i++) { int to=e[x][i]; if(to==fa)continue; dfs(to,x); if(dep[to]>0||v[to]) dep[x]=max(dep[x],dep[to]+1); } } void solve(int x,int fa,int dis) { if(k>=max(dis,dep[x]))ans++; int l=0,r=0,a=0,b=0; for(int i=0;i<e[x].size();i++) { int to=e[x][i]; if(to==fa)continue; g[to]=max(dis,l>0?l+1:a); l=max(l,dep[to]); a|=v[to]; } for(int i=e[x].size()-1;i>=0;i--) { int to=e[x][i]; if(to==fa)continue; g[to]=max(g[to],r>0?r+1:b); r=max(r,dep[to]); b|=v[to]; } for(int i=0;i<e[x].size();i++) { int to=e[x][i]; if(to==fa)continue; if(g[to]>0||v[x]) solve(to,x,g[to]+1); else solve(to,x,0); } } int main() { scanf("%d%d%d",&n,&m,&k); int x,y; for(int i=0;i<m;i++) { scanf("%d",&x); v[x]=1; } for(int i=1;i<n;i++) { scanf("%d%d",&x,&y); e[x].push_back(y); e[y].push_back(x); } dfs(1,1); solve(1,1,0); printf("%d\n",ans); return 0; }
相关文章推荐
- windows update一直卡住解决方法
- Java中使用正则表达式
- Tomact8部署在linux下启动很慢详解
- 浅析IList与List的区别
- javascript多语言实现
- CComPtr用法
- 【九】注入框架RoboGuice使用:(Your First Injected Service and BroadcastReceiver)
- 探秘Java中String、StringBuilder以及StringBuffer
- PHP时间转换成24进制
- How to excute javascript on Robotframework
- 关于strtol函数(String---->Long int)
- 动态规划的一些题
- knn算法的介绍
- Dropwizart Hello World
- spring mvc 使用及json 日期转换解决方案
- python eval 函数妙用
- Python 入门之常见小问题
- 记事(三)
- 蓝牙&WiFi 智能手机无线打印全攻略
- css 浏览器兼容性hack写法