【bzoj1040】[ZJOI2008]骑士 并查集+基环树dp
题目描述
Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英。他们劫富济贫,惩恶扬善,受到社会各界的赞扬。最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争。战火绵延五百里,在和平环境中安逸了数百年的Z国又怎能抵挡的住Y国的军队。于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一个真龙天子的降生,带领正义打败邪恶。骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一些矛盾。每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己),他是绝对不会与自己最厌恶的人一同出征的。战火绵延,人民生灵涂炭,组织起一个骑士军团加入战斗刻不容缓!国王交给了你一个艰巨的任务,从所有的骑士中选出一个骑士军团,使得军团内没有矛盾的两人(不存在一个骑士与他最痛恨的人一同被选入骑士军团的情况),并且,使得这支骑士军团最具有战斗力。为了描述战斗力,我们将骑士按照1至N编号,给每名骑士一个战斗力的估计,一个军团的战斗力为所有骑士的战斗力总和。
输入
第一行包含一个正整数N,描述骑士团的人数。接下来N行,每行两个正整数,按顺序描述每一名骑士的战斗力和他最痛恨的骑士。
输出
应包含一行,包含一个整数,表示你所选出的骑士军团的战斗力。
样例输入
3
10 2
20 3
30 1
样例输出
30
题解
基环树dp
首先分析出本题的痛恨关系是无向的,然后这道题就变成了一道类似的题,只不过那道题是n个点n-1条边的树,本题是n个点n条边,我们称之为“基环树”。
之所以叫做基环树,是因为所有连通块都是n个点n条边的形式,是树上多连了一条边,形成了一个环。
处理基环树问题,一般都是讨论环的断开。
在本题中,若存在边x<->y使得它们连成了一个环,那么肯定x和y不能同时选。那么只有两种情况:x不选,y选不选都行;或y选,x选不选都行。
那么如果x不选,则以x为根做树形dp,取x不选的状态;y不选同理。
判环什么的使用并查集搞一搞,树形dp的方法参见 这里 。
最后需要注意的是本题的图不一定连通,所以对于每个连通块都需要做相同的处理。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1000010
#define inf 0x8000000000000000ll
using namespace std;
int v[N] , head[N] , to[N << 1] , next[N << 1] , cnt , bl[N] , sa[N] , sb[N] , tot;
long long f[N] , g[N];
int find(int x)
{
return x == bl[x] ? x : bl[x] = find(bl[x]);
}
void add(int x , int y)
{
to[++cnt] = y , next[cnt] = head[x] , head[x] = cnt;
}
void dfs(int x , int fa)
{
int i;
f[x] += v[x];
for(i = head[x] ; i ; i = next[i])
if(to[i] != fa)
dfs(to[i] , x) , f[x] += g[to[i]] , g[x] += max(f[to[i]] , g[to[i]]) , f[to[i]] = g[to[i]] = 0;
}
int main()
{
int n , i , x , a , b;
long long ans = 0 , maxn;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++ ) bl[i] = i;
for(i = 1 ; i <= n ; i ++ )
{
scanf("%d%d" , &v[i] , &x);
if(find(x) != find(i)) bl[bl[i]] = bl[x] , add(i , x) , add(x , i);
else sa[++tot] = i , sb[tot] = x;
}
for(i = 1 ; i <= tot ; i ++ )
{
f[sa[i]] = inf , dfs(sb[i] , 0) , maxn = max(f[sb[i]] , g[sb[i]]) , f[sb[i]] = g[sb[i]] = 0;
f[sb[i]] = inf , dfs(sa[i] , 0) , maxn = max(maxn , max(f[sa[i]] , g[sa[i]])) , f[sa[i]] = g[sa[i]] = 0;
ans += maxn;
}
printf("%lld\n" , ans);
return 0;
}
【bzoj1040】[ZJOI2008]骑士 并查集+基环树dp的更多相关文章
- [bzoj1040][ZJOI2008]骑士_树形dp_基环树_并查集
骑士 bzoj-1040 ZJOI-2008 题目大意:n个骑士,每个骑士有权值val和一个讨厌的骑士.如果一个骑士讨厌另一个骑士那么他们将不会一起出战.问出战的骑士最大atk是多少. 注释:$1\l ...
- BZOJ1040:骑士(基环树DP)
Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中 ...
- [ZJOI2008] 骑士 - 基环树dp
一类基环树dp都是这个套路吧 随便拆掉环上的一条边 然后跑树形dp,设\(f[i][0/1]\)表示以第\(i\)个人为根的子树,第\(i\)个人选或不选,能收获的最大值 以断点\(u,v\)为根分别 ...
- UVA1455 - Kingdom(并查集 + 线段树)
UVA1455 - Kingdom(并查集 + 线段树) 题目链接 题目大意:一个平面内,给你n个整数点,两种类型的操作:road x y 把city x 和city y连接起来,line fnum ...
- 【bzoj5133】[CodePlus2017年12月]白金元首与独舞 并查集+矩阵树定理
题目描述 给定一个 $n\times m$ 的方格图,每个格子有 ↑.↓.←.→,表示从该格子能够走到相邻的哪个格子.有一些格子是空着的,需要填上四者之一,需要满足:最终的方格图中,从任意一个位置出发 ...
- 并查集&线段树&树状数组&排序二叉树
超级无敌巨牛逼并查集(带权并查集)https://vjudge.net/problem/UVALive-4487 带删点的加权并查集 https://vjudge.net/problem/UVA-11 ...
- 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)
题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...
- BZOJ 3910 并查集+线段树合并
思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...
- 基环树DP
基环树DP Page1:问题 啥是基环树?就是在一棵树上增加一条边. Page2:基环树的几种情况 无向 有向:基环外向树,基环内向树. Page3:处理问题的基本方式 1.断环成树 2.分别处理树和 ...
随机推荐
- Codeforces Round #411 div2
A. Fake NP 题意:询问一个区间[L,R]出现次数最多的正整数因子(>1). 一个区间内一个因子P出现次数大概为[R/P]-[(L-1)/P],约等于(R-L+1)/P,P取2时最优.注 ...
- Cocos2d-x数据相关的类用法简介(附示例)
(搬运自我在SegmentFault的博客) 在Cocos2d-x的学习和使用中,我遇到了很多关于数据的操作.在这个过程中,我学习了Cocos2d-x自带的很多功能.下面我把接触到的类罗列在下面,给出 ...
- uoj#300.【CTSC2017】吉夫特
题面:http://uoj.ac/problem/300 一道大水题,然而我并不知道$lucas$定理的推论.. $\binom{n}{m}$为奇数的充要条件是$n&m=n$.那么我们对于每个 ...
- RSA AES 前端JS与后台JAVA的加密解密的是实现
AES CryptoJS 前提是编码方式,key,vi中设置一样,就可以进行跨语言加密解密 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...
- extranuclear gene|non-Mendelian inheritance|uniparental inheritance|maternal inheritance
5.8某些细胞器含有DNA 因为除细胞核内的染色体外,细胞质中的细胞器上也有遗传物质(这类遗传物质被称为核外基因(extranuclear gene),比如线粒体上的rRNA,这是因为细胞器基因组是独 ...
- 计算机应用第三次作业:自动开机自动关机 常用DOS命令 关于文件文件夹
一.自动开机 台式机启动时按住DEL键 进入一个蓝色的界面,界面上是英文提示 这个界面是BIOS ,是在机器的ROM中存储 二.自动关机 自动重启 方法一在120秒钟后自动关机 win+r (RUN ...
- vs2005无法附加到进程 系统找不到文件
用管理员身份打开vs2005. 注意配置.
- 使用apache benchmark(ab) 测试报错: apr_socket_recv: Connection timed out (110)
使用ab( apache benchmark )测试的时候,使用如下命令: ab -n 15000 -c 200 http://localhost/abc/abc.php 执行操作一定条数,或连续 ...
- 蓝牙stack bluez学习(1)Stack Architecture
Bluez支持的features Core Specification 4.2 (GAP, L2CAP, RFCOMM, SDP, GATT) Classic Bluetooth (BR/EDR) B ...
- React 基础知识总结
data-id="1190000016885142" data-license=""> 一.Node.js Node.js并不是一个JavaScript框 ...