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—骑士的更多相关文章

  1. [bzoj1040][ZJOI2008]骑士_树形dp_基环树_并查集

    骑士 bzoj-1040 ZJOI-2008 题目大意:n个骑士,每个骑士有权值val和一个讨厌的骑士.如果一个骑士讨厌另一个骑士那么他们将不会一起出战.问出战的骑士最大atk是多少. 注释:$1\l ...

  2. [BZOJ1040][ZJOI2008]骑士(环套树dp)

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5816  Solved: 2263[Submit][Status ...

  3. BZOJ1040: [ZJOI2008]骑士(奇环树,DP)

    题目: 1040: [ZJOI2008]骑士 解析: 假设骑士\(u\)讨厌骑士\(v\),我们在\(u\),\(v\)之间连一条边,这样我们就得到了一个奇环树(奇环森林),既然是一颗奇环树,我们就先 ...

  4. [BZOJ1040] [ZJOI2008]骑士 解题报告

    Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火 ...

  5. BZOJ1040 [ZJOI2008]骑士

    Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战 ...

  6. 【环套树+树形dp】Bzoj1040 [ZJOI2008] 骑士

    Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火 ...

  7. 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士

    基环外向树dp竟然如此简单…… Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发 ...

  8. luogu2607/bzoj1040 [ZJOI2008]骑士 (基环树形dp)

    N个点,每个点发出一条边,那么这个图的形状一定是一个基环树森林(如果有重边就会出现森林) 那我做f[0][x]和f[1][x]分别表示对于x子树,x这个点选还是不选所带来的最大价值 然后就变成了这好几 ...

  9. BZOJ1040 [ZJOI2008]骑士 基环树林(环套树) 树形动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题意概括 有n个人,每一个人有一个最恨的人. 并且,每一个人有一个权值. 一个人不可以和他最恨的人同时被选中. 现在请你求出在 ...

  10. 2018.11.06 bzoj1040: [ZJOI2008]骑士(树形dp)

    传送门 由题可知给出的是基环森林. 因此对于每个基环森林找到环断开dpdpdp两次就行了. 代码: #include<bits/stdc++.h> using namespace std; ...

随机推荐

  1. WPF EventTrigger,BeginStoryboard

    <Window x:Class="WpfApplication2.LoginWind" xmlns="http://schemas.microsoft.com/wi ...

  2. 2015520吴思其 基于《Arm试验箱的国密算法应用》课程设计个人报告

    20155200吴思其 基于<Arm试验箱的国密算法应用>课程设计个人报告 课程设计中承担的任务 完成试验箱测试功能4,5,6以及SM3加密实验的实现 测试四 GPIO0按键中断实验 实验 ...

  3. POJ1159

    这竟然是IOI虽然是2000年的,但其实也改变不了它水题的本质 我写了两种方法,这里都讲一下吧 考虑记忆化搜索,用f[i][j]表示当区间的左端为i,右端为j时最少要添加多少字符,所以ans就为f[1 ...

  4. Selenium-ActionChainsApi接口详解

    ActionChains 有时候我们在通过Selenium做UI自动化的时候,明明能够在DOM树内看到这个元素,但是我在通过driver click.sendkey的时候,就是点击不到或无法输入字符串 ...

  5. IP 解析器(IpParser) test 和 生产环境 实现

    注意:之前我maven居然没有引入 StringUtils 的包,然后引入了一个路径类似,但其实包路径不一样的 StringUtils ,居然是划掉的状态,像这样 StringUtils ,这个其实不 ...

  6. [BZOJ4082][Wf2014]Surveillance[倍增]

    题意 给你一个长度为 \(len\) 的环,以及 \(n\) 个区间,要你选择尽量少的区间,使得它们完全覆盖整个环.问最少要多少个区间. \(len,n\leq 10^6\) . 分析 考虑普通的区间 ...

  7. 毕业回馈-89c52之最小系统

    今天分享一个51单片机最小系统的电路板设计(原理图+PCB) 技术手册上面对于51单片机最小系统作如下要求: 下载电路主要有以下几种: 采用RS-232转换器下载:(R1OUT-P3.0;T1IN-P ...

  8. 重磅发布丨乐维监控:全面兼容云平台,助力企业DevOps转型升级!

    2019年伊始,我们迎来了乐维监控的又一重大功能更新——云平台监控,这将有效帮助企业将云上.云下数据聚合,方便统一化的监控管理与维护!未来,乐维监控每一次的产品功能及版本更新,我们都将第一时间于此发布 ...

  9. 高可用Kubernetes集群-14. 部署Kubernetes集群性能监控平台

    参考文档: Github介绍:https://github.com/kubernetes/heapster Github yaml文件: https://github.com/kubernetes/h ...

  10. TCP三路握手,本质是一个通信原理相关的问题

    在通信系统中,最基本的信息的传递都需要两步,发送方发送的消息和对方的回复确认:A->B Send, B->A Reply(ACK).如果多接触一下其他行业的通信流程和规范,例如航空.铁路调 ...