【距离GDKOI:44天&GDOI:107天】【BZOJ1040】[ZJOI2008] 骑士 (环套树DP)
其实已经准备退役了,但GDOI之前还是会继续学下去的!!当成兴趣在学,已经对竞赛失去信心了的样子,我还是回去跪跪文化课吧QAQ
第一道环套树DP...其实思想挺简单的,就把环拆开,分类处理。若拆成开的两个点是u,v,dp[i,0..1]分别表示第i位骑士不选和选
(1) 不选u,v点随意 (2)u随意,v点不选...
分类dp处理即可
const maxn=;
type
edgetype=record
toward,next:longint;
end; var
edge:array[..maxn*] of edgetype;
first:array[..maxn] of longint;
val:array[..maxn] of int64;
dp:array[..maxn,..] of int64;
pd,vb,vc:array[..maxn] of boolean;
root,vv,e,tot:longint;
n:longint;
function max(x,y:int64):int64; begin if x>y then exit(x) else exit(y); end; procedure addedge(i,j:longint);
begin
edge[tot].toward:=j;
edge[tot].next:=first[i];
first[i]:=tot;
inc(tot);
end; procedure add(i,j:longint);
begin
addedge(i,j); addedge(j,i);
end; procedure dfs(v,fa:longint);
var i,tmp:longint;
begin
pd[v]:=true;
i:=first[v];
while i<>- do
begin
tmp:=edge[i].toward;
if not pd[tmp] then dfs(tmp,v)
else if tmp<>fa then
begin
vv:=v;
root:=tmp;
e:=i;
end;
i:=edge[i].next;
end;
end; procedure dpb(v:longint); //ban u
var i,tmp:longint;
begin
dp[v,]:=; dp[v,]:=val[v]; vb[v]:=true;
i:=first[v];
while i<>- do
begin
tmp:=edge[i].toward;
if (i<>e) and (i xor <>e) and not vb[tmp] then
begin
dpb(tmp);
dp[v,]:=dp[v,]+max(dp[tmp,],dp[tmp,]);
dp[v,]:=dp[v,]+dp[tmp,];
end;
i:=edge[i].next;
end;
end; procedure dpc(v:longint); //ban v;
var i,tmp:longint;
begin
dp[v,]:=; dp[v,]:=val[v]; vc[v]:=true;
i:=first[v];
while i<>- do
begin
tmp:=edge[i].toward;
if (i<>e) and (i xor <>e) and not vc[tmp] then
begin
dpc(tmp);
dp[v,]:=dp[v,]+dp[tmp,];
if tmp=vv then dp[v,]:=dp[v,]+dp[tmp,]
else dp[v,]:=dp[v,]+max(dp[tmp,],dp[tmp,]);
end;
i:=edge[i].next;
end;
end; procedure solve;
var i:longint;
rec,ans:int64;
begin
ans:=;
for i:= to n do
if not pd[i] then
begin
rec:=; root:=-; dfs(i,-);
dpb(root); rec:=dp[root,];
dpc(root); rec:=max(rec,max(dp[root,],dp[root,]));
inc(ans,rec);
end;
writeln(ans);
end; procedure init;
var i,x:longint;
begin
fillchar(first,sizeof(first),);
readln(n);
tot:=;
for i:= to n do
begin
readln(val[i],x);
add(i,x);
end;
end; Begin
init;
solve;
End.
【距离GDKOI:44天&GDOI:107天】【BZOJ1040】[ZJOI2008] 骑士 (环套树DP)的更多相关文章
- [BZOJ1040][ZJOI2008]骑士(环套树dp)
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5816 Solved: 2263[Submit][Status ...
- [BZOJ1040][ZJOI2008]骑士 基环树DP
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1040 题目给出了$n$个点和$n$条无向边,即一棵基环树或者基环树森林. 如果题目给的关系 ...
- luogu2607/bzoj1040 [ZJOI2008]骑士 (基环树形dp)
N个点,每个点发出一条边,那么这个图的形状一定是一个基环树森林(如果有重边就会出现森林) 那我做f[0][x]和f[1][x]分别表示对于x子树,x这个点选还是不选所带来的最大价值 然后就变成了这好几 ...
- 2018.11.06 bzoj1040: [ZJOI2008]骑士(树形dp)
传送门 由题可知给出的是基环森林. 因此对于每个基环森林找到环断开dpdpdp两次就行了. 代码: #include<bits/stdc++.h> using namespace std; ...
- bzoj1040(ZJOI2008)骑士——基环树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1040 基环树的模板. 套路就是把环断开,先把一端作为根节点,强制不选:再把另一端作为根节点, ...
- [bzoj1040][ZJOI2008]骑士_树形dp_基环树_并查集
骑士 bzoj-1040 ZJOI-2008 题目大意:n个骑士,每个骑士有权值val和一个讨厌的骑士.如果一个骑士讨厌另一个骑士那么他们将不会一起出战.问出战的骑士最大atk是多少. 注释:$1\l ...
- [BZOJ1040] [ZJOI2008]骑士 解题报告
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火 ...
- BZOJ1040 [ZJOI2008]骑士
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战 ...
- 【环套树+树形dp】Bzoj1040 [ZJOI2008] 骑士
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火 ...
随机推荐
- 截取前后缀FOR C
memcpy(new, old + prefix_len, sizeof(new)); memcpy(new, old, strlen(old) - suffix_len); :)
- Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: Pointcut is not well-formed: expecting 'name pattern' at character position 36
例: <aop:config> <aop:pointcut expression="execution(* com.zsn.Service.Impl.*.*(..))&qu ...
- Java反射+注解案例
注解类代码,注解的属性可以有多个: package reflect; import java.lang.annotation.Retention; import java.lang.annotatio ...
- 【Effective C++ 读书笔记】条款04:确定对象使用前已先被初始化
永远在使用对象之前先将它初始化.对于无任何成员的内置类型,你必须手工完成此事. 至于内置类型以外的任何其他东西,初始化责任落在构造函数身上.规则很简单:确保每一个构造函数都将对象的每一个成员初始化. ...
- 【jQuery】手机验证码倒计时效果
<ul class="ulist"> <li class="group"> <label class="label&qu ...
- #Python编程从入门到实践#第二章笔记
1.变量 (1)变量名只能包含字母.数字和下划线,不能包含空格 (2)不要将python关键字与函数名作为变量名 (3)简短有描述性,避免使用小写字母l和大写字母O (4)python 始终 ...
- python3爬取咪咕音乐榜信息(附源代码)
参照上一篇爬虫小猪短租的思路https://www.cnblogs.com/aby321/p/9946831.html,继续熟悉基础爬虫方法,本次爬取的是咪咕音乐的排名 咪咕音乐榜首页http://m ...
- linux 共享内存
共享内存是最高效的IPC机制,因为它不涉及进程之间的任何数据传输.这种高效带来的问题是,我们必须用其他手段来同步进程对共享内存的访问,否则会产生竞态条件.所以,共享内存通常和其他进程间通信方式一起使用 ...
- 关于Java对象作为参数传递是传值还是传引用的问题
前言 在Java中,当对象作为参数传递时,究竟传递的是对象的值,还是对象的引用,这是一个饱受争议的话题.若传的是值,那么函数接收的只是实参的一个副本,函数对形参的操作并不会对实参产生影响:若传的是引用 ...
- Pandas库入门
pandas库的series类型