BZOJ 1040:[ZJOI2008]骑士(环套外向树+树形DP)
【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=1040
【题目大意】
给出环套外向树森林,求最大权独立集。
【题解】
我们对于每个连通块,找到环上的一条边拆开,对于边的两端分别做树形DP,
假设两端点位x和y,那么不包含x的dp值涵盖了是否包含y两种情况,
同理,以y为根的也是,因为边的两端不能同时取到,因此对于两者取最大值即可。
代码中f[x]表示包含x的dp值,g[x]表示不包含x的dp值。
【代码】
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long LL;
const int N=1000010;
vector<int> v[N],id[N];
LL g[N],f[N],ans;
int ban,n,c[N],x,vis[N],root,_root,idn=0;
void dfs(int x,int fx){
vis[x]=1;
for(int i=0;i<v[x].size();i++){
int y=v[x][i];
if(y==fx)continue;
if(!vis[y])dfs(y,x);
else{root=y;_root=x;ban=id[x][i];}
}
}
void TreeDP(int x,int fx){
f[x]=c[x],g[x]=0;
for(int i=0;i<v[x].size();i++){
int y=v[x][i];
if(y==fx)continue;
if(id[x][i]==ban||id[x][i]==(ban^1))continue;
TreeDP(y,x);
f[x]+=g[y]; g[x]+=max(f[y],g[y]);
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&c[i],&x);
v[x].push_back(i);
id[x].push_back(idn++);
v[i].push_back(x);
id[i].push_back(idn++);
}
for(int i=1;i<=n;i++){
if(!vis[i]){
dfs(i,-1);
TreeDP(root,-1);
LL tmp=g[root];
TreeDP(_root,-1);
tmp=max(tmp,g[_root]);
ans+=tmp;
}
}printf("%lld\n",ans);
return 0;
}
BZOJ 1040:[ZJOI2008]骑士(环套外向树+树形DP)的更多相关文章
- bzoj 1040: [ZJOI2008]骑士【基环树+树形dp】
没考虑可以连着两个不选--直接染色了 实际上是基环森林,对于每棵基环树,dfs找出一个环边,然后断掉这条边,分别对这条边的两端点做一边treedp,取max加进答案里 treedp是设f[u]为选u点 ...
- BZOJ 1040: [ZJOI2008]骑士(基环树dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1040 题意: 思路: 这是基环树,因为每个人只会有一个厌恶的人,所以每个节点只会有一个父亲节点,但是 ...
- 1040: [ZJOI2008]骑士~基环外向树dp
Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中 ...
- BZOJ 1040: [ZJOI2008]骑士 [DP 环套树]
传送门 题意:环套树的最大权独立集 一开始想处理出外向树树形$DP$然后找到环再做个环形$DP$ 然后看了看别人的题解其实只要断开环做两遍树形$DP$就行了...有道理! 注意不连通 然后洛谷时限再次 ...
- 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: 3054 Solved: 1162[Submit][S ...
- [BZOJ 1040][ZJOI2008]骑士
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5403 Solved: 2060[Submit][Status ...
- bzoj 1040: [ZJOI2008]骑士 環套樹DP
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1755 Solved: 690[Submit][Status] ...
- Bzoj 1040 [ZJOI2008]骑士 题解
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5368 Solved: 2044[Submit][Status ...
随机推荐
- MSSQL 错误:在将 varchar 值 '1,2,3,5,6' 转换成数据类型 int 时失败。
MSSQL 错误:在将 varchar 值 '1,2,3,5,6' 转换成数据类型 int 时失败.
- linux系统环境 ——(四)
默认有6个命令交互通道和一个图形界面交互通道,默认进入到的是图形界面通道 命令交互模式切换:ctrl+alt+f1---f6 图形交互界面 ctrl+alt+f7 1.图形界面交互模式 - termi ...
- 【转】关于Scapy
关于Scapy Scapy的是一个强大的交互式数据包处理程序(使用python编写).它能够伪造 或者解码大量的网络协议数据包,能够发送.捕捉.匹配请求和回复包等等.它可以很容易地处理一些典型操作,比 ...
- 一个基于时间注入的perl小脚本
use strict; use warnings; use LWP::Simple; my %table_and_leng; ;;$count++){ #print "Test Table: ...
- ms17010利用失败解决一则
没有反弹得到session并且提示如下: [-] 10.0.131.2:445 - Service failed to start, ERROR_CODE: 216 换了一个payload set p ...
- python科学计算整理
网站: http://bokeh.pydata.org/gallery.html
- java===编译引用第三方文件的类(原创)
http://blog.csdn.net/m53931422/article/details/42174609 http://blog.csdn.net/u012450329/article/deta ...
- python基础===通过菲波那契数列,理解函数
def fib(n): # write Fibonacci series up to n """Print a Fibonacci series up to n.&quo ...
- 测试mysqldump 压缩率和时间消耗
测试mysqldump 压缩率和时间消耗 实验总结: 从本次实验数据可以看出,mysqldump通过|gzip参数可以将导出文件压缩53%,同时耗时也普通非压缩模式的2.3倍. 数据库环境: #[ro ...
- interrupted()和isInterrupted()比较+终止线程的正确方法+暂停线程
interrupted():测试当前线程[运行此方法的当前线程]是否已经是中断状态,执行后具有将状态标志清除为false的功能. isInterrupted():测试线程对象是否已经是中断状态,但不清 ...