码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 杭电多校6 F - Maex (树形DP)


     input:

    3
    5
    1 2
    3 2
    1 5
    4 1
    3
    1 2
    2 3
    1

    output:

    8
    6
    1
    

    题目大意:给我们一棵树,让我们给树上的每个结点设计一个权值,对于每个结点i有这样一个定义:b[i]是以i为根节点的子树中最小的没有出现过的非负整数,让我们求出所有结点b数组的值之和最大是多少。

    解题思路:因为b数组是对应子树中没有出现过的最小的非负整数,而最小的非负整数是0,所以为了让b数组的值尽可能大,一棵子树中应该尽可能包含0,1,2,3……这种按顺序从大到小的数字,并且数字越小就越应该放在更底层的子树中,这样就保证了从底层往上,结点对应b数组的值就越来越大,而我们可以发现b数组的值恰好就是以该点为根的子树中结点的数目,所以我们的思路就是在树中找一条链,使得分别以这条链上每一个结点为根的子树大小之和最大,所以我们可以先dfs预处理出以该点为根的子树中包含的结点数目,然后再进行第二遍dfs得到一条链上所能获得的最大权值之和。

    上代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. using namespace std;
    7. const int N=5e5+10;
    8. int a[N],n,h[N],e[N<<1],ne[N<<1],idx,depth[N];
    9. void add(int u,int v)
    10. {
    11. e[idx]=v;
    12. ne[idx]=h[u];
    13. h[u]=idx++;
    14. }
    15. long long dp[N],du[N],ans=-0x3f3f3f3f,maxv[N];
    16. void dfs(int u,int fa)
    17. {
    18. dp[u]=1;
    19. for(int i=h[u];i!=-1;i=ne[i])
    20. {
    21. int j=e[i];
    22. if(j==fa)
    23. continue;
    24. dfs(j,u);
    25. dp[u]+=dp[j];
    26. }
    27. }
    28. void dfs_u(int u,int fa)
    29. {
    30. if(fa==-1)
    31. maxv[u]=dp[u];
    32. else
    33. maxv[u]=dp[u]+maxv[fa];
    34. if(du[u]==1)
    35. {
    36. ans=max(ans,maxv[u]);
    37. }
    38. for(int i=h[u];i!=-1;i=ne[i])
    39. {
    40. int j=e[i];
    41. if(j==fa)
    42. continue;
    43. dfs_u(j,u);
    44. }
    45. }
    46. int main()
    47. {
    48. ios::sync_with_stdio(false);
    49. cin.tie(0);
    50. cout.tie(0);
    51. int t;
    52. cin>>t;
    53. while(t--)
    54. {
    55. cin>>n;
    56. if(n==1)
    57. {
    58. cout<<1<
    59. continue;
    60. }
    61. memset(h,-1,sizeof h);
    62. memset(du,0,sizeof du);
    63. memset(maxv,0,sizeof maxv);
    64. memset(dp,0,sizeof dp);
    65. idx=0;
    66. ans=-0x3f3f3f3f;
    67. for(int i=1;i
    68. {
    69. int u,v;
    70. cin>>u>>v;
    71. add(u,v);
    72. du[v]++;
    73. add(v,u);
    74. du[u]++;
    75. }
    76. dfs(1,-1);
    77. dfs_u(1,-1);
    78. cout<
    79. }
    80. return 0;
    81. }

  • 相关阅读:
    交通流预测——day59 交通网络动态性与多权重交通图卷积(MW-TGC)网络的交通预测
    Python自动化操作:简单、有趣、高效!解放你的工作流程!
    探画系统探画系统开发源码分享
    【论文笔记】基于视觉特征提取的强化学习自动驾驶系统
    Using sunbeam to deploy openstack (by quqi99)
    Clickhouse—MergeTree 数据生命周期
    Red Hat 8 启动没有进入GUI图形界面
    从2PC和容错共识算法讨论zookeeper中的Create请求
    Java实现单链表
    时间滑动窗口限制请求次数
  • 原文地址:https://blog.csdn.net/weixin_54562114/article/details/126179256
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号