首先是因为想学仙人掌图才来先拿这题热热身,结果&……竟然调了一个晚上我的傻叉!(其中一大半的时候是在郁闷hzwer和Greens的代码画风不一样,后来才发现一个用拓扑一个用树dp23333,以后代码坚决自己解决)

贴一下hzwer大神的题解吧:http://hzwer.com/1729.html

以及云的代码:http://hi.baidu.com/greencloud/archive/tag/dp?page=4

treedp:
首先我们发现一个骑士只会觉得另一个骑士丑(233),然后我们想到了树,因为树上每个点只有一个入度,所以边建为从被讨厌的人指向讨厌他的。但是会出现环的情况……这时候一定是在树根那里有个环!(画图就可以发现一定是这样,如果不是在树根那么就会有出现入度为2的情况,显然不可能……)。然后就先处理出不再环上的每个点与各自的子树的情况(dp[x,0]表示x取,dp[x,1],表示x不取),由于树上只有一个环,so那些环上的点的儿子们如果不再环上那子树一定是棵树不会出现环,so是可以用treedp递归处理出来。(然后拓扑的方法就相反啦,边是从某个人指向这个人讨厌的人,那么那些入度为0的点就是老好人,然后从这些老好人开始推,找老好人讨厌的人&……算过去)

然后就是处理环上怎么取最大的问题啦。

破环成链,这时候就先不考虑链头与链尾不能同时取的情况,跑一边dp,然后再来考虑链头和链尾的限制,也就是链头取的时候链尾不能取,链头不取的时候链尾可取可不取……

(我X我最近什么鬼状态!!!连傻叉题都不会写了)

  1. type
  2. arr=record
  3. toward,next:longint;
  4. end;
  5.  
  6. const
  7. maxn=;
  8.  
  9. var
  10. edge:array[..maxn]of arr;
  11. first,fa,link,from:array[..maxn]of longint;
  12. value:array[..maxn]of int64;
  13. chose:array[..maxn]of boolean;
  14. dp:array[..maxn,..]of int64;
  15. f:array[..maxn,..]of int64;
  16. n,m,tot:longint;
  17.  
  18. function max(x,y:int64):int64;
  19. begin
  20. if x<y then exit(y);
  21. exit(x);
  22. end;
  23.  
  24. procedure addedge(j,k:longint);
  25. begin
  26. inc(tot);
  27. edge[tot].toward:=k;
  28. edge[tot].next:=first[j];
  29. first[j]:=tot;
  30. end;
  31.  
  32. procedure treedp(x:longint);
  33. var
  34. i,too:longint;
  35. begin
  36. dp[x,]:=value[x];
  37. dp[x,]:=;
  38. chose[x]:=false;
  39. i:=first[x];
  40. while i> do begin
  41. too:=edge[i].toward;
  42. treedp(too);
  43. dp[x,]:=dp[x,]+max(dp[too,],dp[too,]);
  44. dp[x,]:=dp[x,]+dp[too,];
  45. i:=edge[i].next;
  46. end;
  47. end;
  48.  
  49. procedure into;
  50. var
  51. i,j:longint;
  52. begin
  53. readln(n);
  54. for i:= to n do begin
  55. chose[i]:=true;
  56. read(value[i],j);
  57. addedge(j,i);
  58. fa[i]:=j;
  59. end;
  60. end;
  61.  
  62. procedure work;
  63. var
  64. i,j,x,now,sum,too:longint;
  65. ans,answer:int64;
  66. begin
  67. answer:=;
  68. for i:= to n do
  69. if chose[i] then begin
  70. sum:=;
  71. x:=i;
  72. while chose[x] do begin
  73. chose[x]:=false;
  74. x:=fa[x];
  75. //from[fa[x]]:=x;
  76. from[fa[x]]:=x;
  77. end;
  78. now:=x;
  79. repeat
  80. j:=first[x];
  81. dp[x,]:=value[x];
  82. while j> do begin
  83. too:=edge[j].toward;
  84. if too<>from[x] then begin
  85. treedp(too);
  86. dp[x,]:=dp[x,]+max(dp[too,],dp[too,]);
  87. dp[x,]:=dp[x,]+dp[too,];
  88. end;
  89. j:=edge[j].next;
  90. end;
  91. inc(sum);
  92. link[sum]:=x;
  93. x:=fa[x];
  94. until x=now;
  95. ans:=;
  96. f[,]:=dp[link[],];
  97. f[,]:=dp[link[],];
  98. f[,]:=dp[link[],];
  99. f[,]:=dp[link[],];
  100. for j:= to sum do begin
  101. x:=link[j];
  102. f[j,]:=max(f[j-,],f[j-,])+dp[x,];
  103. f[j,]:=f[j-,]+dp[x,];
  104. f[j,]:=max(f[j-,],f[j-,])+dp[x,];
  105. f[j,]:=f[j-,]+dp[x,];
  106. end;
  107. ans:=max(f[sum,],f[sum,]);
  108. ans:=max(ans,f[sum,]);
  109. answer:=answer+ans;
  110. end;
  111. writeln(answer);
  112. end;
  113.  
  114. begin
  115. into;
  116. work;
  117. end.

