P2607 [ZJOI2008]骑士 基环树,树dp;
P2607 [ZJOI2008]骑士
本题本质上就是树dp,和没有上司的舞会差不多,只不过多了一个对基环树的处理。
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#define ll long long
using namespace std;
const int maxn=2e6;
int n,cnt;
ll val[maxn];
int root;
int head[maxn];
int vis[maxn];
ll fa[maxn];
ll f[maxn][2];
ll ans;
int rot;
ll max1(ll x,ll y){
if(x>=y){
return x;
}
return y;
}
inline ll read(){
ll ret=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
f=-f;
}
ch=getchar();
}
while(ch<='9'&&ch>='0'){
ret=ret*10+(ch^'0');
ch=getchar();
}
return f*ret;
}
struct node{
int nex,to;
}e[maxn];
void add(int u,int v){
cnt++;
e[cnt].nex=head[u];
e[cnt].to=v;
head[u]=cnt;
}
void dp(int x){
vis[x]=1;//打标记,用处是表明联通块,把该联通块进行标记
//以便遍历整连接关系,除此之外并无用处
f[x][1]=val[x];
f[x][0]=0;
for(int i=head[x];i;i=e[i].nex){
int to=e[i].to;
if(to!=root){
dp(to);
f[x][0]+=max1(f[to][0],f[to][1]);
f[x][1]+=f[to][0];
}
else{
f[to][1]=-maxn;//将环删边,定有一点不能选,故定此点不选
}
}
}
void find(int x){
vis[x]=1;
root=x;
while(!vis[fa[root]]){//我们的目的是为了找环,而且该连通块先前一定未遍历过
//故该方法可以找出环来
root=fa[root];
vis[root]=1;
}
/*
该题中图的特殊性
导致找环必须要从下到上
若从上到下
那么如果起点为树边就无法找到环
该图的根为环
*/
dp(root);
ll t;
t=max(f[root][1],f[root][0]);//删一条边不选边上一点的情况下,该联通块的最大值
root=fa[root];
dp(root);
ans+=max1(t,max1(f[root][1],f[root][0])); //将两种情况比较;
}
int main(){
n=read();
int x;
for(int i=1;i<=n;i++){
val[i]=read();
x=read();
add(x,i);
fa[i]=x;
}
for(int i=1;i<=n;i++){
if(!vis[i]){
find(i);
}
}
cout<<ans;
return 0;
}
快去ac吧
P2607 [ZJOI2008]骑士 基环树,树dp;的更多相关文章
- 1040: [ZJOI2008]骑士~基环外向树dp
Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中 ...
- 洛谷P2607 [ZJOI2008]骑士 基环树动归
Code: #include<algorithm> #include<cstdio> #include<algorithm> #include<cstring ...
- 「树形DP」洛谷P2607 [ZJOI2008]骑士
P2607 [ZJOI2008]骑士 题面: 题目描述 Z 国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的 ...
- 洛谷P2607 [ZJOI2008]骑士
P2607 [ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一 ...
- 洛谷 P2607 [ZJOI2008]骑士 解题报告
P2607 [ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一 ...
- BZOJ1040: [ZJOI2008]骑士(奇环树,DP)
题目: 1040: [ZJOI2008]骑士 解析: 假设骑士\(u\)讨厌骑士\(v\),我们在\(u\),\(v\)之间连一条边,这样我们就得到了一个奇环树(奇环森林),既然是一颗奇环树,我们就先 ...
- BZOJ 1040: [ZJOI2008]骑士 基环加外向树
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1190 Solved: 465[Submit][Status] ...
- [bzoj] 1040 骑士 || 基环外向树dp
原题 给出n个点n条边和每个点的点权,一条边的两个断点不能同时选择,问最大可以选多少. //图是一张基环外向树森林 是不是很像舞会啊- 就是多了一条边. 所以我们考虑一下对于一棵基环外向树,拆掉一条在 ...
- BZOJ1040 骑士 基环外向树
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6421 Solved: 2544[Submit][Status ...
随机推荐
- 01_Linux基础篇
学于黑马.传智播客.尚硅谷 感谢 黑马官网 传智播客官网 尚硅谷官网 微信搜索"艺术行者",关注并回复关键词"linux"获取视频和教程资料! b站在线视频 第 ...
- PHP stristr() 函数
实例 查找 "world" 在 "Hello world!" 中的第一次出现,并返回字符串的剩余部分: <?php高佣联盟 www.cgewang.com ...
- bzoj 2839 集合计数 容斥\广义容斥
LINK:集合计数 容斥简单题 却引出我对广义容斥的深思. 一直以来我都不理解广义容斥是为什么 在什么情况下使用. 给一张图: 这张图想要表达的意思就是这道题目的意思 而求的东西也和题目一致. 特点: ...
- 32-关键字:abstract
abstract: 抽象的 1.可以用来修饰:类.方法 2.具体的:abstract修饰类:抽象类 * > 此类不能实例化 * > 抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对 ...
- CustomPlot 在Qt下 鼠标点击曲线 显示当前坐标
此次记录主要是为了下次使用时能回忆起来才做得笔记,若有需改进的地方,请不吝珠玉. widget.cpp #include "widget.h" #include "ui_ ...
- c++日志工具spdLog
c++日志工具spdLog简单使用示例代码 spdlog直接引用头文件就可以使用,这一点还是比较方便的,也是刚入门使用,下面是在源码的示例代码基础上修改测试的代码: #include <cstd ...
- Python分析「我们为什么这么穷」
- 《Python测试开发技术栈—巴哥职场进化记》—软件测试工程师“兵器库”
上文<Python测试开发技术栈-巴哥职场进化记>-初来乍到,请多关照 我们介绍了巴哥入职后见到了自己的导师华哥,第一次参加团队站会,认识了团队中的开发小哥哥和产品小姐姐以及吃到了公司的加 ...
- The Involution Principle
目录 Catalan Paths Vandermonde Determinant The Pfaffian Catalan Paths 从 \((0,0)\) 走到 \((n,n)\), 每次只能向上 ...
- OpenCV之高斯平滑(Python实现)
假设一个列数为W,行数为H的高斯卷计算子gaussKernel,其中W,H均为奇数,描点位置在((H-1)/2 ,(W-1)/2),构建高斯卷积核的步骤如下 1.计算高斯矩阵 \[gaussMatri ...