树形dp HDU6867 Tree

男娘i 2022-11-29 03:03 257阅读 0赞

题目链接

多校,怎么越来越难了,是我变菜了吗。

不多说,这是一道树形dp的题目,AC代码如下。

AC代码
  1. #include <cstdio>
  2. using namespace std;
  3. const int max_n=500000;
  4. int n,tot;
  5. long long ans;
  6. int v[max_n+1],nxt[max_n+1],h[max_n+1],dep[max_n+1],siz[max_n+1];
  7. // 其实我一般不写快读,这里参考一下,留一个模板。
  8. // 万一哪次用到了呢
  9. int readint()
  10. {
  11. int x=0,f=1;
  12. char ch=getchar();
  13. // 判断是否负数
  14. while(ch<'0' || ch>'9')
  15. {
  16. if(ch=='-')
  17. {
  18. f=-1;
  19. }
  20. ch=getchar();
  21. }
  22. // 读入数字
  23. while(ch>='0' && ch<='9')
  24. {
  25. x=x*10+ch-'0';
  26. ch=getchar();
  27. }
  28. // 一定要返回带符号的数字
  29. return x*f;
  30. }
  31. void init()
  32. {
  33. for(int i=1;i<=n;++i)
  34. {
  35. h[i]=0;
  36. }
  37. tot=0;
  38. ans=0;
  39. dep[1]=0;
  40. }
  41. void dfs1(int u)
  42. {
  43. siz[u]=1;
  44. for(int p=h[u];p;p=nxt[p])
  45. {
  46. dep[v[p]]=dep[u]+1;
  47. dfs1(v[p]);
  48. siz[u]+=siz[v[p]];
  49. }
  50. }
  51. template<typename T> bool chkmax(T &x,T y)
  52. {
  53. if(x<y)
  54. {
  55. x=y;
  56. return true;
  57. }
  58. return false;
  59. }
  60. void dfs2(int u,long long k)
  61. {
  62. // 预定义了一个这样的东西
  63. chkmax(ans,k);
  64. for(int p=h[u];p;p=nxt[p])
  65. {
  66. dfs2(v[p],k+n-siz[v[p]]);
  67. }
  68. }
  69. int main()
  70. {
  71. int T=readint();
  72. while(T--)
  73. {
  74. n=readint();
  75. init();
  76. // 读入树
  77. for(int i=2;i<=n;++i)
  78. {
  79. int k=readint();
  80. v[++tot]=i;
  81. nxt[tot]=h[k];
  82. h[k]=tot;
  83. }
  84. dfs1(1);
  85. dfs2(1,0);
  86. for(int i=1;i<=n;++i)
  87. {
  88. ans+=siz[i];
  89. }
  90. printf("%lld\n",ans);
  91. }
  92. return 0;
  93. }

发表评论

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

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

相关阅读

    相关 HDU 6613 Squrirrel 树形dp

    题意:给你一颗树,你可以把这棵树上的一条边的边权变为0,现在让你选一个根,让所有点到这个点的最大距离尽量的小。如果有多个根的最大距离距离相同,输出编号最小的边。 思路:如果没

    相关 树形dp HDU6867 Tree

    [题目链接][Link 1] 多校,怎么越来越难了,是我变菜了吗。 不多说,这是一道树形dp的题目,AC代码如下。 AC代码 include <cstdio