BZOJ1040: [ZJOI2008]骑士(奇环树,DP)
题目:
解析:
假设骑士\(u\)讨厌骑士\(v\),我们在\(u\),\(v\)之间连一条边,这样我们就得到了一个奇环树(奇环森林),既然是一颗奇环树,我们就先考虑把环断开,设断开边边连接的两点是\(rt1\),\(rt2\),断环的话直接标记这条边不能经过就好了
根据题意,我们要求的是相邻两个节点不能同时选时的最大价值,这不就是奇环树版的没有上司的舞会吗。
那么很容易的得到转移方程
设\(f[u][1/0]\)表示以\(u\)为根,选/不选可以得到的最大价值
f[u][1] += f[v][0]\\\\
f[u][0] += max(f[v][0], f[v][1])
\end{cases}\]
然后分别以\(rt1\),\(rt2\)为根做树形DP
因为\(rt1\)和\(rt2\)分别是环上的两点,两点不可以同时选,我们分别强制\(rt1\),\(rt2\)不选,累加最大值
原图可能是奇环森林,所以用vis标记一下每个点是否被访问过
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e6 + 10;
int n, m, num = 1, rt1, rt2, flag, ans, kk;
int head[N], f[N][2], a[N];
bool vis[N], vis2[N];
struct node {
int v, nx;
} e[N];
template<class T>inline void read(T &x) {
x = 0; int f = 0; char ch = getchar();
while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
x = f ? -x : x;
return;
}
inline void add(int u, int v) {
e[++num] = (node) {v, head[u]}, head[u] = num;
}
void FindCircle(int u, int fa) {
vis[u] = 1;
for (int i = head[u]; ~i; i = e[i].nx) {
int v = e[i].v;
if (v == fa) continue;
if (!vis[v]) FindCircle(v, u);
else {
rt1 = u, rt2 = v;
kk = i;
}
}
}
void dfs(int u, int fa) {
f[u][1] = a[u];
for (int i = head[u]; ~i; i = e[i].nx) {
int v = e[i].v;
if (v == fa || i == kk || (i ^ 1) == kk) continue;
dfs(v, u);
f[u][1] += f[v][0];
f[u][0] += max(f[v][1], f[v][0]);
}
}
signed main() {
memset(head, -1, sizeof head);
read(n);
for (int i = 1, x; i <= n; ++i) {
read(a[i]), read(x);
add(i, x), add(x, i);
}
for (int i = 1; i <= n; ++i) {
if (vis[i]) continue;
int tmp = 0;
FindCircle(i, -1);
memset(f, 0, sizeof f);
dfs(rt1, -1);
tmp = max(tmp, f[rt1][0]);
memset(f, 0, sizeof f);
dfs(rt2, -1);
tmp = max(tmp, f[rt2][0]);
ans += tmp;
}
cout << ans << endl;
}
BZOJ1040: [ZJOI2008]骑士(奇环树,DP)的更多相关文章
- 【BZOJ】1040: [ZJOI2008]骑士(环套树dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1040 简直不能再神的题orz. 蒟蒻即使蒟蒻,完全不会. 一开始看到数据n<=1000000就 ...
- BZOJ 1040: [ZJOI2008]骑士(基环树dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1040 题意: 思路: 这是基环树,因为每个人只会有一个厌恶的人,所以每个节点只会有一个父亲节点,但是 ...
- [bzoj1040][ZJOI2007]骑士(环套树DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1040 分析:第一感觉肯定是树形DP,但可惜不是树.仔细分析,这个图很特殊,每个联通块肯 ...
- 1040: [ZJOI2008]骑士~基环外向树dp
Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中 ...
- [BZOJ1040][ZJOI2008]骑士(环套树dp)
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5816 Solved: 2263[Submit][Status ...
- 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士
基环外向树dp竟然如此简单…… Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发 ...
- [bzoj1040][ZJOI2008]骑士_树形dp_基环树_并查集
骑士 bzoj-1040 ZJOI-2008 题目大意:n个骑士,每个骑士有权值val和一个讨厌的骑士.如果一个骑士讨厌另一个骑士那么他们将不会一起出战.问出战的骑士最大atk是多少. 注释:$1\l ...
- [ZJOI2008]骑士(基环树,树形dp)
[ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的 ...
- BZOJ1040 [ZJOI2008]骑士
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战 ...
随机推荐
- 【转】Pandas学习笔记(二)选择数据
Pandas学习笔记系列: Pandas学习笔记(一)基本介绍 Pandas学习笔记(二)选择数据 Pandas学习笔记(三)修改&添加值 Pandas学习笔记(四)处理丢失值 Pandas学 ...
- 《Pro Continuous Delivery With Jenkins 2.0》随书笔记
今天同时看完<Pro Continuous Delivery With Jenkins 2.0>, 这书与工作关系很大,但也是快速翻翻. 本书着重点jenkins高可用环境搭建,与gith ...
- V4L2视频采集原理
一.简介 Video for Linuxtwo(Video4Linux2)简称V4L2,是V4L的改进版.V4L2是linux操作系统下用于采集图片.视频和音频数据的API接口,配合适当的视频采集设备 ...
- node 单线程异步非阻塞
链接:http://www.runoob.com/nodejs/nodejs-callback.html 首先什么是单线程异步非阻塞? 单线程的意思整个程序从头到尾但是运用一个线程,程序是从上往下执行 ...
- 第二章 linux不为人知的命令
文件和目录命令 cd /home 进入 home目录' cd ..返回上一级目录 pwd显示当前工作路径 ls查看目录中的文件 ls -l 显示文件和目录的详细资料(可简写为ll),后可跟具体文件名 ...
- AtCoder Grand Contest 038题解
好久没更了 写点东西吧= = A 01Matrix 简单构造 左上角和右下角染成1其他染成0即可 #include<bits/stdc++.h> #define ll long long ...
- appache开启自定义404错误并编写404.html
1,让apache支持.htaccess 我们要找到apache安装目录下的httpd.conf文件,在里面找到 <Directory /> Options FollowSymLinks ...
- SQL 变形
需求:共有协议X份,已签XX份,待签X份 sql: select count(1) 总记录数, sum(case when XY_STATUS='1' then 1 else 0 end)待签, su ...
- 【luoguP2252】 取石子游戏
题目链接 定义\(f[i][j]\)表示\(a=i,b=j\)时是必胜态还是必败态,博弈DP可以解决\(a,b \leq 100\) 的情况 然后就可以找规律了,发现\(f[i][j]=0\)的情况很 ...
- quick如何打开工程或者示例
quick如何打开工程或者示例 1. 那里打开工程 cc.ui.UIPushButton.new(images, {scale9 = true}) :setButtonSize(buttonWidth ...