Link:

BZOJ 2427 传送门

Solution:

只看样例的话会以为是裸的树形$dp$……

但实际上题目并没有说明恰好仅有一个物品没有依赖项

因此原图可能由是由多棵树与多个图组成的

先跑一遍$tarjan$求出每个图中的$SCC$,缩点将原图转化为森林

再设置一个根,将森林转换成一棵树$dp$即可:$dp[i][j]=max\{ dp[i][k]+dp[son[i]][j-k]\}$

为了保证依赖条件满足,每棵子树的根都必须要选择,因此返回前还要再刷一遍:$dp[i][j]=dp[i][j-w_i]+v_i$

Tip:$dp$时要注意$k$也要逆序枚举,因为$w_i$可能为0

Code:

#include <bits/stdc++.h>

using namespace std;
const int MAXN=;
struct edge{int nxt,to;}e[MAXN<<];
stack<int> st;
int f[MAXN],head[MAXN],in[MAXN],S;
int instack[MAXN],vis[MAXN],col[MAXN],dfn[MAXN],low[MAXN];
int n,m,x,dp[MAXN][MAXN],w[MAXN],v[MAXN],sw[MAXN],sv[MAXN],tot,cnt,idx; void add_edge(int from,int to)
{e[++tot].nxt=head[from];e[tot].to=to;head[from]=tot;} void tarjan(int x)
{
dfn[x]=low[x]=++idx;
instack[x]=vis[x]=true;st.push(x);
for(int i=head[x];i;i=e[i].nxt)
{
if(!vis[e[i].to])
tarjan(e[i].to),low[x]=min(low[x],low[e[i].to]);
else if(instack[e[i].to])
low[x]=min(low[x],low[e[i].to]);
}
if(dfn[x]==low[x])
{
int t=-;cnt++;
while(t!=x)
{
t=st.top();st.pop();
instack[t]=false;col[t]=cnt;
sw[cnt]+=w[t];sv[cnt]+=v[t];
}
}
} void dfs(int x,int anc)
{
for(int i=head[x];i;i=e[i].nxt)
{
if(e[i].to==anc) continue;
dfs(e[i].to,x);
for(int j=m-sw[x];j>=;j--)
for(int k=j;k>=;k--)//k也要保持逆序
dp[x][j]=max(dp[x][j],dp[x][k]+dp[e[i].to][j-k]);
}
for(int j=m;j>=;j--)
if(j>=sw[x]) dp[x][j]=dp[x][j-sw[x]]+sv[x];
else dp[x][j]=;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&w[i]);
for(int i=;i<=n;i++) scanf("%d",&v[i]);
for(int i=;i<=n;i++)
{
scanf("%d",&f[i]);
if(f[i]) add_edge(f[i],i);
} for(int i=;i<=n;i++)//原图不一定连通
if(!vis[i]) tarjan(i); tot=;S=cnt+;
memset(head,,sizeof(head));
for(int i=;i<=n;i++)
if(f[i]&&col[i]!=col[f[i]])
add_edge(col[f[i]],col[i]),in[col[i]]++;
for(int i=;i<=cnt;i++)//建立根
if(!in[i]) add_edge(S,i); dfs(S,);
printf("%d",dp[S][m]); return ;
}

[BZOJ 2427] 软件安装的更多相关文章

  1. bzoj 2427 软件安装 - Tarjan - 树形动态规划

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

  2. BZOJ 2427 软件安装(强连通分量+树形背包)

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

  3. bzoj 2427: [HAOI2010]软件安装

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

  4. BZOJ 2427 [HAOI2010]软件安装 | 这道树形背包裸题严谨地证明了我的菜

    传送门 BZOJ 2427 题解 Tarjan把环缩成点,然后跑树形背包即可. 我用的树形背包是DFS序上搞的那种. 要注意dp数组初始化成-INF! 要注意dp顺推的时候也不要忘记看数组是否越界! ...

  5. bzoj 2427 [HAOI2010]软件安装 Tarjan缩点+树形dp

    [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2029  Solved: 811[Submit][Status][Dis ...

  6. BZOJ 2427: [HAOI2010]软件安装 tarjan + 树形背包

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

  7. 【BZOJ-2427】软件安装 Tarjan + 树形01背包

    2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 960  Solved: 380[Submit][Status ...

  8. 【BZOJ2427】[HAOI2010]软件安装(动态规划,Tarjan)

    [BZOJ2427][HAOI2010]软件安装(动态规划,Tarjan) 题面 BZOJ 洛谷 题解 看到这类题目就应该要意识到依赖关系显然是可以成环的. 注意到这样一个性质,依赖关系最多只有一个, ...

  9. [BZOJ2427][HAOI2010]软件安装(Tarjan+DP)

    2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1987  Solved: 791[Submit][Statu ...

随机推荐

  1. 【51NOD】数据流中的算法

    [算法]数学 [题解] 1.平均数:累加前缀和.//听说要向下取整? 2.中位数:双堆法,大于中位数存入小顶堆,小于中位数存入大顶堆,保证小顶堆内数字数量≥大顶堆,奇数则取小堆顶,偶数则取两堆顶/2. ...

  2. python dlib 面部轮廓实时检测

    1.dlib 实现动态人脸检测及面部轮廓检测 模型下载连接 : http://dlib.net/files/ # coding:utf-8 import cv2 import os import dl ...

  3. js中三种定义变量 const, var, let 的区别

    js中三种定义变量的方式const, var, let的区别 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始化 ...

  4. 伪病毒 Rp_test

    第一个写的对电脑有破坏性的程序= =,然后发现写system的copy的时候不会用字符串替代路径,然后就萎了= =,只能写一个没有自身复制的伪病毒了,坑到了好多同学的电脑,23333.... //By ...

  5. ie6下双边距的问题

    1.ie6双边距情况 <div class="red"></div> <div class="blue"></div& ...

  6. Leetcode 之Simplify Path(36)

    主要看//之间的内容:如果是仍是/,或者是.,则忽略:如果是..,则弹出:否则压入堆栈.最后根据堆栈的内容进行输出. string simplifyPath(string const& pat ...

  7. django使用JWT保存用户登录信息

    在使用前必须弄明白JWT的原理,原理可以看我的另一篇博文:https://www.cnblogs.com/chichung/p/9966027.html JWT的流程 1.签发JWT 在用户正确输入账 ...

  8. HDU-5272

    Dylans loves numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/O ...

  9. SEO编辑必看:撰写搜索引擎喜爱的标题

    导读:非常有干货,百度站长平台刚发布了这篇篇文章,文章建议:1,标题字数控制在65个字节内,2,重要内容放在标题的最前面,3,添加与网页内容最相关的.用户更常用的.满足用户明确需求的.体现时效性.关键 ...

  10. git------删除Repository

    需求:删除仓库 Lucky-Repository,实现步骤如下截图所示 如上完成删除操作