Description

  Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英。他们劫富济贫,惩恶扬善,受到社会各界的赞扬。最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争。战火绵延五百里,在和平环境中安逸了数百年的Z国又怎能抵挡的住Y国的军队。于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一个真龙天子的降生,带领正义打败邪恶。骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一些矛盾。每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己),他是绝对不会与自己最厌恶的人一同出征的。战火绵延,人民生灵涂炭,组织起一个骑士军团加入战斗刻不容缓!国王交给了你一个艰巨的任务,从所有的骑士中选出一个骑士军团,使得军团内没有矛盾的两人(不存在一个骑士与他最痛恨的人一同被选入骑士军团的情况),并且,使得这支骑士军团最具有战斗力。为了描述战斗力,我们将骑士按照1至N编号,给每名骑士一个战斗力的估计,一个军团的战斗力为所有骑士的战斗力总和。

  调了很久的样子..首先分析这道题的隐藏条件

  虽然看起来这张图杂乱无章,但想对于一个有n个骑士的联通块,必定有n条边,也就是说一定是一个存在且仅存在一个环的图

  据说叫做内向树

  由于只存在一个环,做法很简单,只需要将环上任意两个点之间的边断开,然后做两次树形DP

  当控制v不取的时候,u可取可不取。当控制v取的时候,u一定不能取。

  这样大体的思路就构建起来了。具体实现的时候要注意的地方很多。

  首先我是用tarjan找的环,与传统的tarjan不同,这里我们要忽略单点,而且要同时保存两个环上的节点

  找到了之后把边断开的操作可以在树形DP的时候特判一下

  但是发现WA了之后手造了一组数据就发现tarjan出了问题

  不管怎样的图好像都成了一个环

  突然发现tarjan是应用于有向图的...而这道题的边恰好是无向边

  是不是tarjan就不可以用了呢?实际上不会,因为每个节点最多只出去一条边

  所以对于环上的任意一个节点只需要保存它到它讨厌的那个骑士的边就可以了

  读入数据的时候我就既造了有向边又造了无向边

  还是WA,后来手造一组数据又发现了问题...

  有一个特殊情况就是可能环的size=2,这个时候实际上和树没什么区别

  如果把边断开很可能造成的后果就是其中一个点连出去的点都无法到达了

  而当size>2的时候每个点都会与两个点相连,断了左边的路右边还是可以到的

  所以当环大小为2的时候需要特判,我直接将v赋为0就解决了这个问题~

  还是一道非常锻炼思维和代码能力的题啊。

  最近的状态比较好,有耐心一点一点敲代码,一点一点改

  果然最后还是AC了呢ww

  (好像这道题的题解代码都不长...

 program bzoj1040;
const maxn=;INF=;
var n,time,top,flag,u,v,ans,head,tail,size:int64;
i,j,j1:longint;
a,w,fx:array[-..maxn]of int64;
ins,vis,used:array[-..maxn]of boolean;
low,dfn,link,link1,stack,opt:array[-..maxn]of int64;
fa,next,fa1,next1:array[-..*maxn]of int64;
f:array[-..maxn,..]of int64; function min(a,b:int64):int64;
begin
if a<b then exit(a) else exit(b);
end; function max(a,b:int64):int64;
begin
if a>b then exit(a) else exit(b);
end; procedure tarjan(p:int64);
var j:longint;
begin
used[p]:=false;
inc(top);stack[top]:=p;ins[p]:=true;
inc(time);dfn[p]:=time;low[p]:=time;
j:=link1[p];
while j<> do
begin
if used[fa1[j]] then
begin
tarjan(fa1[j]);
low[p]:=min(low[p],low[fa1[j]]);
end else if ins[fa1[j]] then low[p]:=min(low[p],dfn[fa1[j]]);
j:=next1[j];
end;
if low[p]=dfn[p] then
begin
if stack[top]=p then
begin
ins[p]:=false;dec(top);
end else
begin
v:=stack[top];size:=;
ins[v]:=false;
repeat
dec(top);
u:=v;v:=stack[top];
ins[v]:=false;
inc(size);
until stack[top] = p;
dec(top);
end;
end;
end; procedure dfs0(p:int64);
var j:longint;
begin
vis[p]:=false;
j:=link[p];f[p,]:=;
while j<> do
begin
if ((p=u)and(fa[j]=v))or((p=v)and(fa[j]=u)) then
begin
j:=next[j];continue;
end;
if vis[fa[j]] then
begin
dfs0(fa[j]);
inc(f[p,],max(f[fa[j],],f[fa[j],]));
inc(f[p,],f[fa[j],]);
end;
j:=next[j];
end;
if p=v then f[p,]:=-INF else inc(f[p,],w[p]);
end; procedure dfs1(p:int64);
var j:longint;
begin
vis[p]:=false;
j:=link[p];f[p,]:=;f[p,]:=;
while j<> do
begin
if ((p=u)and(fa[j]=v))or((p=v)and(fa[j]=u)) then
begin
j:=next[j];continue;
end;
if vis[fa[j]] then
begin
dfs1(fa[j]);
inc(f[p,],max(f[fa[j],],f[fa[j],]));
inc(f[p,],f[fa[j],]);
end;
j:=next[j];
end;
if p=v then f[p,]:=-INF;
inc(f[p,],w[p]);
end; procedure solve;
var tem:int64;
begin
fillchar(vis,sizeof(vis),true);
dfs0(u);
tem:=max(f[u,],f[u,]);
fillchar(vis,sizeof(vis),true);
dfs1(u);
tem:=max(f[u,],tem);
inc(ans,tem);
end; procedure add(x,y:int64);
begin
inc(j);fa[j]:=y;next[j]:=link[x];link[x]:=j;
inc(j);fa[j]:=x;next[j]:=link[y];link[y]:=j;
inc(j1);fa1[j1]:=y;next1[j1]:=link1[x];link1[x]:=j1;
end; procedure bfs(p:longint);
var j:longint;
begin
head:=;tail:=;opt[]:=p;fx[p]:=flag;
while head<>tail do
begin
inc(head);
j:=link[opt[head]];
while j<> do
begin
if fx[fa[j]]<>flag then
begin
fx[fa[j]]:=flag;
inc(tail);opt[tail]:=fa[j];
end;
j:=next[j];
end;
end;
end; begin
readln(n);
j:=;j1:=;
for i:= to n do
begin
readln(w[i],a[i]);
add(i,a[i]);
end;
ans:=;
fillchar(fx,sizeof(fx),);
fillchar(used,sizeof(used),true);
fillchar(ins,sizeof(ins),false);
flag:=;time:=;top:=;
for i:= to n do if fx[i]= then
begin
inc(flag);
bfs(i);
u:=;v:=;
for j:= to tail do if used[opt[j]] then tarjan(opt[j]);
if size= then v:=;
solve;
end;
writeln(ans);
end.

[BZOJ1040] [ZJOI2008]骑士 解题报告的更多相关文章

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

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

  2. BZOJ1040 [ZJOI2008]骑士

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

  3. [bzoj1040][ZJOI2008]骑士_树形dp_基环树_并查集

    骑士 bzoj-1040 ZJOI-2008 题目大意:n个骑士,每个骑士有权值val和一个讨厌的骑士.如果一个骑士讨厌另一个骑士那么他们将不会一起出战.问出战的骑士最大atk是多少. 注释:$1\l ...

  4. [BZOJ1040][ZJOI2008]骑士(环套树dp)

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

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

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

  6. 【环套树+树形dp】Bzoj1040 [ZJOI2008] 骑士

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

  7. 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士

    基环外向树dp竟然如此简单…… Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发 ...

  8. kings(骑士)解题报告

    kings(骑士) Time Limit5000 ms    Memory Limit131072 KBytes Description 用字符矩阵来表示一个8x8的棋盘,'.'表示是空格,'P'表示 ...

  9. luogu2607/bzoj1040 [ZJOI2008]骑士 (基环树形dp)

    N个点,每个点发出一条边,那么这个图的形状一定是一个基环树森林(如果有重边就会出现森林) 那我做f[0][x]和f[1][x]分别表示对于x子树,x这个点选还是不选所带来的最大价值 然后就变成了这好几 ...

随机推荐

  1. 网易云terraform实践

    此文已由作者王慎为授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.terraform介绍 随着应用上云的常态化,资源栈动态管理的需求对用户也变得更加急切.资源编排(Res ...

  2. [网站日志]今天早上遭遇的CPU 100%情况

    今天早上9:06左右,Windows性能监视器监测到主站的Web服务器出现了CPU 100%的情况,伴随着Requests/Sec的上升,详见下图. 上图中红色线条表示的是%Processor Tim ...

  3. Eclipse中JS文件红叉处理

    使用新版本的Eclipse 或者 MyEclipse,项目中的 JS文件出现红叉,让人觉得项目中存在错误代码,给人的感觉很不爽. 记录一下去掉红叉的方法: 第1步: 打开工作空间中的项目找到项目的 . ...

  4. 在Android上,怎样与Kotlin一起使用Retrofit(KAD21)

    作者:Antonio Leiva 时间:Apr 18, 2017 原文链接:https://antonioleiva.com/retrofit-android-kotlin/ 这是又一个例子,关于怎样 ...

  5. 玩玩自动化测试之selenium篇

    现如今社会科技发展太快了,纯功能点点点已经落后别人好几条街了,所以为了让自己多点职业生涯年限,得挺起肩,傲起头.自动化测试,其本质是用代码程序测试程序,所以其实第一步应该学好编程语言,后再自己开发自动 ...

  6. Python简要标准库(3)

    shelve 若只需要一个简单的存储方案,那么shelve模块可以满足你大部分的需要,你所需要的只是为它提供文件名.shelve中唯一有趣的函数是open,在调用的时候他会返回一个Shelf对象 注意 ...

  7. (原创)不过如此的 DFS 深度优先遍历

    DFS 深度优先遍历 DFS算法用于遍历图结构,旨在遍历每一个结点,顾名思义,这种方法把遍历的重点放在深度上,什么意思呢?就是在访问过的结点做标记的前提下,一条路走到天黑,我们都知道当每一个结点都有很 ...

  8. 第16讲——C++中的代码重用

    C++的一个主要目标是促进代码重用.除了我们之前学的公有继承,我们在这一讲将介绍另一种代码重用的方法——类模板.

  9. QQ互联登陆的最简洁代码

    <?php/** * http://wiki.open.qq.com/wiki/ * Date: 14-6-18 * Time: 下午18:04 */class Model_Login_QqCo ...

  10. sc"

    2.11 题目:二叉搜索树中的最近公共祖先 2.12 设计思路 if 树中不存在 u 或 v 错误 结束程序 定义 p 指向根节点 while true do: if p->key大于 u 和 ...