1040: [ZJOI2008]骑士的更多相关文章

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

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

  2. bzoj 1040: [ZJOI2008]骑士 環套樹DP

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

  3. bzoj 1040: [ZJOI2008]骑士 树形dp

    题目链接 1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3054  Solved: 1162[Submit][S ...

  4. [BZOJ 1040][ZJOI2008]骑士

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

  5. bzoj 1040 1040: [ZJOI2008]骑士

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

  6. Bzoj 1040 [ZJOI2008]骑士 题解

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

  7. 【BZOJ】1040: [ZJOI2008]骑士(环套树dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1040 简直不能再神的题orz. 蒟蒻即使蒟蒻,完全不会. 一开始看到数据n<=1000000就 ...

  8. 1040: [ZJOI2008]骑士 - BZOJ

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

  9. bzoj 1040 [ZJOI2008]骑士(基环外向树,树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1040 [题意] 给一个基环森林,每个点有一个权值,求一个点集使得点集中的点无边相连且权 ...

  10. [BZOJ 1040] [ZJOI2008] 骑士 【基环+外向树DP】

    题目链接:BZOJ - 1040 题目分析 这道题目的模型就是一个图,不一定联通,每个连通块的点数等于边数. 每个连通块都是一个基环+外向树.即树上增加了一条边. 如果是树,就可以直接树形DP了.然而 ...

随机推荐

  1. web漏洞原理 (需要每周更新此篇文章)

    SQL注入攻击简介 结构化查询语言SQL是用来和关系数据库进行交互的文本语言.它允许用户对数据进行有效的管理,包含了对数据的查询.操作.定义和控制等几个方面,例如向数据库写入.插入数据,从数据库读取数 ...

  2. Selenium(Python)生成Html测试报告

    由于Python3已经不支持HTMLTestRunner了, 无论是PyCharm还是pip都无法安装成功, 所以只能去 http://tungwaiyip.info/software/HTMLTes ...

  3. linux部署maven

    1.下载安装包 https://maven.apache.org/download.cgi 2.解压,并配置环境变量 vim /etc/profile export MAVEN_HOME=maven目 ...

  4. Python字符串操作大全(非常全!!!)

    1. python编程里字符串的内置方法(非常全) capitalize() 把字符串的第一个字符改为大写 casefold() 把整个字符串的所有字符改为小写 center(width) 将字符串居 ...

  5. 理解 JavaScript 原型 / 原型链

    关于对象 以下代码中 p 的值是一个新对象,里面拥有 name 和 age 属性 function People(name, age){ this.name = name this.age = age ...

  6. 【shell 练习2】产生随机数的方法总结

    一.产生随机数 ()RANDOM 产生随机数 [root@localhost ~]# echo $RANDOM [root@localhost ~]# )) #想要生成八个随机数,随便加一个八位的数字 ...

  7. Laxcus大数据管理系统2.0(6)- 第四章 数据计算

    第四章 数据计算 Laxcus所有数据计算工作都是通过网络实施.相较于集中计算,在网络间进行的数据计算更适合处理那些数据量大.复杂的.耗时长的计算任务.能够实施网络计算的前提是数据可以被分割,就是把一 ...

  8. 56[LeetCode] .Merge Intervals

    Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums s ...

  9. [C++] OOP - Virtual Functions and Abstract Base Classes

    Ordinarily, if we do not use a function, we do not need to supply a definition of the function. Howe ...

  10. JS中Text节点总结

    文本节点有Text类型表示,包含的是可以找字面解释的纯文本内容.纯文本中可以包含转移后的HTML字符,但不能包含HTML代码.Text节点具有以下属性: 1.nodeType的值为3. 2.nodeN ...