SGU 216 Royal Federation(构造)

港控/mmm° 2022-03-29 08:42 264阅读 0赞

题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=216

题意:一个树,将其分成n块,每块的大小大于等于B小于等于3B。为每块选择一个点x,x可以在这个块内也可以不在。x必须满足:x到块内的任意一点的路径包含的点(不包括x自己)都要是这个块内的点。

思路:从1号点开始DFS,并记录每个孩子的块的大小。若某些孩子的大小大于等于B,则将其分为一块。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <string.h>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <vector>
  7. #include <queue>
  8. #include <set>
  9. #include <stack>
  10. #include <string>
  11. #include <map>
  12. #define max(x,y) ((x)>(y)?(x):(y))
  13. #define min(x,y) ((x)<(y)?(x):(y))
  14. #define abs(x) ((x)>=0?(x):-(x))
  15. #define i64 long long
  16. #define u32 unsigned int
  17. #define u64 unsigned long long
  18. #define clr(x,y) memset(x,y,sizeof(x))
  19. #define CLR(x) x.clear()
  20. #define ph(x) push(x)
  21. #define pb(x) push_back(x)
  22. #define Len(x) x.length()
  23. #define SZ(x) x.size()
  24. #define PI acos(-1.0)
  25. #define sqr(x) ((x)*(x))
  26. #define FOR0(i,x) for(i=0;i<x;i++)
  27. #define FOR1(i,x) for(i=1;i<=x;i++)
  28. #define FOR(i,a,b) for(i=a;i<=b;i++)
  29. #define DOW0(i,x) for(i=x;i>=0;i--)
  30. #define DOW1(i,x) for(i=x;i>=1;i--)
  31. #define DOW(i,a,b) for(i=a;i>=b;i--)
  32. using namespace std;
  33. void RD(int &x){scanf("%d",&x);}
  34. void RD(i64 &x){scanf("%I64d",&x);}
  35. void RD(u32 &x){scanf("%u",&x);}
  36. void RD(double &x){scanf("%lf",&x);}
  37. void RD(int &x,int &y){scanf("%d%d",&x,&y);}
  38. void RD(i64 &x,i64 &y){scanf("%I64d%I64d",&x,&y);}
  39. void RD(u32 &x,u32 &y){scanf("%u%u",&x,&y);}
  40. void RD(double &x,double &y){scanf("%lf%lf",&x,&y);}
  41. void RD(int &x,int &y,int &z){scanf("%d%d%d",&x,&y,&z);}
  42. void RD(i64 &x,i64 &y,i64 &z){scanf("%I64d%I64d%I64d",&x,&y,&z);}
  43. void RD(u32 &x,u32 &y,u32 &z){scanf("%u%u%u",&x,&y,&z);}
  44. void RD(double &x,double &y,double &z){scanf("%lf%lf%lf",&x,&y,&z);}
  45. void RD(char &x){x=getchar();}
  46. void RD(char *s){scanf("%s",s);}
  47. void RD(string &s){cin>>s;}
  48. void PR(int x) {printf("%d\n",x);}
  49. void PR(i64 x) {printf("%I64d\n",x);}
  50. void PR(u32 x) {printf("%u\n",x);}
  51. void PR(double x) {printf("%.4lf\n",x);}
  52. void PR(char x) {printf("%c\n",x);}
  53. void PR(char *x) {printf("%s\n",x);}
  54. void PR(string x) {cout<<x<<endl;}
  55. const int N=10005;
  56. stack<int> st;
  57. vector<int> G[N];
  58. int a[N][2],n,B,color[N],num,s[N];
  59. void DFS(int u,int pre)
  60. {
  61. st.push(u);
  62. int i,v,temp=0;
  63. FOR0(i,SZ(G[u]))
  64. {
  65. v=G[u][i];
  66. if(v==pre) continue;
  67. DFS(v,u);
  68. temp+=s[v];
  69. if(temp<B) continue;
  70. num++;
  71. a[num][0]=u;
  72. a[num][1]=temp;
  73. while(st.top()!=u)
  74. {
  75. color[st.top()]=num;
  76. st.pop();
  77. }
  78. temp=0;
  79. }
  80. s[u]=1+temp;
  81. }
  82. void print()
  83. {
  84. if(n<B)
  85. {
  86. puts("0");
  87. return;
  88. }
  89. int i,j,k;
  90. if(n<=3*B)
  91. {
  92. puts("1");
  93. FOR1(i,n) printf("%d ",1);
  94. puts("1");
  95. return;
  96. }
  97. FOR1(i,n) if(!color[i])
  98. {
  99. a[num][1]++;
  100. color[i]=num;
  101. }
  102. FOR1(i,num) if(a[i][1]<B||a[i][1]>3*B)
  103. {
  104. puts("0");
  105. return;
  106. }
  107. PR(num);
  108. FOR1(i,n) printf("%d ",color[i]);puts("");
  109. FOR1(i,num) printf("%d ",a[i][0]);
  110. puts("");
  111. }
  112. int main()
  113. {
  114. RD(n,B);
  115. int i,u,v;
  116. FOR1(i,n-1)
  117. {
  118. RD(u,v);
  119. G[u].pb(v);
  120. G[v].pb(u);
  121. }
  122. DFS(1,-1);
  123. print();
  124. return 0;
  125. }

  

发表评论

表情:
评论列表 (有 0 条评论,264人围观)

还没有评论,来说两句吧...

相关阅读

    相关 HDFS Federation

    ![20180129204022897595.png][] 多个NN共用一个集群里的存储资源,每个NN都可以单独对外提供服务。每个NN都会定义一个存储池,有单独的id,每个D

    相关 SGU--199 beautiful people

    题意: 一个土豪俱乐部里面的人勾心斗角,如果他们两个各有长处,则彼此不服气,如果一方完全弱于另一方则对其服服帖帖;给出你每个人的特征值,这里仅两个。S代表Strength,B