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

Posted 红洋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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. }




以上是关于[2016-03-19][UVALive][3902][Network]的主要内容,如果未能解决你的问题,请参考以下文章

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

[2016-03-19][UVALive][3027][Corporative Network]

[2016-03-19][UVA][11462][Age Sort]

[2016-03-19][UVA][11549][Calculator Conundrum]

[2016-03-19][UVA][11520][Fill the Square]

[2016-03-19][UVA][11078][Open Credit System]