1040: [ZJOI2008]骑士
首先是因为想学仙人掌图才来先拿这题热热身,结果&……竟然调了一个晚上我的傻叉!(其中一大半的时候是在郁闷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]骑士的更多相关文章
- BZOJ 1040: [ZJOI2008]骑士 基环加外向树
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1190 Solved: 465[Submit][Status] ...
- bzoj 1040: [ZJOI2008]骑士 環套樹DP
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1755 Solved: 690[Submit][Status] ...
- bzoj 1040: [ZJOI2008]骑士 树形dp
题目链接 1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3054 Solved: 1162[Submit][S ...
- [BZOJ 1040][ZJOI2008]骑士
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5403 Solved: 2060[Submit][Status ...
- bzoj 1040 1040: [ZJOI2008]骑士
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5210 Solved: 1987[Submit][Status ...
- Bzoj 1040 [ZJOI2008]骑士 题解
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5368 Solved: 2044[Submit][Status ...
- 【BZOJ】1040: [ZJOI2008]骑士(环套树dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1040 简直不能再神的题orz. 蒟蒻即使蒟蒻,完全不会. 一开始看到数据n<=1000000就 ...
- 1040: [ZJOI2008]骑士 - BZOJ
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火 ...
- bzoj 1040 [ZJOI2008]骑士(基环外向树,树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1040 [题意] 给一个基环森林,每个点有一个权值,求一个点集使得点集中的点无边相连且权 ...
- [BZOJ 1040] [ZJOI2008] 骑士 【基环+外向树DP】
题目链接:BZOJ - 1040 题目分析 这道题目的模型就是一个图,不一定联通,每个连通块的点数等于边数. 每个连通块都是一个基环+外向树.即树上增加了一条边. 如果是树,就可以直接树形DP了.然而 ...
随机推荐
- web漏洞原理 (需要每周更新此篇文章)
SQL注入攻击简介 结构化查询语言SQL是用来和关系数据库进行交互的文本语言.它允许用户对数据进行有效的管理,包含了对数据的查询.操作.定义和控制等几个方面,例如向数据库写入.插入数据,从数据库读取数 ...
- Selenium(Python)生成Html测试报告
由于Python3已经不支持HTMLTestRunner了, 无论是PyCharm还是pip都无法安装成功, 所以只能去 http://tungwaiyip.info/software/HTMLTes ...
- linux部署maven
1.下载安装包 https://maven.apache.org/download.cgi 2.解压,并配置环境变量 vim /etc/profile export MAVEN_HOME=maven目 ...
- Python字符串操作大全(非常全!!!)
1. python编程里字符串的内置方法(非常全) capitalize() 把字符串的第一个字符改为大写 casefold() 把整个字符串的所有字符改为小写 center(width) 将字符串居 ...
- 理解 JavaScript 原型 / 原型链
关于对象 以下代码中 p 的值是一个新对象,里面拥有 name 和 age 属性 function People(name, age){ this.name = name this.age = age ...
- 【shell 练习2】产生随机数的方法总结
一.产生随机数 ()RANDOM 产生随机数 [root@localhost ~]# echo $RANDOM [root@localhost ~]# )) #想要生成八个随机数,随便加一个八位的数字 ...
- Laxcus大数据管理系统2.0(6)- 第四章 数据计算
第四章 数据计算 Laxcus所有数据计算工作都是通过网络实施.相较于集中计算,在网络间进行的数据计算更适合处理那些数据量大.复杂的.耗时长的计算任务.能够实施网络计算的前提是数据可以被分割,就是把一 ...
- 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 ...
- [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 ...
- JS中Text节点总结
文本节点有Text类型表示,包含的是可以找字面解释的纯文本内容.纯文本中可以包含转移后的HTML字符,但不能包含HTML代码.Text节点具有以下属性: 1.nodeType的值为3. 2.nodeN ...