树形背包

 #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]软件安装的更多相关文章

  1. 洛谷 P2515 [HAOI2010]软件安装 解题报告

    P2515 [HAOI2010]软件安装 题目描述 现在我们的手头有\(N\)个软件,对于一个软件\(i\),它要占用\(W_i\)的磁盘空间,它的价值为\(V_i\).我们希望从中选择一些软件安装到 ...

  2. 洛谷—— P2515 [HAOI2010]软件安装

    题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...

  3. 洛谷 P2515 [HAOI2010]软件安装

    题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...

  4. 洛谷——P2515 [HAOI2010]软件安装

    https://www.luogu.org/problem/show?pid=2515#sub 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中 ...

  5. luogu P2515 [HAOI2010]软件安装 |Tarjan+树上背包

    题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为MM计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但 ...

  6. [bzoj2427]P2515 [HAOI2010]软件安装(树上背包)

    tarjan+树上背包 题目描述 现在我们的手头有 \(N\) 个软件,对于一个软件 \(i\),它要占用 \(W_i\) 的磁盘空间,它的价值为 \(V_i\).我们希望从中选择一些软件安装到一台磁 ...

  7. luogu P2515 [HAOI2010]软件安装

    传送门 看到唯一的依赖关系,容易想到树型dp,即\(f_{i,j}\)表示选点\(i\)及子树内连通的点,代价为\(j\)的最大价值,然后就是选课那道题 但是要注意 1.题目中的依赖关系不一定是树,可 ...

  8. 洛谷 P2515 [HAOI2010]软件安装(缩点+树形dp)

    题面 luogu 题解 缩点+树形dp 依赖关系可以看作有向边 因为有环,先缩点 缩点后,有可能图不联通. 我们可以新建一个结点连接每个联通块. 然后就是树形dp了 Code #include< ...

  9. 洛谷P2515 [HAOI2010]软件安装(tarjan缩点+树形dp)

    传送门 我们可以把每一个$d$看做它的父亲,这样这个东西就构成了一个树形结构 问题是他有可能形成环,所以我们还需要一遍tarjan缩点 缩完点后从0向所有入度为零的点连边 然后再跑一下树形dp就行了 ...

随机推荐

  1. 201621123050 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 ①foreach循环 for (String e : map.keyS ...

  2. spring mvc 整合Quartz

    Quartz是一个完全由java编写的开源作业调度框架.不要让作业调度这个术语吓着你.尽管Quartz框架整合了许多额外功能, 但就其简易形式看,你会发现它易用得简直让人受不了!Quartz整合在sp ...

  3. django获取ip与数据重复性判定

    获取ip if request.META.has_key('HTTP_X_FORWARDED_FOR'): ip_c = request.META['HTTP_X_FORWARDED_FOR'] el ...

  4. python之路--day13-模块

    1,什么是模块 模块就是系统功能的集合体,在python中,一个py文件就是一个模块, 例如:module.py 其中module叫做模块名 2,使用模块 2.1 import导入模块 首次带入模块发 ...

  5. 不允许用(a+b)/2这种方式求两个数的均值;如下程序在Linux和32位集成开发环境中运行

    #define MAX(a,b) ((a)>(b)?(a):(b)) #include<stdio.h> int main() { int a = 10; int b = 20; i ...

  6. MQTT和paho(二)socket

    参考链接:http://blog.csdn.net/yangzl2008/article/details/8861069

  7. websocketj--随时随地在Web浏览器中操作你的服务端程序

    0 - 有没有觉得Linux标准终端界面输入输出枯燥无味? 1 - 什么?vmstat命令的输出数据不直观?有没有想过能够可视化该命令的输出? 2 - 尝试过用浏览器操作Windows中的cmd吗? ...

  8. Web开发笔记

    jquery ui draggable clone之后不会克隆draggable功能,要重新设置

  9. vue中的数据监听以及数据交互

    现在我们来看一下vue中的数据监听事件$watch, js代码: new Vue({ el:"#div", data:{ arr:[,,] } }).$watch("ar ...

  10. Java:Java 中会存在内存泄漏吗

    理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因):然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致 ...