ZJOI2008 骑士(树型DP)
ZJOI2008 骑士
题目大意
给出n个人的战斗力和每个人讨厌的人,然后问最大能有多大的战斗力
solution
简单粗暴的题意,有一丢丢背包的感觉
那敢情就是DP了
有点像没有上司的舞会,,,
根据题意,骑士之间互相厌恶会形成一个环,任务就是找到这个环并且把它断开,然后对断开的两个端点分别求答案,然后取最优结果
设定当前点为u
断开的两个节点是u1和u2
选取当前点的状态记为1,不选的话就是0
那么数组就是dp[u][0],dp[u][1]
从这两个中间取最大值即可
最后将所有的DP值加和就是结果了
第一眼应为想到要找环,所以本来打算写Tarjan判连通块
然后去blogs验证思路的时候发现好像并不需要
用到了一个神奇的东东——拓扑排序
判环,拆分,统计入度和出度
求和得到结果即可
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
inline int read(){
int x = 0, w = 1;
char ch = getchar();
for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') w = -1;
for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return x * w;
}
const int N = 1000000 + 10;
int head[N], cnt = 1, size[N], r1, r2,p[N];
struct Edge {
int to, next;
} edges[N << 1];
bool vis[N], flag;
long long ans, f[N][2];
inline void add(int x, int y) {
edges[++cnt].next = head[x];
edges[cnt].to = y;
head[x] = cnt;
}
inline void dfs(int x, int fa) {
vis[x] = 1;
size[++size[0]] = x;
for (int i = head[x]; i; i = edges[i].next) {
int v = edges[i].to;
if (v == fa) continue;
if (!vis[v]) dfs(v, x);
else if (vis[v] && !flag) {
flag = true;
r1 = x, r2 = v;
}
}
}
inline void dfs2(int x, int fa) {
f[x][0] = 0;
f[x][1] = p[x];
for (int i = head[x]; i; i = edges[i].next) {
int v = edges[i].to;
if (v && v != fa) {
dfs2(v, x);
f[x][1] += f[v][0];
f[x][0] += max(f[v][0], f[v][1]);
}
}
}
inline void solve() {
if (!flag) {
int root = size[1];
dfs2(root, -1);
ans += max(f[root][0], f[root][1]);
} else {
long long maxv = -100;
for (int i = head[r1]; i; i = edges[i].next) {
if (edges[i].to == r2) {
edges[i].to = 0;
edges[i ^ 1].to = 0;
break;
}
}
dfs2(r1, -1);
maxv = max(maxv, f[r1][0]);
dfs2(r2, -1);
maxv = max(maxv, f[r2][0]);
ans += maxv;
}
}
int n;
int main() {
n = read();
int x, y;
for (int i = 1; i <= n; i++){
p[i] = read();
x = read();
add(x, i);
add(i, x);
}
for (int i = 1; i <= n; i++) {
if (!vis[i]) {
size[0] = 0;
flag = false;
dfs(i, -1);
solve();
}
}
printf("%lld", ans);
return 0;
}
ZJOI2008 骑士(树型DP)的更多相关文章
- BZOJ1040: [ZJOI2008]骑士 树套环DP
题意:一个图n个点n条边保证点能互相到达,ab有边意味着ab互相厌恶,求一个集合,使得集合里元素最多而且没有人互相厌恶 删去环上一条边树形dp,比如删掉的边连着a,b,那么先dp出不选a的最大值,再d ...
- BZOJ_1040_[ZJOI2008]骑士_树形DP
BZOJ_1040_[ZJOI2008]骑士_树形DP 题意: Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪 ...
- POJ3659 Cell Phone Network(树上最小支配集:树型DP)
题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...
- POJ 3342 - Party at Hali-Bula 树型DP+最优解唯一性判断
好久没写树型dp了...以前都是先找到叶子节点.用队列维护来做的...这次学着vector动态数组+DFS回朔的方法..感觉思路更加的清晰... 关于题目的第一问...能邀请到的最多人数..so ea ...
- 【XSY1905】【XSY2761】新访问计划 二分 树型DP
题目描述 给你一棵树,你要从\(1\)号点出发,经过这棵树的每条边至少一次,最后回到\(1\)号点,经过一条边要花费\(w_i\)的时间. 你还可以乘车,从一个点取另一个点,需要花费\(c\)的时间. ...
- 洛谷P3354 Riv河流 [IOI2005] 树型dp
正解:树型dp 解题报告: 传送门! 简要题意:有棵树,每个节点有个权值w,要求选k个节点,最大化∑dis*w,其中如果某个节点到根的路径上选了别的节点,dis指的是到达那个节点的距离 首先这个一看就 ...
- 【POJ 3140】 Contestants Division(树型dp)
id=3140">[POJ 3140] Contestants Division(树型dp) Time Limit: 2000MS Memory Limit: 65536K Tot ...
- Codeforces 581F Zublicanes and Mumocrates(树型DP)
题目链接 Round 322 Problem F 题意 给定一棵树,保证叶子结点个数为$2$(也就是度数为$1$的结点),现在要把所有的点染色(黑或白) 要求一半叶子结点的颜色为白,一半叶子结点的 ...
- ZOJ 3949 (17th 浙大校赛 B题,树型DP)
题目链接 The 17th Zhejiang University Programming Contest Problem B 题意 给定一棵树,现在要加一条连接$1$(根结点)和$x$的边,求加 ...
- BZOJ 1564 :[NOI2009]二叉查找树(树型DP)
二叉查找树 [题目描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值,每个结 ...
随机推荐
- Linux 工作管理
把进程放入后台 进程后加&,这时,进程在后台是运行的 tar -zcf etc.tar.gz /etc & 在执行程序时,快速按下ctrl+z快捷键,这时,进程在后台是停止的 查看后台 ...
- 大话计算机网络一 聊聊UDP
引言 UDP是一个简单的面向数据报的运输层协议 UDP不提供可靠性,它把应用程序传给IP层得数据发送出去,不保证它们能达到目的地 UDP首部 端口号表示发送进程和接受进程. UDP长度字段指的是UDP ...
- ODEINT 求解常微分方程(4)
import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt # function tha ...
- Centos7 安装 redis6 的部分问题总结
首先把redis.tar.gz 解压到你想要的路径 检查一下安装环境: yum -y install gcc yum -y install epel-release 执行 make 和 make in ...
- LVS实现四层负载均衡
LVS详解(思维导图) 1. 集群概述 1.1 Linux Cluster Linux Cluster的类型 LB(Load Balance) HA(High Available) HP(High P ...
- python实现批量文件重命名
本文实例为大家分享了python批量文件重命名的具体代码,供大家参考,具体内容如下 问题描述 最近遇到朋友求助,如何将大量文件名前面的某些字符删除. 即将图中文件前的编号删除. Python实现 用到 ...
- (七)Maven Profile 和 Filtering
每个项目都会有多套运行环境(开发,测试,正式等等),不同的环境配置也不尽相同(如jdbc.url),借助Jenkins和自动部署提供的便利,我们可以把不同环境的配置文件单独抽离出来,打完包后用对应环境 ...
- 浅淡i.MX8M Mini处理器的效能以及平台对比
i.MX 8M Mini是恩智浦首款嵌入式多核应用处理器,定位在任何通用工业和物联网的应用,是一款针对边缘计算应用的芯片,也是恩智普i.MX系列中第一个加了机器学习核的产品线.这颗芯片采用先进的14L ...
- UWP实现第二字幕并且跟随系统的设置
话不多说,先看一下最终效果 系统设置默认 在系统设置里面更改字幕的显示效果 需求 要求播放器可以显示第二字幕,类似旁白的文字解释.比如片中出现了一个专业术语,这个时候观众可能有些疑惑.所以需要在屏幕上 ...
- 商城06——solr索引库搭建&solr搜索功能实现&图片显示问题解决
1. 课程计划 1.搜索工程的搭建 2.linux下solr服务的搭建 3.Solrj使用测试 4.把数据库中的数据导入索引库 5.搜索功能的实现 2. 搜索工程搭建 要实现搜索功能,需要搭建 ...