BZOJ1040: [ZJOI2008]骑士 树套环DP
- 题意:一个图n个点n条边保证点能互相到达,ab有边意味着ab互相厌恶,求一个集合,使得集合里元素最多而且没有人互相厌恶
- 删去环上一条边树形dp,比如删掉的边连着a,b,那么先dp出不选a的最大值,再dp出不选b的最大值。
- 如果每次找到环删边的方法是直接把边断掉,这样会出现一个Bug就是a有指向b的边,b有指向a的边,这样形成的环其实不需要删掉
- 解决办法:就是建边的时候如果是上面的情况a b之间就建了两条边,那这样把重边删去就行了(删完之后就break掉)
- 代码:
#include <bits/stdc++.h>
#define nmax 1000010 using namespace std;
typedef long long ll;
vector <int> g[nmax];
int n, in, a, b, cnt;
ll d[nmax][]={}; // dp[u][1] = sum dp[v][0] + zl[u] dp[u][0] = sum max(dp[v][0],dp[v][1]+x[v])
int zl[nmax], vis[nmax]={}; void dfs(int u, int fa){
d[u][] = zl[u];
for (int i=; i<g[u].size(); i++) {
int v = g[u][i];
if(v==fa || v==) continue;
dfs(v, u);
d[u][] += d[v][];
d[u][] += max(d[v][], d[v][]);
}
} void fr(int u, int fa){
cnt++;
vis[u] = ;
for (int i=; i<g[u].size(); i++) {
int v = g[u][i];
if(v == fa || v == ) continue;
if( vis[v] ) { a=u; b=v; }
else fr(v, u);
}
} inline void del(int x, int y){
for (int i=; i<g[x].size(); i++) if( g[x][i] == y ) { g[x][i] = ; break; }
} inline void init(int u, int fa){
d[u][] = d[u][] = ;
for (int i=; i<g[u].size(); i++) {
int v = g[u][i];
if( v==fa || v== ) continue;
init(v, u);
}
} int main(){
cin >> n;
for (int i=; i<=n; i++) {
scanf("%d%d", &zl[i], &in);
g[in].push_back(i);
g[i].push_back(in);
}
ll ans=, ta;
for (int i=; i<=n; i++) {
if(vis[i]) continue;
cnt = ; //这个树套环的节点个数
fr(i, );
del(a, b);
del(b, a);
dfs(a, );
ta = d[a][];
init(i, );
dfs(b, );
ta = max(ta, d[b][] );
init(i, );
ans += ta;
}
cout << ans << endl;
return ;
}(⓿_⓿)
BZOJ1040: [ZJOI2008]骑士 树套环DP的更多相关文章
- 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; ...
- BZOJ_1040_[ZJOI2008]骑士_树形DP
BZOJ_1040_[ZJOI2008]骑士_树形DP 题意: Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪 ...
- BZOJ1040: [ZJOI2008]骑士(奇环树,DP)
题目: 1040: [ZJOI2008]骑士 解析: 假设骑士\(u\)讨厌骑士\(v\),我们在\(u\),\(v\)之间连一条边,这样我们就得到了一个奇环树(奇环森林),既然是一颗奇环树,我们就先 ...
- [BZOJ1040][ZJOI2008]骑士(环套树dp)
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5816 Solved: 2263[Submit][Status ...
- [bzoj1040][ZJOI2008]骑士_树形dp_基环树_并查集
骑士 bzoj-1040 ZJOI-2008 题目大意:n个骑士,每个骑士有权值val和一个讨厌的骑士.如果一个骑士讨厌另一个骑士那么他们将不会一起出战.问出战的骑士最大atk是多少. 注释:$1\l ...
- 【洛谷】2607: [ZJOI2008]骑士【树形DP】【基环树】
P2607 [ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一 ...
- 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士
基环外向树dp竟然如此简单…… Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发 ...
- 【环套树+树形dp】Bzoj1040 [ZJOI2008] 骑士
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火 ...
随机推荐
- 《Head first设计模式》之工厂模式
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个.工厂方法让类把实例化推迟到了子类. 预定披萨 假设你有一个披萨店,预定披萨的代码可能是这么写的: Pizza orderPizz ...
- 20191230--python学习第一天(补)
1.py第一个脚本 打开电脑终端,功能键+R 输入命令:解释器路径+脚本路径(建议.py后缀) 2.编码 (1)初始编码 ascii,英文,8为表示一个东西,2**8 8位 = 1字节 unicod ...
- Zookeeper 部署 配置文件
Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式. ■ 单机模式: Zookeeper只运行在一台服务器上,适合测试环境:■ 伪集群模式:就是 ...
- lua学习之深入函数第二篇
深入函数 2 非全局的函数 函数是第一类值,函数可以存储到全局变量,局部变量,table 字段中 lua 函数库中的大部分函数存储到 table 字段中 Lib = {} Lib.foo = func ...
- 量化投资学习笔记27——《Python机器学习应用》课程笔记01
北京理工大学在线课程: http://www.icourse163.org/course/BIT-1001872001 机器学习分类 监督学习 无监督学习 半监督学习 强化学习 深度学习 Scikit ...
- Linux运维--实践-Rally
1.rally简介 OpenStack Rally 是一个自动化测试工具,社区希望通过 Rally 来解答 "How does OpenStack work at scale?(如何规模化运 ...
- Android5.0和Android6.0适配
gradle配置项 compileSdkVersion 用哪个 Android SDK 版本编译你的应用.因此我们强烈推荐总是使用最新的 SDK 进行编译.在现有代码上使用新的编译检查可以获得很多好处 ...
- 范式通俗理解:1NF、2NF、3NF和BNCF
https://blog.csdn.net/wyh7280/article/details/83350722 范式通俗理解:1NF.2NF.3NF和BNCF原创hongiii 最后发布于2018-10 ...
- centos5,6 系统启动流程
linux内核特点: 支持模块化:模块文件的名字以.ko(kernel object)结尾 支持内核运行时,动态加载和卸载模块文件. linux内核组成部分: 核心文件:/boot/vmlinuz-V ...
- Docker总结2020
1. docker ps docker exec -it php7 /bin/bash 设置文件权限: chmod -R sign_tp5/ 重启nginx命令: nginx -s reload ...