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)的更多相关文章

  1. BZOJ1040: [ZJOI2008]骑士 树套环DP

    题意:一个图n个点n条边保证点能互相到达,ab有边意味着ab互相厌恶,求一个集合,使得集合里元素最多而且没有人互相厌恶 删去环上一条边树形dp,比如删掉的边连着a,b,那么先dp出不选a的最大值,再d ...

  2. BZOJ_1040_[ZJOI2008]骑士_树形DP

    BZOJ_1040_[ZJOI2008]骑士_树形DP 题意: Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪 ...

  3. POJ3659 Cell Phone Network(树上最小支配集:树型DP)

    题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...

  4. POJ 3342 - Party at Hali-Bula 树型DP+最优解唯一性判断

    好久没写树型dp了...以前都是先找到叶子节点.用队列维护来做的...这次学着vector动态数组+DFS回朔的方法..感觉思路更加的清晰... 关于题目的第一问...能邀请到的最多人数..so ea ...

  5. 【XSY1905】【XSY2761】新访问计划 二分 树型DP

    题目描述 给你一棵树,你要从\(1\)号点出发,经过这棵树的每条边至少一次,最后回到\(1\)号点,经过一条边要花费\(w_i\)的时间. 你还可以乘车,从一个点取另一个点,需要花费\(c\)的时间. ...

  6. 洛谷P3354 Riv河流 [IOI2005] 树型dp

    正解:树型dp 解题报告: 传送门! 简要题意:有棵树,每个节点有个权值w,要求选k个节点,最大化∑dis*w,其中如果某个节点到根的路径上选了别的节点,dis指的是到达那个节点的距离 首先这个一看就 ...

  7. 【POJ 3140】 Contestants Division(树型dp)

    id=3140">[POJ 3140] Contestants Division(树型dp) Time Limit: 2000MS   Memory Limit: 65536K Tot ...

  8. Codeforces 581F Zublicanes and Mumocrates(树型DP)

    题目链接  Round 322 Problem F 题意  给定一棵树,保证叶子结点个数为$2$(也就是度数为$1$的结点),现在要把所有的点染色(黑或白) 要求一半叶子结点的颜色为白,一半叶子结点的 ...

  9. ZOJ 3949 (17th 浙大校赛 B题,树型DP)

    题目链接  The 17th Zhejiang University Programming Contest Problem B 题意  给定一棵树,现在要加一条连接$1$(根结点)和$x$的边,求加 ...

  10. BZOJ 1564 :[NOI2009]二叉查找树(树型DP)

    二叉查找树 [题目描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值,每个结 ...

随机推荐

  1. java实现第九届蓝桥杯整理玩具

    整理玩具 小明有一套玩具,一共包含NxM个部件.这些部件摆放在一个包含NxM个小格子的玩具盒中,每个小格子中恰好摆放一个部件. 每一个部件上标记有一个0~9的整数,有可能有多个部件标记相同的整数. 小 ...

  2. Windows10 搭建 ElasticSearch 集群服务

    一.前言 集群的搭建需要多台机器,之前我使用 ubuntu 16.04 搭建过 hadoop 的单机模式和分布式模式,这个今后会写,今天先写一篇使用 < Windows10 搭建 Elastic ...

  3. Linux: ssh命令 远程登录

    1.查看SSH客户端版本 使用ssh -V命令可以得到版本号.需要注意的是,Linux一般自带的是OpenSSH; $ ssh -V ssh: SSH Secure Shell 3.2.9.1 (no ...

  4. HttpClient 常用方法封装

    简介 在平时写代码中,经常需要对接口进行访问,对于 http 协议 rest 风格的接口请求,大多使用 HttpClient 工具进行编写,想着方便就寻思着把一些常用的方法进行封装,便于平时快速的使用 ...

  5. Python正则式 - re

    目录 1. 相关概念 1.1. rstring 1.2. 元字符 2. 模式Pattern 2.1. re.flag 3. API 4. 其他 4.1. 单词边界 '\b' 4.2. 贪婪和非贪婪 4 ...

  6. Python基础002---基础知识

    一.标识符 标识符是自己定义的,是开发人员在程序中自己定义的一些符号和名称,如变量名.函数名等.在 Python 里,标识符由字母(区分大小写).数字.下划线组成,且数字不能开头.常用的命名方法有小驼 ...

  7. 记linux vsftpd配置遇到的错误

    环境:centos 7 yum安装 yum install -y vsftpd 增加用户 # 家目录为/www 并设置nologin useradd -d /www -s /sbin/nologin ...

  8. 大众点评cat实时监控简介及部署

    简介 背景 CAT(Central Application Tracking)是由吴其敏(前大众点评首席架构师,现携程架构负责人)主导设计基于Java开发打造的实时应用监控平台,为大众点评网提供了全面 ...

  9. Android studio debug apk包安装失败

    可在根目录gradle.properties中配置 android.injected.testOnly=false

  10. Ehcache基础入门

    1. 基本介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认CacheProvider.Ehcache是一种广泛使用的开源Java分布式缓存.主要 ...