【bzoj1040】 ZJOI2008—骑士
http://www.lydsy.com/JudgeOnline/problem.php?id=1040 (题目链接)
题意
一个基环森林,从中选出不相邻的若干个点使得这些点的点权和最大。
Solution
把树做完以后枚举环上一点选和不选,两者取个最值就可以了。多个连通块的情况用并查集搞一下。
细节
开LL
代码
// bzoj1040
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define inf (1ll<<30)
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxn=1000010;
LL f[maxn][2],t[maxn][2],ans;
int head[maxn],dag[maxn],vis[maxn],fa[maxn],p[maxn],a[maxn],w[maxn],cnt,n,m;
struct edge {int to,next;}e[maxn<<1]; void link(int u,int v) {
e[++cnt]=(edge){v,head[u]};head[u]=cnt;
e[++cnt]=(edge){u,head[v]};head[v]=cnt;
}
void topsort() {
queue<int> q;
for (int i=1;i<=n;i++) if (dag[i]==1) q.push(i);
while (!q.empty()) {
int x=q.front();q.pop();dag[x]--;
for (int i=head[x];i;i=e[i].next)
if (dag[e[i].to]>1) if (--dag[e[i].to]==1) q.push(e[i].to);
}
}
void dfs(int x,int fa) {
f[x][1]=w[x],f[x][0]=0;
for (int i=head[x];i;i=e[i].next) if (e[i].to!=fa && !dag[e[i].to]) {
dfs(e[i].to,x);
f[x][1]+=f[e[i].to][0];
f[x][0]+=max(f[e[i].to][1],f[e[i].to][0]);
}
}
void find(int x,int fa) {
a[++m]=x;vis[x]=1;
for (int i=head[x];i;i=e[i].next)
if (!vis[e[i].to] && dag[e[i].to]) find(e[i].to,x);
}
int find(int x) {
return x==fa[x] ? x : fa[x]=find(fa[x]);
}
LL dp(int x) {
LL res=0;
m=0;find(x,0);
t[1][1]=f[a[1]][1];t[1][0]=0;
t[2][1]=0;t[2][0]=f[a[1]][1]+f[a[2]][0];
for (int i=3;i<m;i++) {
t[i][0]=max(t[i-1][1],t[i-1][0])+f[a[i]][0];
t[i][1]=t[i-1][0]+f[a[i]][1];
}
res=max(res,max(t[m-1][1],t[m-1][0])+f[a[m]][0]);
t[1][1]=0;t[1][0]=f[a[1]][0];
for (int i=2;i<=m;i++) {
t[i][0]=max(t[i-1][1],t[i-1][0])+f[a[i]][0];
t[i][1]=t[i-1][0]+f[a[i]][1];
}
return max(res,max(t[m][1],t[m][0]));
}
int main() {
scanf("%d",&n);
for (int i=1;i<=n;i++) fa[i]=i;
for (int u,i=1;i<=n;i++) {
scanf("%d%d",&w[i],&u);
link(i,u);dag[i]++,dag[u]++;
if (find(i)!=find(u)) fa[find(i)]=find(u);
}
topsort();
for (int i=1;i<=n;i++) if (dag[i]) {
p[find(i)]=i;
dfs(i,0);
}
for (int i=1;i<=n;i++) if (p[i]) ans+=dp(p[i]);
printf("%lld",ans);
return 0;
}
【bzoj1040】 ZJOI2008—骑士的更多相关文章
- [bzoj1040][ZJOI2008]骑士_树形dp_基环树_并查集
骑士 bzoj-1040 ZJOI-2008 题目大意:n个骑士,每个骑士有权值val和一个讨厌的骑士.如果一个骑士讨厌另一个骑士那么他们将不会一起出战.问出战的骑士最大atk是多少. 注释:$1\l ...
- [BZOJ1040][ZJOI2008]骑士(环套树dp)
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5816 Solved: 2263[Submit][Status ...
- BZOJ1040: [ZJOI2008]骑士(奇环树,DP)
题目: 1040: [ZJOI2008]骑士 解析: 假设骑士\(u\)讨厌骑士\(v\),我们在\(u\),\(v\)之间连一条边,这样我们就得到了一个奇环树(奇环森林),既然是一颗奇环树,我们就先 ...
- [BZOJ1040] [ZJOI2008]骑士 解题报告
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火 ...
- BZOJ1040 [ZJOI2008]骑士
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战 ...
- 【环套树+树形dp】Bzoj1040 [ZJOI2008] 骑士
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火 ...
- 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士
基环外向树dp竟然如此简单…… Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发 ...
- luogu2607/bzoj1040 [ZJOI2008]骑士 (基环树形dp)
N个点,每个点发出一条边,那么这个图的形状一定是一个基环树森林(如果有重边就会出现森林) 那我做f[0][x]和f[1][x]分别表示对于x子树,x这个点选还是不选所带来的最大价值 然后就变成了这好几 ...
- BZOJ1040 [ZJOI2008]骑士 基环树林(环套树) 树形动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题意概括 有n个人,每一个人有一个最恨的人. 并且,每一个人有一个权值. 一个人不可以和他最恨的人同时被选中. 现在请你求出在 ...
- 2018.11.06 bzoj1040: [ZJOI2008]骑士(树形dp)
传送门 由题可知给出的是基环森林. 因此对于每个基环森林找到环断开dpdpdp两次就行了. 代码: #include<bits/stdc++.h> using namespace std; ...
随机推荐
- Spring3 访问静态资源
<mvc:resources location="/jquery/" mapping="/jquery/**"/> <mvc:resource ...
- go语言之行--包与变量
一.包的概念 包是go语言中不可缺少部分,在每个go源码的第一行进行定义,定义方式是:package "包名",并且该名称是作为调用该包时候所使用的名称. 包的概念总结: 每个 G ...
- 20155325 Exp6 信息搜集与漏洞扫描
实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的 ...
- C语言学习之枚举类型
前言 枚举(enum)类型是计算机编程语言中的一种数据类型.枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内.例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等.如果把 ...
- stl源码剖析 详细学习笔记 算法(1)
//---------------------------15/03/27---------------------------- //算法 { /* 质变算法:会改变操作对象之值 所有的stl算法都 ...
- C#杂乱知识汇总
:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdow ...
- Js_数组操作
用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简单的string.split(char).这段时间做的一个项目,用到数组的地方很多,自以为js高手的自己居然无从下手,一下狠心,我学!呵 ...
- JMeter:生成漂亮的接口/压力测试的HTML报告
JMeter生成HTML网页报告(非gui模式操作) 我们做性能测试的时候会经常使用一些性能测试工具,比如loardrunner和jmeter,我个人比较喜欢Jmeter这个工具,jmeter之前版本 ...
- 软件测试----H模型
H模型将测试活动完全独立出来,形成一个完整的流程,同时将测试准备和测试执行清晰表现出来. 测试流程: --测试准备:所有测试活动的准备判断是否到测试就绪点. --测试就绪点:测试准入准则,即是否可以开 ...
- manjaro安装软件
fcitx 安装以下包 fcitx-googlepinyin kcm-fcitx 安装了输入法之后,还要在/etc/profile或~/.xprofile里添加如下内容: export GTK_IM_ ...