首先是因为想学仙人掌图才来先拿这题热热身,结果&……竟然调了一个晚上我的傻叉!(其中一大半的时候是在郁闷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我最近什么鬼状态!!!连傻叉题都不会写了)

type
arr=record
toward,next:longint;
end; const
maxn=; var
edge:array[..maxn]of arr;
first,fa,link,from:array[..maxn]of longint;
value:array[..maxn]of int64;
chose:array[..maxn]of boolean;
dp:array[..maxn,..]of int64;
f:array[..maxn,..]of int64;
n,m,tot:longint; function max(x,y:int64):int64;
begin
if x<y then exit(y);
exit(x);
end; procedure addedge(j,k:longint);
begin
inc(tot);
edge[tot].toward:=k;
edge[tot].next:=first[j];
first[j]:=tot;
end; procedure treedp(x:longint);
var
i,too:longint;
begin
dp[x,]:=value[x];
dp[x,]:=;
chose[x]:=false;
i:=first[x];
while i> do begin
too:=edge[i].toward;
treedp(too);
dp[x,]:=dp[x,]+max(dp[too,],dp[too,]);
dp[x,]:=dp[x,]+dp[too,];
i:=edge[i].next;
end;
end; procedure into;
var
i,j:longint;
begin
readln(n);
for i:= to n do begin
chose[i]:=true;
read(value[i],j);
addedge(j,i);
fa[i]:=j;
end;
end; procedure work;
var
i,j,x,now,sum,too:longint;
ans,answer:int64;
begin
answer:=;
for i:= to n do
if chose[i] then begin
sum:=;
x:=i;
while chose[x] do begin
chose[x]:=false;
x:=fa[x];
//from[fa[x]]:=x;
from[fa[x]]:=x;
end;
now:=x;
repeat
j:=first[x];
dp[x,]:=value[x];
while j> do begin
too:=edge[j].toward;
if too<>from[x] then begin
treedp(too);
dp[x,]:=dp[x,]+max(dp[too,],dp[too,]);
dp[x,]:=dp[x,]+dp[too,];
end;
j:=edge[j].next;
end;
inc(sum);
link[sum]:=x;
x:=fa[x];
until x=now;
ans:=;
f[,]:=dp[link[],];
f[,]:=dp[link[],];
f[,]:=dp[link[],];
f[,]:=dp[link[],];
for j:= to sum do begin
x:=link[j];
f[j,]:=max(f[j-,],f[j-,])+dp[x,];
f[j,]:=f[j-,]+dp[x,];
f[j,]:=max(f[j-,],f[j-,])+dp[x,];
f[j,]:=f[j-,]+dp[x,];
end;
ans:=max(f[sum,],f[sum,]);
ans:=max(ans,f[sum,]);
answer:=answer+ans;
end;
writeln(answer);
end; begin
into;
work;
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. spl_autoload_register()函数

    一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数.看下面例子: printit.class.php <?php class PRINTI ...

  2. android 学习十四 探索安全性和权限

    1.部署安全性:应用程序必须使用数字证书才能安装到设备上. 2.执行期间的安全性:    2.1 使用独立进程    2.2 使用固定唯一用户ID    2.3  申明性权限模型   3数字证书   ...

  3. Ruby 基础教程1-4

    1.对象 数值对象 字符串对象 数组对象,散列对象 正则表达式对象 时间对象 文件对象 符号对象 2.类 Numeric String Array Hash Regexp File Symbol 3. ...

  4. Linker加载so失败问题分析

    WeTest 导读 近期测试反馈一个问题,在旧版本微视基础上覆盖安装新版本的微视APP,首次打开拍摄页录制视频合成时高概率出现crash. 那么我们直奔主题,看看日志: 另外复现的日志中还出现如下信息 ...

  5. K8S全栈容器服务如何助力企业云化创新?

    容器编排管理平台Kubernetes在实践两年多后,市场主导地位被正式确定,随着首批认证服务商的宣布,围绕着容器的应用编排部署服务已然成熟,Kubernetes开始在商业场景为企业创造价值.华为云在K ...

  6. Web应用服务器性能压力测试

    压力测试需要关注三个方面:如何正确产生压力.如何定位瓶颈.如何预估系统的承载能力 产生压力的方法 通常可以写脚本产生压力机器人对服务器进行发包和收包操作,也可以使用现有的工具(像jmeter.Load ...

  7. TW实习日记:第19天

    今天一早上改完信息门户的代码之后,发现接口又出了问题,查了半天都不知道,原来又是网端的问题...真是心累啊,调整了一些细节样式,以及终于把企业微信的消息推送功能做完了.关键就在于有个表存放微信id的字 ...

  8. 对Java对象的认识与理解

    今天是我学习编程以来第一次写博客,记下平日学习所得,本来这几日都在学习web框架 但觉得梳理一下之前所学很有必要.毕竟之前学习Java感觉很粗略只是以考试为目的.所以就以<Thinking in ...

  9. [Clr via C#读书笔记]Cp7常量和字段

    Cp7常量和字段 常量 常量在编译的时候必须确定,只能一编译器认定的基元类型.被视为静态,不需要static:直接嵌入IL中: 区别ReadOnly 只能在构造的时候初始化,内联初始化. 字段 数据成 ...

  10. Linux error:No space left on device

    一台Oracle数据库服务器在关机重启后,Oracle监听无法启动,提示错误 Linux error:no space left on device 提示可知:问题是出在磁盘空间不足 但是初步查看分区 ...