【树形DP】ZJOI2008 骑士
题目内容
洛谷链接
有\(n\)位骑士,每个人的战力可能不同,并且每一个人都有且仅有一个憎恨的人,互相憎恨的人不能在同一队中。
求组合为一个骑士队的最大战斗力。
PS:可以去看看题目背景学学历史(雾)
输入格式
第一行包含一个正整数\(n\),描述骑士团的人数。
接下来\(n\)行,每行两个正整数,按顺序描述每一名骑士的战斗力和他最痛恨的骑士。
数据范围
\(n ≤ 1 000 000\),每名骑士的战斗力都是不大于$ 1 000 000$的正整数。
输出格式
输出最大战斗力。
样例输入
3
10 2
20 3
30 1
样例输出
30
思路
参考没有上司的舞会
不过还是稍有不同,因为没有上司的舞会是个树,而此题是个有向图,可能存在环之类的。
可以把环断开,两个端点分别深搜。
数组为\(dp[1000000][2]\),第二维若为1表示选\(i\)点,0则表示不选。用\(j\)表示\(i\)的憎恨者。
转移方程:
\(
\begin{cases}
f[i][1]+=f[j][0],\\
f[i][0]+=max(f[j][0],f[j][1]).\\
\end{cases}
\)
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
const int INF=0x3f3f3f3f;
int n;
ll ans;//可能超int
ll hater[maxn],fight[maxn],dp[maxn][2];
bool vis[maxn];
struct Node{
int x,y;
}c[maxn];
int cnt,head[maxn];
void add(int x,int y){
c[++cnt].x=head[x];
c[cnt].y=y;
head[x]=cnt;
}
void dfs(int x,int g){
vis[x]=1;
dp[x][1]=fight[x];
dp[x][0]=0;
for(int i=head[x];i;i=c[i].x)
if(c[i].y!=g){
dfs(c[i].y,g);
dp[x][1]+=dp[c[i].y][0];
dp[x][0]+=max(dp[c[i].y][0],dp[c[i].y][1]);
}
else dp[c[i].y][1]=-INF;
}
void find(int x){
while(!vis[x]){
vis[x]=1;
x=hater[x];
}
dfs(x,x);
ll temp=max(dp[x][1],dp[x][0]);
x=hater[x];
dfs(x,x);
ans+=max(temp,max(dp[x][1],dp[x][0]));
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;
scanf("%lld%d",&fight[i],&x);
add(x,i);
hater[i]=x;
}
for(int i=1;i<=n;i++)
if(!vis[i])find(i);
printf("%lld",ans);
return 0;
}
【树形DP】ZJOI2008 骑士的更多相关文章
- 【树形DP】骑士
骑士 题目描述 \(Z\)国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的\(Y\)国发动了一场针对Z国的侵略 ...
- BZOJ_1040_[ZJOI2008]骑士_树形DP
BZOJ_1040_[ZJOI2008]骑士_树形DP 题意: Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪 ...
- 【BZOJ1040】[ZJOI2008]骑士 树形DP
[BZOJ1040][ZJOI2008]骑士 Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情 ...
- [ZJOI2008]骑士(基环树,树形dp)
[ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的 ...
- 「树形DP」洛谷P2607 [ZJOI2008]骑士
P2607 [ZJOI2008]骑士 题面: 题目描述 Z 国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的 ...
- bzoj 1040: [ZJOI2008]骑士 树形dp
题目链接 1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3054 Solved: 1162[Submit][S ...
- 【环套树+树形dp】Bzoj1040 [ZJOI2008] 骑士
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火 ...
- 【洛谷】2607: [ZJOI2008]骑士【树形DP】【基环树】
P2607 [ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一 ...
- 洛谷P2607 [ZJOI2008]骑士(树形dp)
题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里, ...
- BZOJ 1040 [ZJOI2008]骑士 (基环树+树形DP)
<题目链接> 题目大意: Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的 ...
随机推荐
- Python基础 读取二进制文件
问题 有二进制文件中保存了 20 亿个 2 Bytes 的数,需将其读出,每 20000 个数作图,拟合后输出结果. 解决 # -*- coding: utf-8 -*- ""&q ...
- RabbitMQ和Kafka的高可用集群原理
前言 小伙伴们,通过前边文章的阅读,相信大家已经对RocketMQ的基本原理有了一个比较深入的了解,那么大家对当前比较常用的RabbitMQ和Kafka是不是也有兴趣了解一些呢,了解的多一些也不是坏事 ...
- python基础:日志模块logging,nnlog
python里面用来打印日志的模块,就是logging模块,logging模块可以在控制台打印日志,也可以写入文件中.也可以两个操作都执行 1.控制台输入 import logging#导入模块 lo ...
- random模块的应用
- PHP之道(PHP The Right Way)
原文地址:http://laravel-china.github.io/php-the-right-way/
- 再学ajax--第二天 | 基于php+mysql+ajax的表单注册、登录、注销
写在前面 ajax学习到了第二天,这次是用第一天封装的ajax函数,后端使用了php+mysql实现基本的注册,登录,注销. php是我前几个月get到的技能,我已经学习到了面向对象,知道各修饰符的含 ...
- 【小白学PyTorch】12 SENet详解及PyTorch实现
文章来自微信公众号[机器学习炼丹术].我是炼丹兄,有什么问题都可以来找我交流,近期建立了微信交流群,也在朋友圈抽奖赠书十多本了.我的微信是cyx645016617,欢迎各位朋友. 参考目录: @ 目录 ...
- 7.Semaphore-信号量
- 使用binlog2sql恢复数据
binlog2sql 是一款比较常用的数据恢复工具,可以通过它从MySQL binlog解析出你要的SQL,并根据不同选项,可以得到原始SQL.回滚SQL.去除主键的INSERT SQL等.主要用途如 ...
- goto 无条件跳转
0. 基本模型 goto 顾言思义,是跳转的意思. goto 后接一个标签,这个标签的意义是告诉 Go程序下一步要执行哪里的代码. 所以这个标签如何放置,放置在哪里,是 goto 里最需要注意的. g ...