[2016-03-19][UVALive][3902][Network]

  • 时间:2016-03-19 18:41:09 星期六

  • 题目编号:[2016-03-19][UVALive][3902][Network]

  • 题目大意:给定一个树状的图,一个服务器能覆盖k范围内的人,已知一个服务器的位置,问至少需要多少个服务器才能覆盖所有的叶子节点

  • 分析:

    • 以第一个服务器的点为根,把无根树转换为有根树
    • 要使每个叶子节点都被覆盖,那么叶子节点的k级祖先内必须有一个服务器
    • 要使服务器最少,服务器应该放在最远的位置
  • 方法:

    • dfs1得到每层深度的节点(k层以内的就不用记录),同时记录每个节点的父节点(为了后面求k级祖先)
    • 从最深的节点开始,往上第k级祖先放置服务器,在服务器出再一次dfs2,把覆盖的点都覆盖上
  1. #include <vector>
  2. #include <cstring>
  3. #include <cstdio>
  4. using namespace std;
  5. #define CLR(x,y) memset((x),(y),sizeof((x)))
  6. #define FOR(x,y,z) for(int (x)=(y);(x)<(z);++(x))
  7. #define FORD(x,y,z) for(int (x)=(y);(x)>=(z);--(x))
  8. const int maxn = 1000 + 10;
  9. const int maxe = maxn * (maxn - 1);
  10. int n,s,k,fa[maxn],covered[maxn];
  11. vector<int> nodes[maxn];
  12. vector<int> g[maxn];
  13. void dfs(int u,int f,int d){
  14. fa[u] = f;
  15. int nc = g[u].size();
  16. //叶子节点
  17. if(nc == 1 && d > k) nodes[d].emplace_back(u);
  18. FOR(i,0,nc){
  19. int v = g[u][i];
  20. if(v != f) dfs(v,u,d + 1);
  21. }
  22. }
  23. void dfs2(int u,int f,int d){
  24. covered[u] = 1;
  25. int nc = g[u].size();
  26. FOR(i,0,nc){
  27. int v = g[u][i];
  28. if(v != f && d < k) dfs2(v,u,d+1);
  29. }
  30. }
  31. int solve(){
  32. int ans = 0;
  33. CLR(covered,0);
  34. FORD(d,n-1,k + 1){
  35. int tmpsize = nodes[d].size();
  36. FOR(i,0,tmpsize){
  37. int u = nodes[d][i];
  38. if(covered[u]) continue;
  39. int v = u;
  40. FOR(j,0,k) v = fa[v];
  41. dfs2(v,-1,0);
  42. ++ans;
  43. }
  44. }
  45. return ans;
  46. }
  47. int main(){
  48. int t,u,v;
  49. scanf("%d",&t);
  50. while(t--){
  51. scanf("%d%d%d",&n,&s,&k);
  52. FOR(i,1,n+1){
  53. g[i].clear();
  54. nodes[i].clear();
  55. }
  56. FOR(i,0,n - 1){
  57. scanf("%d%d",&u,&v);
  58. g[u].emplace_back(v);
  59. g[v].emplace_back(u);
  60. }
  61. dfs(s,-1,0);
  62. printf("%d\n",solve());
  63. }
  64. return 0;
  65. }

来自为知笔记(Wiz)

时间: 2024-08-23 23:33:34

[2016-03-19][UVALive][3902][Network]的相关文章

Murano Weekly Meeting 2016.07.19

Meeting time: 2016.July.19 1:00~2:00 Chairperson:  Kirill Zaitsev, from Mirantis Meeting summary: 1.Backports Link:  https://etherpad.openstack.org/p/murano-stable-backports/ 2.Convergence so both of our CI servers are running heat with convergence n

2016.1.19 DEV Express控件GirdControl使用

DEV控件在工具箱中消失处理方法 开始-->程序-->Developer Express v2009 vol 3(依据版本不同)-->Components-->Tools-->ToolboxCreator   1.点击一行选择完整一行 Run Designer->View->OptionsBehavior->EditorShowMode 设置为:Click Run Designer->View->OptionsSelection.EnableAp

分布式技术一周技术动态 2016.03.20

分布式系统实践 1. 基于Mesos和Docker的分布式计算平台 https://mp.weixin.qq.com/s?__biz=MzAxMDgzOTA2Mw==&mid=402769128&idx=1&sn=cea3ad1357bd9312acf1768c0a493bfd&scene=1&srcid=0318BTuxT0fsFYwPjpeyuDOa&key=710a5d99946419d90fbc1e7600cce055b6e997d6afafc74c

Live Archive 3902 Network 【持续更新】

3902 - Network Asia - Seoul - 2007/2008 Consider a tree network with n nodes where the internal nodes correspond to servers and the terminal nodes correspond to clients. The nodes are numbered from 1 to n . Among the servers, there is an original ser

UVALive - 3027Corporative Network(带权并查集)

题目: UVALive - 3027Corporative Network(带权并查集) 题目大意:有n和节点,初始时每个节点的父节点都不存在,然后有下面两种操作:I 操作 I a,b 将a的父节点变成b.E操作 E a,查询a到它的父节点的距离. 解题思路:带权并查集.注意这里距离的变化是a -> b,那么a到根节点的距离就是a到b的距离的绝对值 % 1000 + b到它的根节点的距离. 代码: #include <cstdio> #include <cstring> #i

翻译:Gregory Larsen,2016/02/19(第一版:2014年12月17日)高级T-SQL阶梯1级:使用CROSS JOIN介绍高级T-SQL

原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/119933/ 原文作者:Gregory Larsen,2016/02/19(第一版:2014年12月17日) 系列 本文是"Stairway Series:Stairway to Advanced T-SQL"的一部分 这个阶梯将包含一系列文章,这些文章将在前面两个T-SQL阶梯,T-SQL DML和T-SQL超越基础知识的T-SQL基础上进行扩展. 这个楼梯应

uboot.2016.03 在mini2440上norfalsh启动

本人有点懒惰,直接在smdk2410的基础上进行修改 (note :红色字体表示修改内容,蓝色字体表示增加内容) 1. 顶层的makefile 在247行 添加如下两条语句 :   ARCH :=arm     CROSS_COMPILE :=arm-linux- 2 修改始终频率 打开 u-boot-2016.03/arch/arm/cpu/arm920t/start.S 第77行 #if defined(CONFIG_S3C2410) #if defined(CONFIG_S3C2440)

2016.8.19

2016年8月19日.在杭州整整两个月.最近新添加了几个前端群.有一个群感觉特别的靠谱.很多分享.很多技术.给我的感觉有种干海绵碰到了大量的水.可能是做技术的对技术方面的渴求的这种感觉.老实说.之前对自己的技术是真的自信到不行.但是慢慢的,一些经历和经验.让自己对自己的判断越来越不像之前的那种浮夸感了.毕竟自己的经验还不够充足.资历就摆在这里.今天想到一句话.坐井观天,焉知是天? 勉励一下自己.希望能够不断前进.在努力和学习中不断攀高. 最后送一句:人生之所以迷茫,是因为我们的才华配不上我们的梦

2016/09/19

1. Python视频 1) 多层装饰器 USER_INFO = {} def check_login(func): def inner(*args, **kwargs): if USER_INFO.get('is_login', None): ret = func(*args, **kwargs) return ret else: print('please login') return inner def check_admin(func): def inner(*args, **kwarg