BZOJ 1040: [ZJOI2008]骑士 | 在基环外向树上DP
题目:
http://www.lydsy.com/JudgeOnline/problem.php?id=1040
题解:
我AC了
是自己写的
超开心
的
考虑断一条边
这样如果根节点不选答案一定正确
但是如果选了的话有可能他爸爸也选了
所以我们强制他爸爸选再更新答案
按照以上思路,存图存单向边即可
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 1000005
using namespace std;
typedef long long ll;
int n,val[N],fa[N],cnt[N],head[N],tot,ecnt;
bool vis[N];
ll ans,f[N][];
struct edge
{
int nxt,v;
}e[N];
inline void add(int u,int v)
{
e[++ecnt].v=v;e[ecnt].nxt=head[u]; head[u]=ecnt;fa[v]=u;
}
inline void Dfs(int x)
{
int y;vis[x]=;f[x][]=val[x];
for (int i=head[x];i;i=e[i].nxt)
if (!vis[y=e[i].v])
{
Dfs(y);
f[x][]+=max(f[y][],f[y][]);
f[x][]+=f[y][];
}
}
inline void Dp(int x)
{
int rt,y;
for (rt=x;cnt[rt]!=x;rt=fa[rt])
cnt[rt]=x;
Dfs(rt);
x=fa[rt];
f[x][]=f[x][];
for (x=fa[x];x!=rt;x=fa[x])
{
f[x][]=;f[x][]=val[x];
for (int i=head[x];i,y=e[i].v;i=e[i].nxt)
f[x][]+=max(f[y][],f[y][]),f[x][]+=f[y][];
}
f[rt][]=val[rt];
for (int i=head[rt];i;i=e[i].nxt)
f[rt][]+=f[y=e[i].v][];
ans+=max(f[rt][],f[rt][]);
}
int main()
{ scanf("%d",&n);
for (int i=,u;i<=n;i++)
{
scanf("%d%d",&val[i],&u);
add(u,i);
}
for (int i=;i<=n;i++)
if (!vis[i]) Dp(i);
printf("%lld\n",ans);
return ;
}
BZOJ 1040: [ZJOI2008]骑士 | 在基环外向树上DP的更多相关文章
- [BZOJ 1040] [ZJOI2008] 骑士 【基环+外向树DP】
题目链接:BZOJ - 1040 题目分析 这道题目的模型就是一个图,不一定联通,每个连通块的点数等于边数. 每个连通块都是一个基环+外向树.即树上增加了一条边. 如果是树,就可以直接树形DP了.然而 ...
- bzoj 1040 [ZJOI2008]骑士(基环外向树,树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1040 [题意] 给一个基环森林,每个点有一个权值,求一个点集使得点集中的点无边相连且权 ...
- bzoj 1040: [ZJOI2008]骑士【基环树+树形dp】
没考虑可以连着两个不选--直接染色了 实际上是基环森林,对于每棵基环树,dfs找出一个环边,然后断掉这条边,分别对这条边的两端点做一边treedp,取max加进答案里 treedp是设f[u]为选u点 ...
- 【BZOJ1040】[ZJOI2008] 骑士(基环外向树DP)
点此看题面 大致题意: 给你一片基环外向树森林,如果选定了一个点,就不能选择与其相邻的节点.求选中点的最大权值和. 树形\(DP\) 此题应该是 树形\(DP\) 的一个升级版:基环外向树\(DP\) ...
- BZOJ 1040: [ZJOI2008]骑士(基环树dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1040 题意: 思路: 这是基环树,因为每个人只会有一个厌恶的人,所以每个节点只会有一个父亲节点,但是 ...
- 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 ...
随机推荐
- php GD 圆图 -处理成圆图片
<?php /** * 处理成圆图片,如果图片不是正方形就取最小边的圆半径,从左边开始剪切成圆形 * @param string $imgpath [description] * @return ...
- weui-switch开关控件,表单提交后如何取值
最近在学习weui这个框架,做了一些小的试验,发现weui-switch控件直接提交不能获取到表单信息,在segmentfault上发现也有人提了这个问题,有人说可以设置一个隐含标签来捕获开关的状态, ...
- Hadoop(13)-MapReduce框架原理--Job提交源码和切片源码解析
1.MapReduce的数据流 1) Input -> Mapper阶段 这一阶段的主要分工就是将文件切片和把文件转成K,V对 输入源是一个文件,经过InputFormat之后,到了Mapper ...
- (转)Updates were rejected because the tip of your current branch is behind
刚创建的github版本库,在push代码时出错: $ git push -u origin masterTo git@github.com:******/Demo.git ! [rejected] ...
- python -pickle模块、re模块学习
pickel模块 import pickle #pickle可以将任何数据类型序列化,json只能列表字典字符串数字等简单的数据类型,复杂的不可以 #但是pickle只能在python中使用,json ...
- C语言实例解析精粹学习笔记——36(模拟社会关系)
实例: 设计一个模拟社会关系的数据结构,每个人的信息用结构表示,包含名字.性别和指向父亲.母亲.配偶.子女的指针(只限两个子女).要求编写以下函数: (1)增加一个新人的函数 (2)建立人与人之间关系 ...
- backtrace函数
1.函数原型 #include <execinfo.h> int backtrace(void **buffer, int size); 该函数获取当前线程的调用堆栈,获取的信息将会被存放 ...
- BZOJ2693: jzptab(莫比乌斯反演)
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2068 Solved: 834[Submit][Status][Discuss] Descripti ...
- Android面试收集录 OpenGL ES
1.如何用OpenGL ES绘制一个三角形? 编写一个类实现Renderer接口,实现onDrawFrame方法,onSurfaceChanged方法,onSurfaceCreated方法 编写一个类 ...
- 用intellij Idea加载eclipse的maven项目全流程
eclipse的maven项目目录 全流程 加载项目 打开intellij Idea file -> new -> module from existing Sources 选择.pom ...