P2607 [ZJOI2008]骑士

本题本质上就是树dp,和没有上司的舞会差不多,只不过多了一个对基环树的处理。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<string>
  4. #include<cstdio>
  5. #define ll long long
  6. using namespace std;
  7. const int maxn=2e6;
  8. int n,cnt;
  9. ll val[maxn];
  10. int root;
  11. int head[maxn];
  12. int vis[maxn];
  13. ll fa[maxn];
  14. ll f[maxn][2];
  15. ll ans;
  16. int rot;
  17. ll max1(ll x,ll y){
  18. if(x>=y){
  19. return x;
  20. }
  21. return y;
  22. }
  23. inline ll read(){
  24. ll ret=0,f=1;
  25. char ch=getchar();
  26. while(ch<'0'||ch>'9'){
  27. if(ch=='-'){
  28. f=-f;
  29. }
  30. ch=getchar();
  31. }
  32. while(ch<='9'&&ch>='0'){
  33. ret=ret*10+(ch^'0');
  34. ch=getchar();
  35. }
  36. return f*ret;
  37. }
  38. struct node{
  39. int nex,to;
  40. }e[maxn];
  41. void add(int u,int v){
  42. cnt++;
  43. e[cnt].nex=head[u];
  44. e[cnt].to=v;
  45. head[u]=cnt;
  46. }
  47. void dp(int x){
  48. vis[x]=1;//打标记,用处是表明联通块,把该联通块进行标记
  49. //以便遍历整连接关系,除此之外并无用处
  50. f[x][1]=val[x];
  51. f[x][0]=0;
  52. for(int i=head[x];i;i=e[i].nex){
  53. int to=e[i].to;
  54. if(to!=root){
  55. dp(to);
  56. f[x][0]+=max1(f[to][0],f[to][1]);
  57. f[x][1]+=f[to][0];
  58. }
  59. else{
  60. f[to][1]=-maxn;//将环删边,定有一点不能选,故定此点不选
  61. }
  62. }
  63. }
  64. void find(int x){
  65. vis[x]=1;
  66. root=x;
  67. while(!vis[fa[root]]){//我们的目的是为了找环,而且该连通块先前一定未遍历过
  68. //故该方法可以找出环来
  69. root=fa[root];
  70. vis[root]=1;
  71. }
  72. /*
  73. 该题中图的特殊性
  74. 导致找环必须要从下到上
  75. 若从上到下
  76. 那么如果起点为树边就无法找到环
  77. 该图的根为环
  78. */
  79. dp(root);
  80. ll t;
  81. t=max(f[root][1],f[root][0]);//删一条边不选边上一点的情况下,该联通块的最大值
  82. root=fa[root];
  83. dp(root);
  84. ans+=max1(t,max1(f[root][1],f[root][0])); //将两种情况比较;
  85. }
  86. int main(){
  87. n=read();
  88. int x;
  89. for(int i=1;i<=n;i++){
  90. val[i]=read();
  91. x=read();
  92. add(x,i);
  93. fa[i]=x;
  94. }
  95. for(int i=1;i<=n;i++){
  96. if(!vis[i]){
  97. find(i);
  98. }
  99. }
  100. cout<<ans;
  101. return 0;
  102. }

快去ac吧

P2607 [ZJOI2008]骑士 基环树,树dp;的更多相关文章

  1. 1040: [ZJOI2008]骑士~基环外向树dp

    Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中 ...

  2. 洛谷P2607 [ZJOI2008]骑士 基环树动归

    Code: #include<algorithm> #include<cstdio> #include<algorithm> #include<cstring ...

  3. 「树形DP」洛谷P2607 [ZJOI2008]骑士

    P2607 [ZJOI2008]骑士 题面: 题目描述 Z 国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的 ...

  4. 洛谷P2607 [ZJOI2008]骑士

    P2607 [ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一 ...

  5. 洛谷 P2607 [ZJOI2008]骑士 解题报告

    P2607 [ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一 ...

  6. BZOJ1040: [ZJOI2008]骑士(奇环树,DP)

    题目: 1040: [ZJOI2008]骑士 解析: 假设骑士\(u\)讨厌骑士\(v\),我们在\(u\),\(v\)之间连一条边,这样我们就得到了一个奇环树(奇环森林),既然是一颗奇环树,我们就先 ...

  7. BZOJ 1040: [ZJOI2008]骑士 基环加外向树

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1190  Solved: 465[Submit][Status] ...

  8. [bzoj] 1040 骑士 || 基环外向树dp

    原题 给出n个点n条边和每个点的点权,一条边的两个断点不能同时选择,问最大可以选多少. //图是一张基环外向树森林 是不是很像舞会啊- 就是多了一条边. 所以我们考虑一下对于一棵基环外向树,拆掉一条在 ...

  9. BZOJ1040 骑士 基环外向树

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6421  Solved: 2544[Submit][Status ...

随机推荐

  1. SpringBoot+Shiro+JWT前后端分离实现用户权限和接口权限控制

    1. 引入需要的依赖 我使用的是原生jwt的依赖包,在maven仓库中有好多衍生的jwt依赖包,可自己在maven仓库中选择,实现大同小异. <dependency> <groupI ...

  2. Chrome划词翻译-Saladict

    Saladict 沙拉查词是一款专业划词翻译扩展,为交叉阅读而生.大量权威词典涵盖中英日韩法德西语,支持复杂的 划词操作.网页翻译.生词本.PDF,以及 Vimium 全键盘操作 . 迄今为止最好用的 ...

  3. 家庭记账本APP开发准备(二)

    今天学习了选项卡,为记账本的分类做了准备.主登录界面进行了优化,但仍未实现各个组件之间的跳转. 选项卡 activity_main.xml <?xml version="1.0&quo ...

  4. Java课堂总结

    通过重载函数,来实现对不同类型的参数运算.

  5. Python面向对象,站在更高的角度来思考

    开篇 面向过程编程和面向对象编程是两种基本的编程思想. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去 ...

  6. PhpStorm配置Apache与php的运行环境详细教程

    本文主要说明如何在phpstorm中配置已经安装好的PHP与apache.首先需要在本地安装php,这里我安装的是phpstudy 进入PHPstorm的界面点击file 下的settings 在La ...

  7. Python安装工具

    1.官网下载地址是:https://www.python.org/downloads/  默认下载安装时记得勾选配置PATH路径 PIP工具包(我是选择Python 3.5的) 2.Windows 下 ...

  8. 2020-07-13:es是去查id再根据id去查数据库这种方式好,还是所有数据都放es,直接去查es好?

    福哥答案2020-07-13: 有人觉得第一种方法好,也有人觉得第二种方法好.如果搜索字段远小于显示字段,比如搜索字段为3个,显示字段有20个,这个时候用第一种方法好.es+hbase,一般这样搭配. ...

  9. C#LeetCode刷题之#453-最小移动次数使数组元素相等(Minimum Moves to Equal Array Elements)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3877 访问. 给定一个长度为 n 的非空整数数组,找到让数组所有 ...

  10. Alink漫谈(十八) :源码解析 之 多列字符串编码MultiStringIndexer

    Alink漫谈(十八) :源码解析 之 多列字符串编码MultiStringIndexer 目录 Alink漫谈(十八) :源码解析 之 多列字符串编码MultiStringIndexer 0x00 ...