[HAOI2010]软件安装
简单的tarjan+(本蒟蒻刚刚接触不久)恶心的树形DP
题面
题目描述
现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi。我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大)。
但是现在有个问题:软件之间存在依赖关系,即软件i只有在安装了软件j(包括软件j的直接或间接依赖)的情况下才能正确工作(软件i依赖软件j)。幸运的是,一个软件最多依赖另外一个软件。如果一个软件不能正常工作,那么它能够发挥的作用为0。
我们现在知道了软件之间的依赖关系:软件i依赖软件Di。现在请你设计出一种方案,安装价值尽量大的软件。一个软件只能被安装一次,如果一个软件没有依赖则Di=0,这时只要这个软件安装了,它就能正常工作。
输入输出格式
输入格式:
第1行:N, M (0<=N<=100, 0<=M<=500)
第2行:W1, W2, … Wi, …, Wn (0<=Wi<=M )
第3行:V1, V2, …, Vi, …, Vn (0<=Vi<=1000 )
第4行:D1, D2, …, Di, …, Dn (0<=Di<=N, Di≠i )
输出格式:
一个整数,代表最大价值
输入输出样例
输入样例#1:
3 10
5 5 6
2 3 4
0 1 1
输出样例#1:
5
解题思路
有可能出现依赖关系的环,我们把环tarjan缩成点,因为你选择这个环中的任意一个软件都需要把这个环整个都安装,所以直接累加这个环的w和v缩点。
暴力重新建图后,整个就形成了一个森林,为了方便,建一个虚的树根连上每个入度为0的点,然后在树上跑DP求解。
DP:设f[i][j]表示i节点容量为j所得的最大价值,由它的儿子转移过来
空间,常数巨大的代码
# include <stdio.h>
# include <stdlib.h>
# include <iostream>
# include <string.h>
using namespace std;
# define N 501
# define IL inline
# define RG register
# define UN unsigned
# define ll long long
# define oo 2147483647
# define mem(a, b) memset(a, b, sizeof(a))
# define max(a, b) ((a) > (b)) ? (a) : (b)
# define min(a, b) ((a) < (b)) ? (a) : (b)
IL int Get(){
RG char c = '!'; RG int num = 0, z = 1;
while(c != '-' && (c > '9' || c < '0')) c = getchar();
if(c == '-') z = -1, c = getchar();
while(c >= '0' && c <= '9') num = num * 10 + c - '0', c = getchar();
return num * z;
}
int n, w[N], m, v[N], ft[N], to[N], nt[N], cnt, f[N][501];
int dfn[N], low[N], bg[N], isk[N], sk[N], cnt1, num, r[N];
IL void Add(RG int u, RG int vv){
nt[cnt] = ft[u]; to[cnt] = vv; ft[u] = cnt++;
}
IL void Dfs(RG int u){
dfn[u] = low[u] = ++cnt1;
isk[u] = 1; sk[++sk[0]] = u;
for(RG int e = ft[u]; e != -1; e = nt[e]){
RG int vv = to[e];
if(!dfn[vv]){
Dfs(vv);
low[u] = min(low[u], low[vv]);
}
else if(isk[vv]) low[u] = min(low[u], dfn[vv]);
}
if(dfn[u] == low[u]){
RG int vv = sk[sk[0]--]; isk[vv] = 0;
bg[vv] = ++num; w[num] += w[vv]; v[num] += v[vv];
while(u != vv){
vv = sk[sk[0]--];
isk[vv] = 0;
bg[vv] = num; w[num] += w[vv]; v[num] += v[vv];
}
}
}
IL void DP(RG int u){
for(RG int j = m; j >= w[u]; j--)
f[u][j] = v[u];
for(RG int e = ft[u]; e != -1; e = nt[e]){
RG int vv = to[e];
DP(to[e]);
for(RG int j = m - w[u]; j >= 0; j--)
for(RG int k = 0; k <= j; k++)
f[u][j + w[u]] = max(f[u][j + w[u]], f[u][j + w[u] - k] + f[vv][k]);
}
}
int main(){
mem(ft, -1);
n = Get(); m = Get();
for(RG int i = 1; i <= n; i++)
w[i] = Get();
for(RG int i = 1; i <= n; i++)
v[i] = Get();
for(RG int i = 1; i <= n; i++){
RG int u = Get();
if(u) Add(u, i);
}
num = n;
for(RG int i = 1; i <= n; i++)
if(!dfn[i]) Dfs(i);
for(RG int i = 1; i <= n; i++)
for(RG int e = ft[i]; e != -1; e = nt[e]){
RG int vv = to[e];
if(bg[i] != bg[vv]) Add(bg[i], bg[vv]), r[bg[vv]]++;
}
for(RG int i = n + 1; i <= num; i++)
if(!r[i]) Add(num + 1, i);
DP(num + 1);
printf("%d\n", f[num + 1][m]);
return 0;
}
我不会告诉你,这道题我写萎了交了n遍才A
[HAOI2010]软件安装的更多相关文章
- BZOJ_2427_[HAOI2010]软件安装_tarjan+树形DP
BZOJ_2427_[HAOI2010]软件安装_tarjan+树形DP 题意: 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁 ...
- 【BZOJ2427】[HAOI2010]软件安装(动态规划,Tarjan)
[BZOJ2427][HAOI2010]软件安装(动态规划,Tarjan) 题面 BZOJ 洛谷 题解 看到这类题目就应该要意识到依赖关系显然是可以成环的. 注意到这样一个性质,依赖关系最多只有一个, ...
- 洛谷 P2515 [HAOI2010]软件安装 解题报告
P2515 [HAOI2010]软件安装 题目描述 现在我们的手头有\(N\)个软件,对于一个软件\(i\),它要占用\(W_i\)的磁盘空间,它的价值为\(V_i\).我们希望从中选择一些软件安装到 ...
- [BZOJ2427][HAOI2010]软件安装(Tarjan+DP)
2427: [HAOI2010]软件安装 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1987 Solved: 791[Submit][Statu ...
- bzoj 2427 [HAOI2010]软件安装 Tarjan缩点+树形dp
[HAOI2010]软件安装 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2029 Solved: 811[Submit][Status][Dis ...
- Tarjan+树形DP【洛谷P2515】[HAOI2010]软件安装
[洛谷P2515][HAOI2010]软件安装 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得 ...
- 【BZOJ2427】[HAOI2010]软件安装 Tarjan+树形背包
[BZOJ2427][HAOI2010]软件安装 Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为 ...
- bzoj2427:[HAOI2010]软件安装(Tarjan+tree_dp)
2427: [HAOI2010]软件安装 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1053 Solved: 424[Submit][Statu ...
- HAOI2010软件安装(树形背包)
HAOI2010软件安装(树形背包) 题意 有n个物品,每个物品最多会依赖一个物品,但一个物品可以依赖于一个不独立(依赖于其它物品)的物品,且可能有多个物品依赖一个物品,并且依赖关系可能形成一个环.现 ...
- [HAOI2010]软件安装(Tarjan,树形dp)
[HAOI2010]软件安装 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可 ...
随机推荐
- wangeditor Demo
<html> <head> <!--在这里字符集的设定很重要,如果设定不当将会出现乱码--> <meta charset="UTF-8"& ...
- 解决nginx [error] open() "usr/local/nginx/logs/nginx.pid" failed错误
重新启动服务器,访问web服务发现无法浏览啦!登陆服务器之 后进到nginx使用./nginx -s reload重新读取配置文件,发现报nginx: [error] open() "/us ...
- /dev/null 2>&1 详解
今天一个朋友突然在自己的维护的Linux中, /var/spool/cron/root 中看到了以下的内容: 30 19 * * * /usr/bin/**dcon.sh > /dev/nul ...
- 中小研发团队架构实践之应用监控Metrics
一.Metrics简介 应用监控系统Metrics由Metrics.NET+InfluxDB+Grafana组合而成,通过客户端Metrics.NET在业务代码中埋点,Metrics.N ...
- hexo博客简易搭建教程
什么是Hexo Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页.官网 Hexo安装 安装 在安装Hex ...
- jquery validate 动态增加删除验证规则(转载)
页面加载完成初始化form validate $("#user_regForm").validate({ errorPlacement: function(error, eleme ...
- bzoj 3622 已经没有什么好害怕的了 类似容斥,dp
3622: 已经没有什么好害怕的了 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1213 Solved: 576[Submit][Status][ ...
- php 链接mysql的三种方式对比
PHP连接Mysql的三种方式: 1.原生的连接方式 原生的连接方式是面向过程的写法 <?php $host = 'localhost'; $database = 'test'; $usern ...
- thinkpad E480 用户初体验
梦寐以求的E480终于到手了,经过几天使用之后,也该写一下用户体验了,也算是对这些天的调研的一个总结吧. 首先是外形,从外形上来看E480的外形的确是相对以前的塑料外壳,改进了不少,全金属的机身,磨砂 ...
- Java三大特性(封装,继承,多态)
Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...