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=505;
struct edge{int nxt,to;}e[MAXN<<2];
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=-1;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>=0;j--)for(int k=j;k>=0;k--)//k也要保持逆序 dp[x][j]=max(dp[x][j],dp[x][k]+dp[e[i].to][j-k]);}for(int j=m;j>=0;j--)if(j>=sw[x]) dp[x][j]=dp[x][j-sw[x]]+sv[x];else dp[x][j]=0;
}int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&w[i]);for(int i=1;i<=n;i++) scanf("%d",&v[i]);for(int i=1;i<=n;i++){scanf("%d",&f[i]);if(f[i]) add_edge(f[i],i);}for(int i=1;i<=n;i++)//原图不一定连通 if(!vis[i]) tarjan(i);tot=0;S=cnt+1;memset(head,0,sizeof(head));for(int i=1;i<=n;i++)if(f[i]&&col[i]!=col[f[i]])add_edge(col[f[i]],col[i]),in[col[i]]++;for(int i=1;i<=cnt;i++)//建立根 if(!in[i]) add_edge(S,i);dfs(S,0);printf("%d",dp[S][m]);return 0;
}

转载于:https://www.cnblogs.com/newera/p/9311911.html

[BZOJ 2427] 软件安装相关推荐

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

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

  2. bzoj 2427: [HAOI2010]软件安装(Trajan+树形DP)

    2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1844  Solved: 723 [Submit][Sta ...

  3. BZOJ 2427: [HAOI2010]软件安装 Tarjan缩点 + DP

    Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1628 Solved: 635 Description 现在我们的手头有N个软件,对于一个软件i,它要 ...

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

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

  5. 【转载】Linux 软件安装到 /usr,/usr/local/ 还是 /opt 目录?

    Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的 /usr:系统级的目录,可以理解为C:/Windows/ /usr/lib:理解为C:/Windows/System32. ...

  6. 32位jdk_MyEclipse 10((32/64位)、(MAC)、(Linux))软件安装教程

    各类软件都能免费下载,良心公众号 要下载教程安装的软件,请关注微信公众号(华利设计疯人院),更多更全的软件等着你! 安装中有问题咨询管家微信:LXQ1607199190 备注:加华利设计疯人院群 正文 ...

  7. Linux之软件安装 apt-get

    Linux之软件安装 apt-get 1. 软件安装的介绍 Ubuntu软件安装有两种方式: 离线安装(deb文件格式安装)   [提前下载到电脑的安装包] 在线安装(apt-get方式安装)    ...

  8. linux安装软件tar.bz,CentOS下的几种软件安装方式

    1. rpm包 安装: rpm -ivh soft.version.rpm 更新: rpm -Uvh soft.version.rpm 卸载: 1) 查找欲卸载的软件包 rpm -qa | grep  ...

  9. 软件安装:原始码与 Tarball

    本章主要介绍的就是那些 使用 gcc makefile 等等编辑 C 语言 Tarball  就是利用 tar打包, gzip 或  bzip2 压缩,所以 tarball 档案一般的扩展名就写成 * ...

最新文章

  1. VASP载流子有效质量计算
  2. 《强化学习周刊》第14期:元强化学习的最新研究与应用
  3. 任意的android程序,Android任意位置获取应用Context
  4. python对文件的读操作有哪些方法-Python之文件操作:文件的读写
  5. C# webbrowser控件点击页面按钮
  6. python 人工智能课程大纲_《人工智能》教学大纲
  7. 利用kinect检测任意平面
  8. python list map成员排序_python – 同时对多个列表进行排序
  9. Fiori Launchpad Tile点击后跳转的调试技巧
  10. 10W人都想知道的答案!可视化黑科技,这4个数据工具谁最厉害的?
  11. Linux强行取消挂载
  12. C#中的高级测试驱动开发
  13. 生日祝福html_更新,礼包选择,头像框及太子生日金币活动
  14. 关于修复Office图标白色的问题
  15. win10专业版激活工具很不错!
  16. 谷歌java模板_如何创建Google表格模板
  17. 大型桥梁结构健康监测系统之GNSS位移监测系统
  18. How to tame java GC pauses? Surviving 16GiB heap and greater
  19. 加密流量分类-论文1:Deep Learning for Encrypted Traffic Classification: An Overview
  20. 前端技能树,面试复习第 19 天—— React 基础一点通

热门文章

  1. startservice方式启动服务
  2. c语言链表缓冲区,求助! 链表和scanf()缓冲区问题
  3. java万年历计算法定节假日,java获取中国节假日
  4. 专业网络推广浅析蜘蛛对网站有抓取但没收录的现象
  5. 网络营销激烈竞争下,网站被黑了怎么办?
  6. 浅析网站建设的基本原则
  7. 浅析网站开发的未来前景如何?
  8. 具备这四点品质的建站系统就爱了吧!
  9. 不利于网站优化的操作有哪些?
  10. kibana智能检索发送多次_msearch —— 配置index pattern,同时设置时间段,就知道到底是在哪些索引里去查找数据了...