P2515 [HAOI2010]软件安装
树形背包
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<vector>
#define MAXN 110
#define MAXM 510
#define pii pair<int,int>
#define rint register int
#define mp make_pair
#define pb push_back
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if('-'==ch)f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int tot,m;
int C[MAXN],V[MAXN];
vector<int> G[MAXN];
int dfn[MAXN],low[MAXN],sta[MAXN],b[MAXN],top,idx;
int c[MAXN],v[MAXN],cmp[MAXN],n;
int fst[MAXN],nxt[MAXN],from[MAXN],to[MAXN],cnt,pin[MAXN];
void add(int x,int y){
nxt[++cnt]=fst[x],fst[x]=cnt,from[cnt]=x,to[cnt]=y;
pin[y]++;
}
void tarjan(int x){
dfn[x]=low[x]=(++idx);
sta[++top]=x,b[x]=;
int y;
for(rint i=;i<G[x].size();i++){
y=G[x][i];
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(b[y]){
low[x]=min(low[x],dfn[y]);
}
}
if(dfn[x]==low[x]){
n++;
while(sta[top+]!=x){
c[n]+=C[sta[top]];
v[n]+=V[sta[top]];
cmp[sta[top]]=n;
b[sta[top]]=;
top--;
}
}
}
int f[MAXN][MAXM],dep[MAXN];
int H[MAXM],H1[MAXM],H2[MAXM];
void work(int x,int vl){
if(vl<c[x]){f[x][vl]=;return;}
vl-=c[x];
memset(H,,sizeof(H));
memset(H1,,sizeof(H1));
int y,r=;
for(rint e=fst[x];e;e=nxt[e]){
y=to[e];
for(rint i=;i<=vl;i++){
H[i]=max(H[i],H1[i]+f[y][vl-i]);
r=max(r,H[i]);
}
memcpy(H1,H,sizeof(H));
}
f[x][vl+c[x]]=r+v[x];
}
void dp(int x){
b[x]=;
int y;
for(rint e=fst[x];e;e=nxt[e]){
y=to[e];
if(!b[y]){
dp(y);
for(rint j=m-c[x];j>=;j--){
for(rint k=;k<=j;k++){
f[x][j]=max(f[x][j],f[x][k]+f[y][j-k]);
}
}
}
}
for(rint j=m;j>=;j--){
if(j>=c[x]){
f[x][j]=f[x][j-c[x]]+v[x];
}
else{
f[x][j]=;
}
}
}
int main()
{
// freopen("data.in","r",stdin);
tot=read();m=read();
for(rint i=;i<=tot;i++)C[i]=read();
for(rint i=;i<=tot;i++)V[i]=read();
int tmp;
for(rint i=;i<=tot;i++){
tmp=read();
if(tmp)G[tmp].pb(i);
}
for(rint i=;i<=tot;i++){
if(!dfn[i])tarjan(i);
}
for(rint i=;i<=tot;i++){
for(rint j=;j<G[i].size();j++){
int x=i,y=G[i][j];
if(cmp[x]!=cmp[y]){
add(cmp[x],cmp[y]);
}
}
}
for(rint i=;i<=n;i++){
if(!pin[i]){
add(,i);
}
}
// for(rint i=1;i<=cnt;i++){
// printf("%d %d\n",from[i],to[i]);
// }
memset(b,,sizeof(b));
dp();
printf("%d\n",f[][m]);
return ;
}
P2515 [HAOI2010]软件安装的更多相关文章
- 洛谷 P2515 [HAOI2010]软件安装 解题报告
P2515 [HAOI2010]软件安装 题目描述 现在我们的手头有\(N\)个软件,对于一个软件\(i\),它要占用\(W_i\)的磁盘空间,它的价值为\(V_i\).我们希望从中选择一些软件安装到 ...
- 洛谷—— P2515 [HAOI2010]软件安装
题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...
- 洛谷 P2515 [HAOI2010]软件安装
题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...
- 洛谷——P2515 [HAOI2010]软件安装
https://www.luogu.org/problem/show?pid=2515#sub 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中 ...
- luogu P2515 [HAOI2010]软件安装 |Tarjan+树上背包
题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为MM计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但 ...
- [bzoj2427]P2515 [HAOI2010]软件安装(树上背包)
tarjan+树上背包 题目描述 现在我们的手头有 \(N\) 个软件,对于一个软件 \(i\),它要占用 \(W_i\) 的磁盘空间,它的价值为 \(V_i\).我们希望从中选择一些软件安装到一台磁 ...
- luogu P2515 [HAOI2010]软件安装
传送门 看到唯一的依赖关系,容易想到树型dp,即\(f_{i,j}\)表示选点\(i\)及子树内连通的点,代价为\(j\)的最大价值,然后就是选课那道题 但是要注意 1.题目中的依赖关系不一定是树,可 ...
- 洛谷 P2515 [HAOI2010]软件安装(缩点+树形dp)
题面 luogu 题解 缩点+树形dp 依赖关系可以看作有向边 因为有环,先缩点 缩点后,有可能图不联通. 我们可以新建一个结点连接每个联通块. 然后就是树形dp了 Code #include< ...
- 洛谷P2515 [HAOI2010]软件安装(tarjan缩点+树形dp)
传送门 我们可以把每一个$d$看做它的父亲,这样这个东西就构成了一个树形结构 问题是他有可能形成环,所以我们还需要一遍tarjan缩点 缩完点后从0向所有入度为零的点连边 然后再跑一下树形dp就行了 ...
随机推荐
- C语言第二次博客作业——分支结构
一.PTA实验作业 题目1:计算分段函数 1.实验代码 #include<stdio.h> #include<math.h> int main(void) { double x ...
- 201621123043 《Java程序设计》第6周学习总结
1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖面向对象的 ...
- 用greenlet实现Python中的并发
from greenlet import greenlet def test1(): print 12 gr2.switch() print 34 def test2(): print 56 gr1. ...
- 一个C&C++程序的生命历程
翻了好多博客,内容星星点点,没找到我想要的,现在吸取大神精华,加上本人拙见,总结如下: 一个C或C++程序从你开始编写,到结束,整个过程,都做了些什么,请看下文: 先看大体的过程:看图: 我在这里主要 ...
- bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic
http://www.lydsy.com/JudgeOnline/problem.php?id=1018 关键点在于只有两行 所以一个2*m矩形连通情况只有6种 编号即对应代码中的a数组 线段树维护 ...
- 【详细】Lucene使用案例
Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引 ...
- Django-rest-framework源码分析----认证
一.前言 1.1.安装 两种方式: github pip直接安装 pip install django-rest-framework 1.2.需要先了解的一些知识 理解下面两个知识点非常重要,djan ...
- 【问题解决】jhipster-registry-master空白页
问题概述: 刚从github拉下来的jhipster-registry-master直接运行,访问http://localhost:8761会发现会空白页,但是网页的title显示正常,本文目的是解决 ...
- node express将请求重定向为https
项目开发时,由于服务器只接受https请求(运维说了算...),所以在生产环境时,要把所有http请求全都重定向为https,具体操作是在app.js文件里加入以下代码: var express = ...
- Linux进程管理:后台启动进程和任务管理命令
一.为什么要使程序在后台执行 我们的应用有时候要运行时间很长,如:几个小时甚至几个星期,我们可以让程序在后台一直跑. 让程序在后台运行的好处有: 终端关机不影响后台进程的运行.(不会终端一关机或者网络 ...